我想了解在发送UDP数据包的情况下看到的一些行为.
我有两个小Java程序:一个发送UDP数据包,另一个接收它们.我在两台通过单个交换机连接的计算机之间的网络上在本地运行它们.
两个网络适配器上的MTU设置(由/ sbin / ifconfig报告)为1500.
>如果我发送大小为< 1500,我收到他们.预期.
>如果我发送包1500,尺寸< 24258我收到他们预期.我已经通过wireshark证实IP层正在碎片化.
>如果我发送大小> 24258,他们迷失了.不预期当我在接收端运行wirehark时,我看不到任何这些数据包.
我能够看到与ping -s类似的行为.
ping -s 24258 hostA工作,但是
ping -s 24259 hostA失败.
有没有人明白可能发生的情况,或有什么想法我应该寻找什么?
两台计算机正在运行CentOS 5 64位.我正在使用1.6 JDK,但我并不认为这是一个编程问题,它是一个网络或者是操作系统的问题.
解决方法
IP协议的实现不需要能够处理任意大的数据包.在理论上,最大可能的IP包大小是65,535个八位字节,但标准只要求实现支持至少576个八位字节.
看起来你的主机的实现支持的最大大小远远大于576,但仍然远远小于65,535的最大理论尺寸. (我不认为交换机应该是一个问题,因为它不应该需要进行任何碎片整理 – 它甚至不在IP层操作).
IP标准还建议主机不发送大于576字节的数据包,除非确定接收主机可以处理较大的数据包大小.您应该考虑是否更好地为您的程序发送较小的数据包大小. 24,529对我来说似乎很大.我认为可能有很多主机不能处理那么大的数据包.
请注意,这些数据包大小限制完全与MTU(数据链路层协议支持的最大帧大小)分开.