丢弃大于1500字节的UDP数据包

Ale*_*ale 3 linux networking udp

我正在开发一个tftp客户端和服务器,我想动态选择udp有效负载大小来提高传输性能.

我用两台linux机器测试了它(一台有千兆以太网卡,另一台是快速以太网卡).我将千兆卡的MTU更改为2048字节,另一台更改为1500.

我曾经习惯setsockopt(sockfd, IPPROTO_IP, IP_MTU_DISCOVER, &optval, sizeof(optval))MTU_DISCOVER旗帜设置为IP_PMTUDISC_DO.

根据我的阅读,此选项应将该DF位设置为1,因此应该可以找到网络的最小MTU(具有最低MTU的主机的MTU).但是,当我发送一个大小大于我发送数据包的机器的MTU的数据包时,这个东西只会给我一个错误.

另一台机器(在这种情况下是服务器)不接收超大数据包(服务器的MTU为1500).丢弃所有UDP数据包,唯一的方法是发送1472字节的数据包.

为什么主机这样做?根据我的阅读,如果我发送的数据包大于MTU,ip层应该将其分段.

Mar*_*wis 8

我没有看到问题.您正在设置"不分段"位,并且发送的包小于发送主机的MTU,但大于接收主机的MTU.当然没有人会在这里分段(这样做会违反DF位).相反,发送主机应该收到ICMP消息.

编辑:IP指定ICMP错误消息类型3(目标不可达)代码4(需要碎片但DF位已设置)在发生碎片的位置发送到原始主机.TCP层自己处理这个以进行PMTU发现.在无连接套接字上,如果激活IP_RECVERR选项,Linux将报告套接字错误队列中的错误; 见ip(7).

  • 如果这两个主机位于同一子网上,则不会收到ICMP错误消息,因为具有较小MTU的接收主机上的IP层甚至从未看过该数据包 - 它在较低层被丢弃因为太大.在同一子网上配置两台具有不同MTU的主机是完全错误的. (2认同)