skywind3000 / kcp

:zap: KCP - A Fast and Reliable ARQ Protocol
MIT License
15.33k stars 2.5k forks source link

udp无法收到超过mtu的包 #259

Closed jaycelq closed 4 years ago

jaycelq commented 4 years ago

我们再外网测试的时候遇到部分4G网络的android用户无法收到包,测试后用户的mtu不到1400,可能在1380左右,而且一旦udp的包达到1400个字节,客户端就完全收不到了,照理说udp的包应该会在ip层进行分片的,请教大神和各位大佬,在项目中是怎么处理mtu的,有没有遇到过udp超过mtu的包被全部丢到的情况。 @skywind3000

skywind3000 commented 4 years ago

连接层自己探测 mtu,kcp 不负责探测,不过一般你设置个 1300 就可以了。

jaycelq commented 4 years ago

连接层自己探测 mtu,kcp 不负责探测,不过一般你设置个 1300 就可以了。

不太理解的是为什么ip层的分片似乎失效了

skywind3000 commented 4 years ago

那你要看你的网络库是怎么写的了。

jaycelq commented 4 years ago

那你要看你的网络库是怎么写的了。

我有一批用户在韩国,他们的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链路有关。

想听一下大佬的看法。

skywind3000 commented 4 years ago

那既然网络库没有设置 DF 标志的话,就不关网络库的事情了,就是中间的路由节点强行设置了该标志呗。我建议你直接设置成 1300,或者保险点 1200,LOL 设置的是 1024,实在要纠结的话,你可以在你自己的传输层写一个 mtu 探测程序,类似二分法发送不同大小的 DF 分片,探测真实 MTU。

但是显然,这不关 kcp 什么事情。

jaycelq commented 4 years ago

那既然网络库没有设置 DF 标志的话,就不关网络库的事情了,就是中间的路由节点强行设置了该标志呗。我建议你直接设置成 1300,或者保险点 1200,LOL 设置的是 1024,实在要纠结的话,你可以在你自己的传输层写一个 mtu 探测程序,类似二分法发送不同大小的 DF 分片,探测真实 MTU。

但是显然,这不关 kcp 什么事情。

好的,感谢大佬的解答和数据