以太网帧头只有 14 字节,却决定了数据交给谁、发给谁、能多大。这篇在真实网卡上抓帧,看 EtherType、MAC 的标志位、最小帧长补零、MTU 边界,以及抓包里永远看不到的 FCS。
20 秒共抓到 4007 个帧(含周围设备发出的广播 / 组播) EtherType 分布: 0x0800(IPv4)×3899, 0x0806(ARP)×70, 0x86dd(IPv6)×14, 0x9998(other)×12, 0x2589(other)×10, 0x002e(other)×1 目的地址种类: 单播×3306, 广播 ff:ff:ff:ff:ff:ff×372, 组播(IPv4, 01:00:5e:…)×317, 组播(IPv6, 33:33:…)×12 帧长(不含 FCS)最小 42、最大 1506、中位数 102 字节
以太网帧头 14 字节:目的 MAC 6、源 MAC 6、EtherType 2。EtherType 决定载荷交给 IPv4(0x0800)、ARP(0x0806)还是 IPv6(0x86dd)。
本机网卡 MAC 7e:aa:6f:xx:xx:xx 第一个字节 0x7e: 组播位=0, 本地管理位=1(本地管理位=1:系统生成的随机私有地址,不是出厂烧录的) 默认网关 MAC 70:85:6c:xx:xx:xx 第一个字节 0x70: 组播位=0, 本地管理位=0(本地管理位=0:厂商烧录的全局唯一地址,前 3 字节是厂商 OUI) 广播地址 ff:ff:ff:ff:ff:ff 第一个字节 0xff: 组播位=1, 本地管理位=1 IPv4 组播目的 MAC 01:00:5e:00:00:fb 对应 IP 组播地址 224.0.0.251:低 23 位直接取自 IP 地址
第一个字节最低位是组播位(广播也是组播的一种),次低位是本地管理位:随机私有地址和虚拟网卡的本地管理位为 1,厂商烧录的全局地址为 0。IPv4 组播的 MAC 由 01:00:5e 加 IP 低 23 位构成。
+ 0.000 ms ARP, Request who-has <本机局域网IP> tell <本机局域网IP>, length 28 (这次共抓到 19 个 ARP 帧,其余是网络里别的设备之间的 ARP,这里只列和本机相关的) 本机发出的 ARP 请求帧长 42 字节 = 14 以太网头 + 28 ARP(没有补零:补零由网卡在发送时做,抓包点在网卡之前) 别的设备回来的 ARP 应答帧长 60 字节 = 14 + 28 + 18 字节补零(对方网卡补到 60,抓到时已含补零;FCS 4 字节另算,总共 64) ARP 请求是广播(目的 ff:ff:ff:ff:ff:ff),EtherType=0x0806
以太网最小帧 64 字节(含 FCS),短的帧由网卡补零;抓包点在网卡之前时看到的 ARP 请求是 42 字节,收到的别人发来的已经补过零,是 60 字节。
-s 1472: 1 packets transmitted, 1 packets received, 0.0% packet loss 抓到的 ICMP 帧长: [1514, 1514](= 14 + 20 + 8 + 1472 = 1514,这是标准以太网帧去掉 FCS 之后的最大值;含 FCS 是 1518) -s 1473: ping: sendto: Message too long -s 1473 时有没有新的 ICMP 帧出现在网线上: 没有(只抓到 2 个帧,都来自 -s 1472 的请求和应答)
载荷最大 1500,帧去掉 FCS 最大 1514(含 FCS 1518)。ping -D -s 1473 超过 MTU,本机直接拒绝发送。
对这个 42 字节的 ARP 请求帧(不含补零)做 CRC-32 = 0x83f1343a;真实发送时补零到 60 字节再算 FCS 并附在尾部,字节序为小端(低位字节先发) 所以线上的完整帧 = 60 字节(补零后)+ 4 字节 FCS = 64 字节;抓包文件里这 4 字节不存在
帧尾的 4 字节 CRC-32 由网卡硬件加和校验,抓包文件里不存在。