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

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 的对比

维度KCPTCP
延迟低(快速重传 + 非延迟 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 可靠传输实现。

滚动至顶部