我运行ping:
ping -c 15 -s120-D 192.5.15.22
同时我观察了tcpdump:
tcpdump -n -e -vv -ttt -i iavf0 vlan tcpdump:在 iavf0 上监听,链路类型 EN10MB(以太网),捕获大小 262144 字节 00:00:00.000000 52:54:00:d6:e6:62 > 3a:db:46:ce:e8:b7,以太网类型 802.1Q(0x8100),长度166:vlan 11、p 0、以太类型 IPv4、(tos 0x0、ttl 64、id 0、偏移量 0、标志[DF]、proto ICMP(1)、长度148,坏的cksum 0(->9d33)! 192.5.15.22 > 192.5.15.23:ICMP 回显请求,ID 26245,序列号 0,长度 128 00:00:00.000161 3a:db:46:ce:e8:b7 > 52:54:00:d6:e6:62,以太网类型 802.1Q (0x8100),长度166:vlan 11、p 0、以太类型 IPv4、(tos 0x0、ttl 64、id 0、偏移量 0、标志[DF]、proto ICMP(1)、长度148) 192.5.15.23 > 192.5.15.22:ICMP 回显答复,id 26245,序号 0,长度 128 00:00:01.040554 52:54:00:d6:e6:62 > 3a:db:46:ce:e8:b7,以太类型 802.1Q (0x8100),长度166:vlan 11、p 0、以太类型 IPv4、(tos 0x0、ttl 64、id 0、偏移量 0、标志[DF]、proto ICMP(1)、长度148,坏的cksum 0(->9d33)!
- 如果我没记错的话,我看到的长度是 166 字节(166-120=46 字节),因为以太网字段(18 字节)在用户空间中是看不到的。它被内核空间截断了,对吗?
- 我不知道为什么我看到的是148字节?148-120=28字节,剩下的64字节在哪里?
- 校验和错误的原因是什么?
答案1
发送数据有效负载为 120 字节的 ICMP 数据包。
这ICMP(回显请求)标头总 ICMP 大小为 8 个字节128字节。
这IPv4 报头携带此 ICMP 有效负载的数据包为 20 字节(不使用任何 IP 选项时),总 IPv4 数据包大小为148字节。
这带有附加 802.1Q 报头的以太网报头携带此 IPv4 有效负载的帧的大小为 18 个字节(非 VLAN 标记帧的大小为 14 个字节),总大小为166字节。这 18 个字节可能对在 IP 层工作的应用程序隐藏,但它们并非对所有事物都隐藏(例如:tcpdump捕获了它们),无论它们可能以何种特殊格式提供。 (注意:在前面的 Wikipedia 链接中,前导码和 CRC/FCS 通常不被系统看到,而只能被 NIC 看到,并且不计入通常的帧长度。)
输出中明显的错误校验和是由于硬件加速造成的。大多数网卡都可以做到IPv4 校验和在硬件/固件中卸载,这样 NIC 的驱动程序和/或网络堆栈就知道不需要进行任何校验和,并且操作系统不会计算(或在路由时重新计算)IPv4 校验和字段。tcpdump在发射的帧被 NIC 的硬件/固件实际处理之前捕获该帧,该 IPv4 字段仍然具有不正确的值,尚未由 NIC 动态计算。