计算机网络-KCP协议

什么是KCP协议

首先看看官网的介绍:

1
2
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据的发送方式,以 callback的方式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。

简而言之,KCP不像TCP那样大公无私,它只会保证自己的传输速率,不管整个网络的拥塞情况。

TCP的特点是可靠传输(累积确认、超时重传、选择确认)、流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)。KCP对这些参数都可配,且不需要建立/关闭连接的过程。

技术特性

RTO不翻倍

RTO(Retransmission-TimeOut)即超时重传时间,TCP是基于ARQ协议实现的可靠性,KCP也是。但TCP的超时计算是RTO*2,而KCP则是RTO*1.5

也就是说,当TCP连续丢包三次时,就会超时重传时间就会变成RTO*8,而KCP则是RTO*3.75,意味着可以更快的重新传输数据。

选择性重传

TCP中实现的是连续ARQ协议,再配合累计确认重传数据,重传时需要将最小序号丢失的以后所有的数据都要重传,而KCP则只重传真正丢失的数据。

快速重传

TCP相同,都是通过累计确认实现。当发送端发送了1,2,3,4,5这5个包,而远端收到ACK1,3,4,5,当收到ACK=3时,KCP就知道2这个包被跳过了一次,当再收到ACK=4时,就知道2被跳过了两次,此时认为2已经丢失,不等超时直接重传,大大改善了丢包时的传输速度。

非延迟ACK

TCP在连续ARQ协议中,不会将一连串的每个数据都响应一次,而是延迟发送ACK,目的是为了充分利用带宽,但是这样会计算出较大的RTT(Round-Trip Time)往返时间,延长了丢包时的判断过程,而KCPACK是否延迟发送可以调节。

UNA+ACK

ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)ACK(该编号包已收到)KCP有单独ACK,且数据包和ACK包都带UNA信息,有效降低ACK丢失成本。

非退让流控

KCP正常模式同TCP一样使用公平退让法则。发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。

但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了流畅传输的效果。