
kcp-go 是面向 Go 语言 的 可靠 UDP (Reliable-UDP) 库,专注在不可靠网络之上提供低时延、稳健的流式传输能力。
它在 UDP 之上构建出具备 平滑性、弹性、有序性、错误检测与匿名性 的数据通道。凭借开源项目 kcptun 的大规模部署验证,从低端 MIPS 路由器到高性能服务器,已有数以百万计的设备在 在线游戏、直播、文件同步、网络加速 等场景中运行 kcp-go。
有关完整文档,请参阅关联的 Godoc。

下面几条原则支撑了 kcp-go 的性能与可靠性取舍:
kcp.flush() 每隔 20 毫秒都会扫描发送队列,确认是否需要触发重传。
我们对顺序遍历 slice 与 链表 的成本做了基准测试(代码见 这里):
BenchmarkLoopSlice-4 2000000000 0.39 ns/op
BenchmarkLoopList-4 100000000 54.6 ns/op
链表节点分散在内存中,极易出现 cache miss;slice 则具备更好的 局部性 (locality)。以 5,000 条连接、窗口 32、间隔 20 毫秒为例:
kcp.flush() 仅消耗 6 微秒(约 0.03% CPU)。因此,发送缓冲区必须使用 slice,而非链表。
RTT 估算离不开精准计时;误差一大,KCP 就会发生无谓的重传。然而调用 time.Now() 本身要消耗约 42 个 CPU 周期(4 GHz CPU 上约 10.5 ns,在 2.7 GHz MacBook Pro 上约 15.6 ns)。
time.Now() 的基准测试详见 这里:
BenchmarkNow-4 100000000 15.6 ns/op
kcp-go 通过缓存“当前时间”降低调用频次:kcp.output() 每次返回前更新一次时间戳,单次 kcp.flush() 内只读取一次系统时间。以 5,000 条连接为例,固定成本约为 5000 × 15.6 ns = 78 μs。若吞吐达到 10 MB/s(MTU 1400),kcp.output() 每秒被调用约 7,500 次,time.Now() 的额外开销仅 117 μs。
核心分配来自全局缓冲池 xmit.Buf。当需要新的缓冲区时,直接从池中取出固定容量(1500 字节,即 mtuLimit)的切片;RX、TX 以及 FEC 队列都共用这一池子,用完立即归还,避免重复清零。这样既能维持活跃对象的高水位线,确保传输过程不会频繁触发 GC,又能在空闲期把内存退回运行时。
kcp-go 内置多种块加密算法,并统一运行在 CFB 模式 下。每个数据包都会先对取自 系统熵 的 nonce 进行加密,再进入正文加密流程,即便明文相同也不会生成重复密文。
密文覆盖了所有报文字段(FEC/KCP 头、校验和、载荷),从而实现真正的匿名传输。务必注意:一旦关闭底层加密,即使上层还有 TLS/HTTPS加密,头部仍会裸露,攻击者可以通过篡改 滑动窗口、RTT、FEC 参数 或 校验和 来破坏会话。推荐至少启用 AES-128加密——借助现代 CPU 的 AES-NI 指令,它的性能甚至优于 salsa20(详见基准表)。
kcp-go 仍需警惕的攻击面包括:
总之,kcp-go 的加密设计目标在于防止篡改,而非抵御主动攻击。对于高安全性诉求的场景,务必在应用层叠加成熟的加密与认证机制。
snd_wnd 下瞬时把大量数据塞进内核、引爆拥塞,用户态实现了 Pacing。虽然实现难度高,但 echo 测试已能稳定在 100 MB/s 以上。snd_buf 使用 ringbuffer 来保持 cache coherency,队列越短,遍历成本越低。高速网络中应根据 BDP 适当减小 buffer,避免结构本身成为延迟源。需注意:当前 KCP 的 RTO 计算为 O(n),若想降到 O(1) 必须重构。归根结底,传输系统里没有什么比“时钟”更重要。
postProcess/packetInput 链路,生成与消费冗余分片都在同一条流水线上完成,不额外拉起 goroutine,也没有锁竞争。KCP.Input,乱序与重传风暴由此大幅收敛。下图展示了完整帧格式,便于与 Wireshark 等工具对照:

NONCE:
16bytes cryptographically secure random number, nonce changes for every packet.
CRC32:
CRC-32 checksum of data using the IEEE polynomial
FEC TYPE:
typeData = 0xF1
typeParity = 0xF2
FEC SEQID:
monotonically increasing in range: [0, (0xffffffff/shardSize) * shardSize - 1]
SIZE:
The size of KCP frame plus 2
KCP Header
+------------------------------+
| conv (u32) |
+-------+-------+--------------+
| cmd | frag | wnd |
| u8 | u8 | u16 |
+------------------------------+
| ts (u32) |
+------------------------------+
| sn (u32) |
+------------------------------+
| una (u32) |
+------------------------------+
| data (bytes) |
+------------------------------+
以下为不同平台的基准测试,包含加密、FEC、echo 等典型场景,方便横向对比:
2025/11/26 11:12:51 beginning tests, encryption:salsa20, fec:10/3
goos: linux
goarch: amd64
pkg: github.com/xtaci/kcp-go/v5
cpu: AMD Ryzen 9 5950X 16-Core Processor
BenchmarkSM4
BenchmarkSM4-32 56077 21672 ns/op 138.43 MB/s 0 B/op 0 allocs/op
BenchmarkAES128
BenchmarkAES128-32 525854 2228 ns/op 1346.69 MB/s 0 B/op 0 allocs/op
BenchmarkAES192
BenchmarkAES192-32 473692 2429 ns/op 1234.95 MB/s 0 B/op 0 allocs/op
BenchmarkAES256
BenchmarkAES256-32 427497 2725 ns/op 1101.06 MB/s 0 B/op 0 allocs/op
BenchmarkTEA
BenchmarkTEA-32 149976 8085 ns/op 371.06 MB/s 0 B/op 0 allocs/op
BenchmarkXOR
BenchmarkXOR-32 12333190 92.35 ns/op 32485.16 MB/s 0 B/op 0 allocs/op
BenchmarkBlowfish
BenchmarkBlowfish-32 70762 16983 ns/op 176.65 MB/s 0 B/op 0 allocs/op
BenchmarkNone
BenchmarkNone-32 47325206 24.49 ns/op 122482.39 MB/s 0 B/op 0 allocs/op
BenchmarkCast5
BenchmarkCast5-32 66837 18035 ns/op 166.35 MB/s 0 B/op 0 allocs/op
Benchmark3DES
Benchmark3DES-32 18402 64349 ns/op 46.62 MB/s 0 B/op 0 allocs/op
BenchmarkTwofish
BenchmarkTwofish-32 56440 21380 ns/op 140.32 MB/s 0 B/op 0 allocs/op
BenchmarkXTEA
BenchmarkXTEA-32 45616 26124 ns/op 114.84 MB/s 0 B/op 0 allocs/op
BenchmarkSalsa20
BenchmarkSalsa20-32 525685 2199 ns/op 1363.97 MB/s 0 B/op 0 allocs/op
BenchmarkCRC32
BenchmarkCRC32-32 19418395 59.05 ns/op 17341.83 MB/s
BenchmarkCsprngSystem
BenchmarkCsprngSystem-32 2912889 404.3 ns/op 39.58 MB/s
BenchmarkCsprngMD5
BenchmarkCsprngMD5-32 15063580 79.23 ns/op 201.95 MB/s
BenchmarkCsprngSHA1
BenchmarkCsprngSHA1-32 20186407 60.04 ns/op 333.08 MB/s
BenchmarkCsprngNonceMD5
BenchmarkCsprngNonceMD5-32 13863704 85.11 ns/op 187.98 MB/s
BenchmarkCsprngNonceAES128
BenchmarkCsprngNonceAES128-32 97239751 12.56 ns/op 1274.09 MB/s
BenchmarkFECDecode
BenchmarkFECDecode-32 1808791 679.1 ns/op 2208.94 MB/s 1641 B/op 3 allocs/op
BenchmarkFECEncode
BenchmarkFECEncode-32 6671982 181.4 ns/op 8270.76 MB/s 2 B/op 0 allocs/op
BenchmarkFlush
BenchmarkFlush-32 322982 3809 ns/op 0 B/op 0 allocs/op
BenchmarkDebugLog
BenchmarkDebugLog-32 1000000000 0.2146 ns/op
BenchmarkEchoSpeed4K
BenchmarkEchoSpeed4K-32 35583 32875 ns/op 124.59 MB/s 18223 B/op 148 allocs/op
BenchmarkEchoSpeed64K
BenchmarkEchoSpeed64K-32 1995 510301 ns/op 128.43 MB/s 284233 B/op 2297 allocs/op
BenchmarkEchoSpeed512K
BenchmarkEchoSpeed512K-32 259 4058131 ns/op 129.19 MB/s 2243058 B/op 18148 allocs/op
BenchmarkEchoSpeed1M
BenchmarkEchoSpeed1M-32 145 8561996 ns/op 122.47 MB/s 4464227 B/op 36009 allocs/op
BenchmarkSinkSpeed4K
BenchmarkSinkSpeed4K-32 194648 42136 ns/op 97.21 MB/s 2073 B/op 50 allocs/op
BenchmarkSinkSpeed64K
BenchmarkSinkSpeed64K-32 10000 113038 ns/op 579.77 MB/s 29242 B/op 741 allocs/op
BenchmarkSinkSpeed256K
BenchmarkSinkSpeed256K-32 1555 843724 ns/op 621.40 MB/s 229558 B/op 5850 allocs/op
BenchmarkSinkSpeed1M
BenchmarkSinkSpeed1M-32 667 1783214 ns/op 588.03 MB/s 462691 B/op 11694 allocs/op
PASS
ok github.com/xtaci/kcp-go/v5 49.978s
Model Name: MacBook Pro Model Identifier: MacBookPro14,1 Processor Name: Intel Core i5 Processor Speed: 3.1 GHz Number of Processors: 1 Total Number of Cores: 2 L2 Cache (per Core): 256 KB L3 Cache: 4 MB Memory: 8 GB ===
$ go test -v -run=^$ -bench . beginning tests, encryption:salsa20, fec:10/3 goos: darwin goarch: amd64 pkg: github.com/xtaci/kcp-go BenchmarkSM4-4 50000 32180 ns/op 93.23 MB/s 0 B/op 0 allocs/op BenchmarkAES128-4 500000 3285 ns/op 913.21 MB/s 0 B/op 0 allocs/op BenchmarkAES192-4 300000 3623 ns/op 827.85 MB/s 0 B/op 0 allocs/op BenchmarkAES256-4 300000 3874 ns/op 774.20 MB/s 0 B/op 0 allocs/op BenchmarkTEA-4 100000 15384 ns/op 195.00 MB/s 0 B/op 0 allocs/op BenchmarkXOR-4 20000000 89.9 ns/op 33372.00 MB/s 0 B/op 0 allocs/op BenchmarkBlowfish-4 50000 26927 ns/op 111.41 MB/s 0 B/op 0 allocs/op BenchmarkNone-4 30000000 45.7 ns/op 65597.94 MB/s 0 B/op 0 allocs/op BenchmarkCast5-4 50000 34258 ns/op 87.57 MB/s 0 B/op 0 allocs/op Benchmark3DES-4 10000 117149 ns/op 25.61 MB/s 0 B/op 0 allocs/op BenchmarkTwofish-4 50000 33538 ns/op 89.45 MB/s 0 B/op 0 allocs/op BenchmarkXTEA-4 30000 45666 ns/op 65.69 MB/s 0 B/op 0 allocs/op BenchmarkSalsa20-4 500000 3308 ns/op 906.76 MB/s 0 B/op 0 allocs/op BenchmarkCRC32-4 20000000 65.2 ns/op 15712.43 MB/s BenchmarkCsprngSystem-4 1000000 1150 ns/op 13.91 MB/s BenchmarkCsprngMD5-4 10000000 145 ns/op 110.26 MB/s BenchmarkCsprngSHA1-4 10000000 158 ns/op 126.54 MB/s BenchmarkCsprngNonceMD5-4 10000000 153 ns/op 104.22 MB/s BenchmarkCsprngNonceAES128-4 100000000 19.1 ns/op 837.81 MB/s BenchmarkFECDecode-4
$ claude mcp add kcp-go \
-- python -m otcore.mcp_server <graph>