可靠性传输协议对比
1 测试场景设计
参考:https://github.com/skywind3000/kcp/issues/202#issuecomment-490797457
使用工具模拟弱网,使用本机作为客户端,本机作为服务端,使用本机 loopback 网 卡,测试不同弱网场景下的 latency。
什么叫 latency?
客户端发送数据,大小可以超过MTU,此时记录时间 t1,服务端收到并完整返回,客户端收到完整数据,此时记录时间 t2,t2-t1=latency
(rtt 一般指的是 ping 测试,是 icmp 包,这里 latency 是真实的 udp/tcp 包,不是 icmp 包,也不限制一个MTU)
为什么对比 latency?
因为 kcp 是为 latency 设计的,并不是为吞吐量设计的,应用场景是降低弱网下的 latency。
为什么用本机测试?
因为本机测试最方便准确。如果用wifi模拟,会存在抖动问题:其他人抢占,物理位置,干扰。
2 测试弱网设计
丢包+延迟表格
丢包/延迟 10ms 50ms …
0% .. ..
5% .. ..
这样得到几十种不同的组合,针对每种组合,分别测试三种协议发送 1B 和 5KB 数据 时的 latency 分布,绘制一张 latency 分布的表格
3 测试结果说明
横坐标是 latency,纵坐标是该协议有百分之多少的样本小于等于横坐标代表的值 线条波形,越接近左上⻆越好,说明该协议的 latency,相比其他协议,大部分情况 (y 轴的值)都落在了低延迟区间(x 轴的值)
比如:110ms 对应 80%,那么就是 80% 的 latency 在 110ms 内,说明该协议降 latency 效果好
4 测试工具说明
弱网模拟工具:
https://github.com/tylertreat/comcast
示例:
comcast --device=lo0 --latency=250 --target-bw=1000 --packet-loss=10%
注意丢包上下行是单独算的,比如 10% 指上行 10%+ 下行 10%,这样其实是 20%
latency 测试工具:
命令: 服务端
./ethr -s -p kcp -port 443
-s 表示服务器
-p 监听协议,kcp 表示同时监听 tcp 和 kcp,quic 表示只监听 quic 客户端
./ethr -c 127.0.0.1 -port 443 -d 30s -t l -i 200 --debug -l 5000 -p tcp
-t 测试类型 l延迟 b带宽
-d 测试时⻓
-p 测试协议
-i 测试 latency 来回的总次数,做平均处理。如果无法显示结果,降低这个值。
-l 测试包大小,即模拟每次发送多大的数据,大于 mtu,各协议内部会拆包 5 测试方法说明
Comcast 设置好弱网,注意上下行各设置一半 设置好 kcp 参数,在 kcp.json 中
启动服务端 ethr
启动客户端 ethr 产出结果来自客户端控制台打印信息
5 测试结果汇总
测试结结果汇总到 excel 中,然后使用带直线和数据标记的散点图绘制图表,这个如 果不熟悉需要搜一下,需要手动给图标选择数据。
只要做好一个 excel 模版,然后复制,接下来就是复制客户端的打印信息,黏贴到表 格中对应的行即可,散点图会自动更新。
效果展示图如下
弱网条件:
ping测试数据
100 packets transmitted, 91 packets received, 9.0% packet loss round-trip min/avg/max/stddev = 2.967/15.264/139.070/21.717 ms
![](https://pic4.zhimg.com/80/v2-5ef8866f82773ede7be6284ef0885843_720w.jpg)