KCP

定义

KCP是一个快速可靠协议, 能以比TCP浪费10%-20%的带宽的代价, 换取平均延迟降低30%-40%, 且最大延迟降低三倍的效果. 纯算法实现, 不负责底层协议的手法, 需要使用者自己定义下层数据包的发送方式, 用callback的方式提供给KCP.

技术特性

TCP是面相流量设计的, 即每秒可以传输多少数据, 是为了充分利用带宽. KCP是面相流速设计的, 即从一端到另一端的时间. 可以通过以下策略达到提高流速的效果:

  1. RTO不翻倍

    TCP超时计算是RTO*2, 如果连续丢包就会增长过快. KCP启动快速模式后只增长1.5.

  2. 选择性重传

    TCP丢包后会重传从丢的包开始往后的所有数据, KCP是选择性重传, 只传丢失的包.

  3. 快速重传

    发送端发送1, 2, 3, 4, 5, 然后收到ACK: 1, 3, 4, 5, 那么当收到ACK4的时候就知道2被跳过了两次, 不必等待超时, 直接重传2.

  4. 延迟ACK

    TCP为了充分利用带宽, 延迟发送ACK, 这样会计算出较大的RTT, 延长了丢包的判断过程. KCP可以选择是否采用延迟ACK.

  5. UNA

    ARQ模型有两种, UNA(此编号前所有包都收到, 如TCP)和ACK(此编号包收到), 光用UNA会导致全部重传, 光用ACK会导致成本过高. KCP中, 除去单独的ACK包, 所有包都采用UNA.

  6. 非退让流量控制

    KCP正常模式和TCP一样用公平退让法则, 即发送窗口的大小由: 发送缓存大小, 接收端剩余接收缓存大小, 丢包退让以及慢启动的要素决定. 但传送及时性要求很高的小数据时, 可以只通过前两项来控制发送窗口大小. 牺牲了公平性和带宽利用率, 来换取及时性.