KCP 是什么
KCP 是一个基于 UDP 的可靠传输协议(作者 skywind3000,不是内核协议,而是应用层实现),通过改造重传与流控机制,在牺牲少量带宽换取大幅降低延迟。适合对实时性敏感、但又要可靠传输的场景——游戏、直播、弱网加速。
核心特性
1. 快速重传
检测到丢包时不必等超时:KCP 统计连续 ACK 跳过的次数(如收到 3 次冗余 ACK)立即重传。而 TCP 的超时重传 RTO 采用”翻倍退避”,丢包一次要等较久。KCP 的重传更快、延迟更低。
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 示例(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 可靠传输实现。
