RecvFrom() 返回大于发送方 NIC MTU 的数据包
我有专有应用程序向网络发送多播数据包。 它在 NIC MTU 1500 的 Linux 上运行。
然后我编写了一个简单的 java 程序来使用 MulticastSocket 类来接收消息。 我发现 DatagramPacket 大小约为 7900。 接收器程序在NIC MTU 1500的linux上运行。
我用C语言重写了程序并使用recvfrom()调用,但结果是相同的。
我不明白为什么? 数据包大小是否受 NIC MTU 限制? 或者它可以被程序覆盖吗?
I have proprietary application sending out multicast packet to the network. It is running on the linux with NIC MTU 1500.
And then I write a simple java program to using MulticastSocket class to receive message. I found it is DatagramPacket size is ~7900. The receiver program is running on the linux with NIC MTU 1500.
I rewrite the program in C and using recvfrom() call, but the result is the same.
I don't understand why? is it packet size limited by NIC MTU? or can it be override by the program?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
碎片和重组发生在 IP 层,位于 UDP 协议之下,因此它基本上是隐藏的。 您可以通过在不同的数据包大小上设置“不分段”标志来测试分段。
Fragmentation and reassembly happen at the IP layer, which is beneath the UDP protocol, so it's essentially hidden from view. You can test for fragmentation by setting the 'do not fragment' flag on varying packet sizes.
我猜您正在运行专有服务的机器上进行测试。 在这种情况下,Linux 盒子将让它们通过本地环回设备进行通信,该设备的 MTU 为 64k。
I would guess that you are testing on the machine where the proprietary service is running. In that case, the linux box will let them communicate over the local loopback device, which has a MTU of 64k.
内核是否有可能将数据包分段并在接收端进行组装?
如何找到最大的 UDP我可以在不分段的情况下发送数据包吗?
但是,无论如何都知道数据包已分段吗?
is it possible the kernel fragment the packet and assemble int the receiving side?
How to find the largest UDP packet I can send without fragmenting?
However, is it anyway to know the packet is fragmented?