第一次打开Wireshark抓包学习以太网帧格式时,我对着屏幕找了半天,死活找不到书里说的那8字节前导码。当时我以为是自己抓包姿势不对,后来才明白,前导码和帧起始定界符属于物理层同步信息,在进入网卡MAC层之前已经被消费掉了,抓包工具最终呈现给你的内容,是从目的MAC地址开始的。这个小小的误会让我意识到,很多人对以太网帧格式的理解停留在“背下来一张表”,真到了查丢包、调VLAN、验证协议栈、排查CRC错误的时候,才知道每个字段背后都有一段历史包袱和工程权衡。
这篇内容我会从一个完整的以太网帧出发,把每个字段拆开讲清楚,再带你看抓包工具里的实际呈现、几种高频变体帧的区别,最后用几个排障案例说明这些知识怎么用。适合刚入门的数据通信、嵌入式网络开发者,也适合干了几年但一直靠“面向搜索引擎排障”的工程师把底盘知识补一补。以太网帧格式这东西,看着简单,却是整个网络协议栈最不容出错的一层。
1. 一个以太网帧在线缆上的真实形态
1.1 前导码与SFD:被物理层默默消化掉的8字节
书上给的帧格式顶层视图,通常是从前导码开始:7字节的0x55,紧跟着1字节的0xD5,叫SFD(Start Frame Delimiter,帧起始定界符)。这8字节在抓包里永远看不到,但它们确实在线缆上存在。
为什么前导码是0x55?0x55的二进制是10101010,这种0101交替的模式可以让接收端PHY芯片快速恢复时钟、完成比特同步。你可以把它理解成对讲机里的“喂喂喂”,让对方先调到同一个信道节奏上。SFD就不一样了,它的值是0xD5,二进制10101011,最后两个连续1是在告诉MAC层:注意,真正的目的MAC地址要来了,从下一个字节开始就是帧头。
到了100Mbps以上的以太网,物理层编码换成了8B/10B、64B/66B这类带时钟恢复的线路编码,MAC层发出的前导码在物理层已经被转成别的符号序列,接收端PHY会重新生成一个前导码再交给MAC。所以从MAC层视角看,前导码仍然存在;从驱动和抓包工具视角看,这8字节已经被剥离了,根本不进入内存。
1.2 标准以太网II帧布局:一张值得刻进脑子里的表
日常讨论的以太网帧,绝大多数是Ethernet II帧,也叫DIX帧,因为它是DEC、Intel、Xerox三家公司在1980年代联合定义的蓝皮书标准。IEEE
