xtaci / kcp-go

A Crypto-Secure Reliable-UDP Library for golang with FEC
MIT License
4.12k stars 737 forks source link

对比TCP/QUIC/KCP的测试结果 #204

Closed adwpc closed 3 years ago

adwpc commented 3 years ago

做了一下测试: 高延迟下发送大于MTU的数据,效果不理想,希望指导下是哪里出了问题,感谢 :)

1 测试结果

丢包 延迟 数据量 测试结果(latency)
10%-20% 0ms 1B或1000B(<MTU) kcp-go<quic-go<tcp
任意 >50ms 5000B(>MTU) quic-go<tcp<kcp-go

重点是:在高延迟网络,发送超过MTU的数据,latency增大很多。 这个场景很常见,比如使用kcp代理下载一个5KB图片 image

2 测试场景

参考:https://github.com/skywind3000/kcp/issues/202#issuecomment-490797457 在不同丢包+延迟+数据量情况下,测试latency分布,做成散点图(x轴是latency,y轴是低于x轴的点分布的百分比) 比如x=400 y=60%,表示:有60%的latency,小于400ms 波形越靠近左上角表明效果越好,表示更高百分比的点分布在更低的区间

3 kcp设置

{
    "streammode":true,      流模式
    "key": "PASSWORD",      密钥
    "crypt": "aes-128",     加密方法
    "mode": "fast3",        注意:极速模式3,参考下一个表格,会覆盖下边的四个参数,这个需要注意!!!!!!
    "mtu": 1400,            包mtu,超过会拆包
    "sndwnd": 1024,         发送窗口
    "rcvwnd": 1024,         接收窗口
    "datashard": 10,        凑齐多少个包,开启生成冗余包
    "parityshard":3,        冗余包生成多少个
    "dscp": 46,             QOS标记,先不管
    "nocomp": true,         不压缩
    "acknodelay": false,    延迟ack
    "nodelay": 1,           开启nodelay,RTO=RTO+0.5RTO,否则RTO=RTO+RTO, 极速模式3场景下 值设为1
    "interval": 40,         内部轮训周期,多久处理一批包,极速模式3场景下 值设为10
    "resend": 2,            快速重传,2次ACK跨越将会直接重传,极速模式3场景下 值设为2
    "nc": 1,                不开拥塞控制,即不退让,只受收发窗口控制,cwnd=min(snd_wnd,rmt_wnd),极速模式3场景下 值设为1
    "sockbuf": 4096,        socket缓冲区
    "tcp": false            不使用tcp传输
}
adwpc commented 3 years ago

image 更新: KCP在 “延迟10ms,丢包0%,发送5KB,接收500KB的场景” 下的latency,恶化比较严重。 目前观察到服务端,收到500K,然后往回发,这两步之间间隔时间较长

使用工具模拟延迟10ms: comcast --device=lo0 --latency=5(上下行各延迟5ms)

adwpc commented 3 years ago

更新:通过设置读写buffer改善了,kcp确实在丢包+延迟+不限带宽场景下,能够显著降低latency