我正在学习 ping 命令的实现。对此我有一个疑问。疑问是
我知道套接字缓冲区用于在套接字中一次传输多少字节。但是 ping 命令如何管理套接字缓冲区大小。
$ ping -S 300 -s 400 google.com
PING google.com (216.58.197.46) 400(428) bytes of data.
72 bytes from maa03s20-in-f14.1e100.net (216.58.197.46): icmp_req=1 ttl=56 (truncated)
72 bytes from maa03s20-in-f14.1e100.net (216.58.197.46): icmp_req=2 ttl=56 (truncated)
72 bytes from maa03s20-in-f14.1e100.net (216.58.197.46): icmp_req=3 ttl=56 (truncated)
^C
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 40.231/41.500/42.408/0.924 ms
在上面的 ping 命令中,我得到的套接字缓冲区大小为 300,单个数据包大小为 400。套接字缓冲区大小仅为 300。但是 ping 在该套接字中一次传输 400 个字节。怎么可能。同时收到的数据包大小只有72。为什么只有72。
任何人都可以帮我解释一下吗?
答案1
这些细节是特定于实现的。数据包大小与您的预期完全一致。理论上,使用较小的缓冲区大小可能会导致数据包碎片,但在我尝试过的任何系统上都不会发生这种情况。
您获得的结果显示仅收到 72 字节,这是因为您的 VPS 有严格的限制,将数据包大小限制为 64 字节 + 8 字节 ICMP 标头。