有人可以向我解释这种行为。 我有几个VMS(centos)在云提供商上运行。 接口设置为标准的1500 MTU
用大的ICMP数据包工作正常:
# 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
所以看起来有些东西在分割ICMPstream量
但是,大的UDPstream量不会使它:
]# 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
任何想法,为什么UDPstream量不被分割?
sendto错误来自nping ,它从OS套接字库(即本地 – 而不是从networking上的某处)接收它。 所以nping只是试图发送1600字节的UDP数据包,但操作系统不能发送它们。
OTOH,如果你使用--mtu选项来nping ,它会把数据包分割。 显然,在MTU中不包括IP头,因为我可以设置的最大MTU是1480。
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
OTOH, ping必须在将数据包提供给操作系统之前对数据包进行分段。
研究这种事情的好方法是使用tcpdump来嗅探networking上实际发生的事情。
tcpdump -s0 -w /tmp/tcpdump.out host 192.168.1.1
然后你可以下载tcpdump.out并用wireshark检查它的内容。
如果你省略-s0,它只会捕获每个数据包的前64个字节(我认为)。 对于这种情况下,会很多。