
KCP 是 skywind3000 用 C 实现的应用层可靠传输协议:跑在 UDP 之上,通过改造重传与流控机制,用少量带宽换大幅降低延迟。它适合对实时性敏感、又要可靠传输的场景——游戏、直播、弱网加速。
核心特性
1. 快速重传
丢包不必等超时。KCP 统计连续 ACK 跳过的次数,收到足够多的冗余 ACK 就立即重传;TCP 走超时重传,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 的对比
| 维度 | KCP | TCP |
|---|---|---|
| 延迟 | 低(快速重传 + 非延迟 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:关闭流控,实时性优先

游戏场景通常全开(低延迟优先),文件传输用默认值(带宽优先)。
进阶:FEC 前向纠错
用 Reed-Solomon 编码给数据加冗余包,接收端丢了包也能直接恢复,减少重传往返。高丢包弱网下提升明显,代价是带宽进一步增加。kcp-go 已内置 FEC 支持。
应用场景与开源实现
- 实时游戏:MOBA/FPS 的操作同步(延迟敏感,帧同步常用 KCP);
- 直播互动、弱网环境下的稳定传输;
- 网络加速类工具(跨国线路优化)。
Go 生态首选 github.com/xtaci/kcp-go:加密(AES/Salsa20)、FEC、会话管理都内置,是成熟的 UDP 可靠传输实现。


