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层应该将其分段.
我没有看到问题.您正在设置"不分段"位,并且发送的包小于发送主机的MTU,但大于接收主机的MTU.当然没有人会在这里分段(这样做会违反DF位).相反,发送主机应该收到ICMP消息.
编辑:IP指定ICMP错误消息类型3(目标不可达)代码4(需要碎片但DF位已设置)在发生碎片的位置发送到原始主机.TCP层自己处理这个以进行PMTU发现.在无连接套接字上,如果激活IP_RECVERR选项,Linux将报告套接字错误队列中的错误; 见ip(7).
| 归档时间: |
|
| 查看次数: |
8973 次 |
| 最近记录: |