KCP协议

标签: 代理 shadowsocks

KCP 设计初衷

KCP主要目的是在保证低延迟的情况下尽力提高传输量。它比TCP浪费10~20%带宽的代价下降低30~40%延迟,最大降低3倍延迟。

用小白的话讲:KCP协议能够在网络比较拥塞(弱网)的情况下取得低延迟和大带宽的效果。一个直观的感受是在科学上网的时候一台很烂的VPS(非CN2,非内核算法优化)的情况下流畅播放1080P。

KCP特性

1. RTO时间

TCP的超时计算为RTO*2, 如果连续丢包3次超时时间就变成RTO*8, 但KCP为RTO*1.5,也可以调节。这样保证了丢包情况下能快速重传。

——降低延迟

2. 选择性重传

TCP使用UNA(unacknowledgeed)确定在之前的全部包都收到,如果发生丢包,那么会重传丢包之后的全部数据。这无疑加重了网络负担。

KCP通过融合使用UNA和每包ACK,只传输确定丢失的包。

——降低网络负载,间接降低延迟

3. 快速重传机制

发送端发送了标号为1、2、3、4、5的包,然后收到远端的ACK为1、3、4、5。当发送端收到ACK3的时候知道2被跳过1次,收到ACK4的时候知道2被跳过2次,此时立刻重新传输包2无需等待。

——改善了延迟

4. 非延迟ACK

TCP为了充分利用带宽,延迟发送ACK,加大了RTT时间,,延长了丢包判断过程。

KCP的ACP是否延迟和延迟时间是可调节的,设置可以为 NODELAY。

5. UNA+ACK

ARQ 模型有2种:UNA(此编号前所有包都收到),和ACK(该编号已经收到)。单独使用UNA导致全部重传,单独用ACK导致确认成本太高。KCP协议则对每个包有单独的ACK,并且每个包也都有UNA信息。

6. 非退让流控

正常情况下协议会考虑:发送窗口大小、接收窗口剩余大小、丢包退让、慢启动决定。而KCP则可以以比较自私的完全不考虑丢包退让和慢启动。

KCP不能解决的问题

当然还是不能突破你家带宽的QoS,不过也是有办法的。

名词

  • RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;
  • RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。 RTT和RTO 的关系是:由于网络波动的不确定性,每个RTT都是动态变化的,所以RTO也应随着RTT动态变化。
  • 传输层的数据叫作段(segment)
  • 网络层的数据叫作包(packet)
  • 数据链路层的数据叫作帧(frame)
  • 物理层的数据叫作流(stream)

参考

build:   __BUILD_VERSION__