以太网帧有好几种格式,最常见、现代网络里用得最多的是 Ethernet II 格式(严格来说,现代网络很多地方是 Ethernet II 加上 802.1Q tag,但咱们先讲基础的 Ethernet II)。它的结构从头到尾是这样的:

  1. 前导码 (Preamble)7 字节
    • 作用: 帮助接收端的网卡(NIC)同步时钟。
    • 原理: 它是一串重复的 1 和 0 模式(10101010 10101010 ...),就像一个节奏稳定的节拍器。接收网卡通过这段序列来调整自己的时钟,确保能准确读取后续的数据位。想象一下,两个人要同步接收信号,需要先一起打拍子对好节奏。
  2. 帧开始定界符 (Start of Frame Delimiter, SFD)1 字节
    • 作用: 标志着前导码的结束和真正帧数据的开始。
    • 原理: 这是前导码后面的一个特殊模式(10101011)。当接收网卡读到这个模式,就知道“好了,同步结束,接下来要收的是帧的正式内容了!” 前导码和 SFD 合起来共 8 字节,通常也一起叫做同步字段。
  3. 目标 MAC 地址 (Destination MAC Address)6 字节
    • 作用: 指定这帧数据是发给哪个设备的。
    • 原理: MAC 地址是网络接口硬件的全球唯一标识符(比如 A1:B2:C3:D4:E5:F6)。交换机等二层网络设备就是看这个字段来决定把帧转发到哪个端口。如果目标是 FF:FF:FF:FF:FF:FF,那就是广播地址,所有设备都会接收处理。
  4. 源 MAC 地址 (Source MAC Address)6 字节
    • 作用: 指明这帧数据是从哪个设备发出来的。
    • 原理: 接收设备要知道是谁发来的数据。同时,交换机通过学习源 MAC 地址和它收到的帧的端口号,来构建它的 MAC 地址转发表,这样以后就知道哪个 MAC 地址的设备在哪一侧了。
  5. 类型/长度 (Type/Length)2 字节
    • 作用: 这个字段有点特殊,它有两种含义,取决于它的值:
      • 如果值大于 1500 (十进制): 它表示 类型 (EtherType)。这指明了这帧数据里封装的是哪种上层协议的数据。比如 0x0800 表示封装的是 IPv4 数据包,0x0806 表示是 ARP 请求或应答,0x86DD 表示是 IPv6 数据包等等。
      • 如果值小于等于 1500: 它表示 长度 (Length)。这指明了后面“数据”字段的字节数(这主要用于旧的 IEEE 802.3 标准帧,现代网络用的少)。
    • 原理: 通过这个字段,接收端的操作系统就能知道,收到这帧数据后,应该把帧里面的“数据”部分交给哪个上层协议的模块去处理(是交给 IP 模块?还是 ARP 模块?)。这是实现协议分层(比如 TCP/IP 协议栈)的关键一步。
    • (一个小补充:在源 MAC 地址和 Type/Length 之间,有时候会插入一个 4 字节的 802.1Q Tag 字段,用来标识 VLAN 信息和 QoS 优先级,这个在企业网络里非常普遍,但它是对基本 Ethernet II 帧的一个扩展。)
  6. 数据 (Data/Payload)46 到 1500 字节
    • 作用: 这是帧的核心内容,承载着上层协议(比如 IP 数据包、ARP 消息、TCP/UDP 报文等)的实际数据。
    • 原理: 这是真正要传输的“信的内容”。为什么最小是 46 字节?这是为了保证在半双工以太网中发生冲突检测的有效性,如果上层数据不够 46 字节,会在后面填充(Padding)补到 46 字节。为什么最大是 1500 字节?这是以太网的 最大传输单元(MTU) 的典型值,超过这个大小的数据包需要分片传输。
  7. 帧校验序列 (Frame Check Sequence, FCS)4 字节
    • 作用: 用于检测帧在传输过程中是否发生了错误或损坏。
    • 原理: 发送端根据从目标 MAC 地址到数据字段的所有内容,计算出一个校验值(通常使用 CRC,循环冗余校验算法),填入这个字段。接收端收到帧后,用同样的方法对除了 FCS 之外的其他字段计算一次校验值,然后和帧里的 FCS 进行比较。如果两者不一致,就认为这帧数据在传输过程中出错了,通常会直接丢弃这帧数据。注意:FCS 只能检测错误,不能纠正错误。

总结一下 Ethernet 帧结构的作用:

它是一个标准的“数据信封”,定义了数据在以太网上传输时的格式。通过帧头(前导码、SFD、MAC 地址、类型/长度)和帧尾(FCS),网络设备能够:

  • 同步接收信号。
  • 识别发送者和接收者。
  • 判断帧里封装的是什么类型的数据(交给哪个上层协议)。
  • 检查数据在传输过程中是否损坏。
  • 携带实际需要传输的应用数据。