KCP – 基于UDP的可靠传输协议

KCP:基于 UDP 的可靠传输协议封面

KCP 是 skywind3000 用 C 实现的应用层可靠传输协议:跑在 UDP 之上,通过改造重传与流控机制,用少量带宽换大幅降低延迟。它适合对实时性敏感、又要可靠传输的场景——游戏、直播、弱网加速。

核心特性

1. 快速重传

丢包不必等超时。KCP 统计连续 ACK 跳过的次数,收到足够多的冗余 ACK 就立即重传;TCP 走超时重传,RTO 指数退避,丢一次包要等很久。

KCP 快速重传:冗余 ACK 触发重传示意
图 1:接收端连续回冗余 ACK,发送端立即重传丢失的包,不等 RTO 超时

2. 选择性重传

TCP 丢包时常把后续数据一起重传;KCP 靠 sn 序列号定位,只重传真正丢失的包。接收端用滑动窗口 + 序号(sn/una)完成有序重组。

3. 非延迟 ACK

TCP 为吞吐量会延迟 ACK,RTT 估计滞后;KCP 允许立即回 ACK,丢包判断更快。

4. 混合流控

默认模式带拥塞控制(类似 TCP 的慢启动与退让,保证网络公平);实时性优先时可以关闭拥塞控制,发送速度交给业务控制。

协议结构

conv  会话标识符(保证双方通信一致)
cmd   指令类型(ACK / 数据推送等)
sn    序列号(排序与重传定位)
una   未确认的最小序号
wnd   接收窗口大小(流控)

KCP 只定义可靠传输层,不负责 UDP 收发——底层 socket、NAT 穿透都要自己实现,或直接用现成库。

与 TCP 的对比

维度KCPTCP
延迟低(快速重传 + 非延迟 ACK)高(超时重传 + 延迟 ACK)
带宽效率较低(冗余 ACK 等开销)高(拥塞控制优化)
适用场景实时游戏、直播、弱网文件传输、网页、通用可靠传输
复杂度需自处理 UDP/NAT、自定义流控系统内置开箱即用

经验数据:KCP 通常比 TCP 多消耗 10%–20% 带宽,但平均延迟降低 30%–40%,最大延迟改善可达 3 倍。

参数调优

kcp-go 的 NoDelay 四个参数分别控制:是否立即发送、刷新间隔、快速重传阈值、是否拥塞控制:

// kcp-go 示例(github.com/xtaci/kcp-go)
kcp.NoDelay(1,      // nodelay=1:启用快速模式,立即发送
            10,     // interval=10ms:刷新间隔(默认20ms)
            2,      // resend=2:连续 2 个冗余 ACK 触发快速重传
            1)      // nc=1:关闭流控,实时性优先
kcp.NoDelay 四参数:延迟与带宽的旋钮
图 2:NoDelay 四参数是延迟与带宽的旋钮,游戏场景全开、文件传输用默认

游戏场景通常全开(低延迟优先),文件传输用默认值(带宽优先)。

进阶:FEC 前向纠错

用 Reed-Solomon 编码给数据加冗余包,接收端丢了包也能直接恢复,减少重传往返。高丢包弱网下提升明显,代价是带宽进一步增加。kcp-go 已内置 FEC 支持。

应用场景与开源实现

  • 实时游戏:MOBA/FPS 的操作同步(延迟敏感,帧同步常用 KCP);
  • 直播互动、弱网环境下的稳定传输;
  • 网络加速类工具(跨国线路优化)。

Go 生态首选 github.com/xtaci/kcp-go:加密(AES/Salsa20)、FEC、会话管理都内置,是成熟的 UDP 可靠传输实现。

滚动至顶部