首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux MTU和UDP

Linux MTU和UDP
EN

Server Fault用户
提问于 2015-08-10 22:09:34
回答 1查看 2.9K关注 0票数 1

有人能给我解释一下这种行为吗?我在云提供商上运行了几个VMS (centos)。接口设置为标准1500 MTU。

与大的ICMP数据包连接可以很好地工作:

代码语言:javascript
复制
# ping -s 1600 10.132.6.3
PING 10.132.6.3 (10.132.6.3) 1600(1628) bytes of data.
1608 bytes from 10.132.6.3: icmp_seq=1 ttl=64 time=1.16 ms
1608 bytes from 10.132.6.3: icmp_seq=2 ttl=64 time=1.09 ms
1608 bytes from 10.132.6.3: icmp_seq=3 ttl=64 time=1.04 ms
^C
--- 10.132.6.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2207ms
rtt min/avg/max/mdev = 1.044/1.101/1.168/0.063 ms

因此,似乎有什么东西正在分割ICMP通信量。

但是,庞大的UDP流量并不能使它:

代码语言:javascript
复制
]# nping --udp -p 111 -data-length 1600 10.132.6.3
WARNING: Payload exceeds maximum recommended payload (1400)

Starting Nping 0.5.51 ( http://nmap.org/nping ) at 2015-08-10 18:06 EDT
sendto in send_ip_packet_sd: sendto(3, packet, 1628, 0, 10.132.40.29, 16)   => Message too long
Offending packet: UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499   iplen=1628
SENT (0.0082s) UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499 iplen=1628
sendto in send_ip_packet_sd: sendto(3, packet, 1628, 0, 10.132.40.29, 16) => Message too long
Offending packet: UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499  iplen=1628
SENT (1.0086s) UDP10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499  iplen=1628
sendto in send_ip_packet_sd: sendto(3, packet, 1628, 0, 10.132.40.29, 16) => Message too long
Offending packet: UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499 iplen=1628
SENT (2.0097s) UDP 10.132.6.3:53 > 10.132.40.29:111 ttl=64 id=17499 iplen=1628

Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 3 (4.884KB) | Rcvd: 0 (0B) | Lost: 3 (100.00%)
Tx time: 2.34513s | Tx bytes/s: 2082.61 | Tx pkts/s: 1.28
Rx time: 2.34513s | Rx bytes/s: 0.00 | Rx pkts/s: 0.00
Nping done: 1 IP address pinged in 2.35 seconds

对于为什么UDP的流量不被分割,有什么想法吗?

EN

回答 1

Server Fault用户

发布于 2015-08-11 14:25:06

sendto错误来自nping,它从OS套接字库(即本地--而不是网络上的某个地方)接收它。似乎nping只是试图发送1600字节的UDP数据包,但操作系统无法发送它们。

OTOH,如果您将--mtu选项用于nping,它将对数据包进行分段。它显然没有计算MTU中的IP报头,因为我能设置的最大的MTU是1480。

代码语言:javascript
复制
nping --udp -p 111 -data-length 1600 --mtu 1480 some-host
WARNING: Payload exceeds maximum recommended payload (1400)

Starting Nping 0.5.51 ( http://nmap.org/nping ) at 2015-08-11 10:29 EDT
SENT (0.0056s) UDP 192.168.1.40:53 > 192.168.1.14:111 ttl=64 id=58221 iplen=1628
RCVD (0.0068s) ICMP 192.168.1.14 > 192.168.1.40 Destination host 192.168.1.14 administratively prohibited (type=3/code=10) ttl=64 id=33478 iplen=576

同时,常规的旧ping必须在将数据包交给操作系统之前自动将其碎片化。

研究这类事情的一种很好的技术是使用tcpdump来探测网络上实际发生的事情。

代码语言:javascript
复制
tcpdump -s0 -w /tmp/tcpdump.out host 192.168.1.1

然后,您可以下载tcpdump.out并使用wireshark检查其内容。

如果省略-s0,它将只捕获每个数据包的前64个字节(我认为)。对于这个案子,那就足够了。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/713190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档