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)
参考
- https://www.cnblogs.com/yuanyifei1/p/6846310.html
- 有协议图 https://zhuanlan.zhihu.com/p/112442341
- TCP RTO与RTT https://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/
- 流程分析有流程图 https://www.cnblogs.com/wetest/p/9190786.html
- 流程分析有图,有字段详解 https://blog.csdn.net/yongkai0214/article/details/85156452