本文主要是介绍记一次网络MTU过大导致send失败的问题排查过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述:在一个CS架构环境下,客户端send接口发送总是失败,导致客户端不断的主动断开又重连。
分析过程:
- 在客户端抓发往服务器的数据包。发现,连着发送几个数据包后,服务器都没有给确认,导致客户端认为对方接受窗口已满,从而发包失败。导致这个现象可以有几个原因:1. 客户端数据包没有发送到服务。2. 服务器收到数据,但出现问题没能及时回复确认。3. 服务器回复了确认,但客户端没能收到确认包。
- 进一步排查,在服务器抓包。发现,服务器能够抓到连接建立的包,之后的包都收不到。那么问题就在于客户端连接建立后发送的数据包没能成功发送到服务器,而是在网络中的某一环境丢了。对比服务能收到的和收不到的包的差异,发现收不到的包都远远大于能够收到的包。
- 据此,就怀疑客户端MTU的限制。随后,发现客户端网口的MTU人为设置为9200了。通常网络上一般约定MTU为1500,大部分路由器和交换机都支持的。对于超大的数据包,若路由交换设备支持分包则进行分包,若不支持则直接丢弃。至此,问题的原因找到了。至于为什么会有超大的包,是应用层一次调用send发送的数据量很大。
总结反思:很简单的一个网络问题,要明白网络的本质是不可靠的,所有对于网络问题都要从两端同时抓包。
这篇关于记一次网络MTU过大导致send失败的问题排查过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!