侧栏导航

KCP快在哪


KCP快在哪?

KCP是skywind3000的作品, 是一个快速可靠网络传输协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果 , 通常 over udp.

本文对比测试TCPKCP over udp在某些应用场景下的rtt指标来分析一下到底快在哪

rtt: round trip time,数据包往返时间

测试工具

  1. clumsy0.2模拟丢包和延迟
  2. AndroidStudio 3.0 adb logcat 查看rtt日志
  3. 魅族MX5 Flyme6.3.0.0A(Android5.1)
  4. 测试程序 TcpRttClient.java& KcpRttClient.java(https://gitee.com/geliang/Umsp-netty)

测试场景

客户端每隔20毫秒通过Wifi网路给服务器发送一个208字节的数据包 , 连续发送300次 ,发送完后再计算rtt的平均值(rtt之和/300)

同时使用clumsy0.2 在服务端模拟网卡 收包丢包(outboun)+收包延迟 ,

上述场景每种场景进行3轮测试 ,再一次取平均值得到最终结果.

rtt计算方法:

client发送的数据包中携带发送时本地的时间戳 , 服务器原样返回给client , 客户端收到后即可计算出rtt

kcp 参数:

nodelay:true //同tcp nodelay
update interval: 20 //模拟广域网延迟.最小可以设置为2
fast resend: 2 //2次ACK跨越将会直接重传
nocwnd :true //关闭

tcp 参数:

tcp nodelay:true //是否不等待其他小包合大包后再发送

(wifi到局域网的rtt大概 2-20 ms)

丢包

仅模拟收包丢包,丢包率 2%/5%/10%

丢包率 KCP TCP
2% (14+12+13)/3 = 13 (64+39+56)/3 = 53
5% (12+11+13)/3 = 12 (59+143+146)/3 = 116
10% (12+78+11)/3 = 34 (165+192+198)/3 =185

延迟

仅模拟收包延迟, 延迟 10/50/200 ms

延迟 KCP TCP
10ms (28+28+27)/3 = 28 (63+27+28)/3 = 39
50ms (68+68+69)/3 = 69 (67+68+68)/3 = 68
200ms (216+216+216)/3 = 216 (225+223+270)/3 =239

延迟+丢包

同时模拟收包延迟和收包丢包

  • 10ms+2%
  • 50ms+5%
  • 200ms+5%
丢包率+延迟 KCP TCP
10ms+2% (30+31+29)/3 = 30 (152+124+52)/3 = 109
50ms+5% (80+81+82)/3 = 81 (134+198+146)/3 = 159
200ms+5% (286+280+325)/3 = 297 (523+413+401)/3 = 446

结论

数字可能不大直观 , 上一个gif图

GIF

上图中在正常有线网络下, tcp和rtt表现旗鼓相当,

当模拟丢包率为5%, tcp的rtt一路飙升(超过360ms) rtt1 当网络恢复时,tcp的rtt出乎预料的恢复得也很快rtt2

结合kcp 快速重传,1.5倍rto,UNA冗余特性,kcp:

  1. 在丢包的场景下rtt表现会大幅优于tcp ,
  2. 物理距离较大,但网络畅通不丢包的场景下两者差异较小

相比tcp,kcp适合应用在 赛车,即时策略,格斗竞技,FPS,MOBA等即时联网游戏 , 音视频通话 , 云游戏等对网络抖动敏感,丢包严重的场景 .

上述测试场景有限, 最终效果还是得看实际应用,亲身感受, 有兴趣的可以体验kcp在手游中应用 .

手游版本的泡泡堂体验地址: ../Game/BombBoy

是否还能更快

KCP应用多种技巧来优化丢包带来的损失, 效果非常可观, 除此之外,想要更快,可以考虑在传输过程中增加冗余信息,使用收到的包恢复丢失的包

FEC(Forward Error Correction,前向错误纠正 )

具体实现可以参考reed solomon或者QUIC的实现, 举个例子: 使用异或(^)对前后的数据计算形成一个FEC包,单独发送.

packet send: p1,p2,p3,p4
packet actually sent: p1, p2, p3, p4, fec(fec=p1 xor p2 xor p3 xor p4)
//异或xor俗称不进位加法,已知3个已知数和4个数之和,求第4个未知数

杂谈

tcp虽然慢,但也有优势, 能更好的利用带宽,并且对整个互联网是友好的.

kcp由于默认关闭流控,在网络不好(中间链路太忙,buffer不够导致丢包)的情况下会导致整体网络状况更甚. 但这并不是kcp的问题,而是使用者的问题.

tcp由于是传输层协议,改动升级过程非常非常慢,kcp由于实现在应用层,优化成本低,是一个好东西 , 有更好的前景.

google公司也有类似想法并产生了一个应用层协议QUIC(最新名字自叫Http3).

最后更新于 10th May 2019
微信二维码
在微信上关注我