我正在开发一个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层应该将其分段。
答案 0 :(得分:8)
我没有看到问题。您正在设置“不分段”位,并且发送的包小于发送主机的MTU,但大于接收主机的MTU。当然没有人会在这里分段(这样做会违反DF位)。相反,发送主机应该收到ICMP消息。
编辑:IP指定ICMP错误消息类型3(目标不可达)代码4(需要分段但DF位已设置)在分段将具有的位置发送到原始主机发生了。 TCP层自己处理这个以进行PMTU发现。在无连接套接字上,如果激活IP_RECVERR选项,Linux将报告套接字错误队列中的错误;见ip(7)。
答案 1 :(得分:2)
您正在设置的“DF位”代表“Do not Fragment”。当你告诉它不要时,不应该要求IP层分段数据包。
答案 2 :(得分:1)
在同一子网 1 上运行具有不同接口MTU的主机不正确。
这是主机/网络配置错误,在这种情况下,预计IP路径MTU发现无法正常工作。
如果您希望测试应用程序的路径MTU发现,则需要设置由路由器 2 连接的多个子网,并使用不同的MTU。在这种情况下,路由器是将获取MTU不匹配的设备,并发回ICMP“Fragmentation Needed”错误。
1。嗯,从技术上讲,相同的广播域。
2。作为“家用路由器”销售的设备实际上是路由器/交换机 - 它们在WAN和LAN之间路由,但在LAN上的以太网端口之间切换。 不足足以将具有不同MTU的网络分开。