Closed jaycelq closed 4 years ago
连接层自己探测 mtu,kcp 不负责探测,不过一般你设置个 1300 就可以了。
连接层自己探测 mtu,kcp 不负责探测,不过一般你设置个 1300 就可以了。
不太理解的是为什么ip层的分片似乎失效了
那你要看你的网络库是怎么写的了。
那你要看你的网络库是怎么写的了。
我有一批用户在韩国,他们的android手机在4G网络下会出现大于1385字节无法收到包的情况,在wifi下是没有问题的,因为没法拿到现场,我让用户用android的pingTools来测试,发现无论是否设置要不要分片( "Do not set DF flag(dont)", "Prohibit fragmentation(do)" "Do PMTU discovery"),一旦ping size大于1385,ping就不会成功,但是在wifi下应用和ping是可以正常工作的。
我用自己的手机在无法复现这样的情况,用大于2000自己的包来ping,只要设置了Do not set DF flag,就可以ping通。
我自己测试下来和我的网络库关系不是特别大,我在两台linux机器上(mtu 1500)直接用我们的网络库发送3000字节的包,client也是可以正常收到的。我们的服务器设置的是“Do not set DF”不禁止分片,客户端网络库里没有设置允许和禁止分片的代码,而且就算客户端禁止分片,也不应该收不到服务器的包,所以有些没有头绪,只能猜测和他的手机操作系统以及4G链路有关。
想听一下大佬的看法。
那既然网络库没有设置 DF 标志的话,就不关网络库的事情了,就是中间的路由节点强行设置了该标志呗。我建议你直接设置成 1300,或者保险点 1200,LOL 设置的是 1024,实在要纠结的话,你可以在你自己的传输层写一个 mtu 探测程序,类似二分法发送不同大小的 DF 分片,探测真实 MTU。
但是显然,这不关 kcp 什么事情。
那既然网络库没有设置 DF 标志的话,就不关网络库的事情了,就是中间的路由节点强行设置了该标志呗。我建议你直接设置成 1300,或者保险点 1200,LOL 设置的是 1024,实在要纠结的话,你可以在你自己的传输层写一个 mtu 探测程序,类似二分法发送不同大小的 DF 分片,探测真实 MTU。
但是显然,这不关 kcp 什么事情。
好的,感谢大佬的解答和数据
我们再外网测试的时候遇到部分4G网络的android用户无法收到包,测试后用户的mtu不到1400,可能在1380左右,而且一旦udp的包达到1400个字节,客户端就完全收不到了,照理说udp的包应该会在ip层进行分片的,请教大神和各位大佬,在项目中是怎么处理mtu的,有没有遇到过udp超过mtu的包被全部丢到的情况。 @skywind3000