kcp官网:skywind3000/kcp: ⚡️ KCP - A Fast and Reliable ARQ Protocol (github.com)
1 什么是KCP协议
KCP是一个快速可靠协议,能以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。
这里可以理解为KCP是一个水流更快,但流量略有降低的小溪。
KCP协议是一种基于UDP的可靠传输协议,因此无需建立连接,可以即时发送,而不需要等待确认,同时,它可以根据网络状况自行调整发送速率,更适用于实时通信、在线游戏、流媒体传输等场景。
2 技术特性
2.1 RTO翻倍vs不翻倍
RTO(Retransmission TimeOut) 超时重传
TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,而KCP启动快速模式后不x2,只是x1.5(实验证明1.5这个值相对比较好)。
TCP超时重传的间隔会相差越来越大,而KCP的间隔更合理一点。
由于TCP协议是在内核协议栈中确定的,因此超时翻倍的策略不可更改,而KCP协议是在用户层实现的,可以自行定制重传策略。
2.2 选择性重传 vs 全部重传
TCP默认使用的是累积确认的方式,丢包时会全部重传从丢的那个包开始以后的数据。TCP中也有一个选择确认(SACK)选项,可以只重传丢失的数据。
KCP是选择性重传,只重传真正丢失的数据包,使用快速重传机制。
2.3 延迟ACK vs 非延迟ACK
TCP会采用ACK延迟确认机制,可以对多个TCP包的ACK进行合并。
延迟确认超时计算会算出较大 RTT时间,延长了丢包时的判断过程。
KCP的ACK是否延迟发送可以调节。
2.4 UNA vs ACK+UNA
UNA:Unacknowledged
UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到)
仅用 UNA: 如果只使用 UNA,那么当网络状况不佳时,所有数据包都可能被重传,导致效率低下
仅用 ACK: 如果只使用 ACK,则每次都需要等待确认,而确认过程可能会比较耗时,导致传输延迟
以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息
2.5 非退让流控
KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。
但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。