从新认识KCP

什么是KCP

KCP是一种网络传输协议(A Fast and Reliable ARQ Protocol),能够视它为TCP的代替品,可是它运行于用户空间,它无论底层的发送与接收,只是个纯算法实现可靠传输,它的特色是牺牲带宽来下降延迟。由于TCP协议的大公无私,常常牺牲本身速度来减小网络拥塞,它是从大局上考虑的。而KCP是自私的,它只顾本身的传输效率,从无论整个网络的拥塞状况。举个例子,TCP检测到丢包的时候,首先想到的是网络拥塞了,要放慢本身的速度别让网络更糟,而KCP想到的赶忙重传别耽误事。git

TCP的特色是可靠传输(累积确认、超时重传、选择确认)、流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)、面向链接。KCP对这些参数基本均可配,也没用创建/关闭链接的过程。github

其实KCP并不神秘,由于TCP的高度自治(不少东西都不可配),知足不了现在各类速度需求。而KCP就是基于UDP协议,再将一些TCP经典的机制移植过来,变成参数可配。在这种算法

怎么使用

KCP只有两个文件,分别是ikcp.cikcp.h,代码行数1300左右。使用KCP和使用TCP有些不一样,因此上手以前须要先了解下KCP如何使用,须要时间成本。网络

第一步,就是建立一个kcp实例,至关于一个句柄。socket

ikcpcb* ikcp_create(IUINT32 conv, void *user)

第二步,设置发送数据的接口,底层用哪一种socket都没问题,只要能把数据发送出去,建议使用UDP,比较简单。函数

int output(const char *buf, int len, ikcpcb *kcp, void *user)

第三步,更新KCP状态。KCP运行于用户空间,因此须要手动去更新每一个实例的状态,其实主要就是检测哪些数据包该重传了。学习

void ikcp_update(ikcpcb *kcp, IUINT32 current)

第四步,发送数据。调用ikcp_send以后,KCP最后会使用上面设置的output函数来将发送数据(KCP本身并不关心如何发送数据)。网络传输协议

int ikcp_send(ikcpcb *kcp, const char *buffer, int len)

第五步,预接收数据。先手动预接收数据,而后再调用ikcp_input将裸数据交给KCP,这些数据有多是KCP控制报文,并非咱们要的数据。spa

int ikcp_input(ikcpcb *kcp, const char *data, long size)

第六步,接收数据。此时收到的数据才是真正的数据,重组操做在调用ikcp_recv以前就完成了。code

int ikcp_recv(ikcpcb *kcp, char *buffer, int len)

整体上仍是容易理解的,之前咱们是直接使用各类socket和对端通讯,各类功能由本身控制。如今是在socket之上使用了一个中间件KCP,帮忙实现快速可靠传输功能。注意一下KCP有模式的区分,不一样模式下的速度表现不同,建议把参数配好以后再使用,不然使用的都是默认的参数。

快在哪里

  • 没用使用任何系统调用接口
  • 无需创建/关闭链接(就KCP自己来讲)
  • 不少影响速度的参数均可配

使用场景

丢包率高的网络环境下KCP的优势才会显示出来。若是不丢包,那么TCP和KCP的效率不会差异很大,可能就是少了链接创建/关闭而已。通常来说,在公网上传输的均可以使用,特别是对实时性要求较高的程序,如LOL。

有何缺点

  • 学习成本
  • 听说有些运营商对UDP有限制?
相关文章
相关标签/搜索