1. 基本以太网帧格式

以太网帧格式

字段名称 字节数 Ethernet II帧功能 IEEE 802.3帧功能
前导码(Preamble) 7 物理层同步
帧起始定界符(SFD) 1 物理层定界
目标MAC地址(DA) 6 目标MAC地址
源MAC地址(SA) 6 源MAC地址
类型/长度字段 2 以太网类型(>=1536) 长度(<1500)
数据载荷(Payload) 46-1500 上层协议数据单元 上层协议数据单元+LLC/SNAP
帧校验序列(FCS) 4 错误检测(CRC)

1.1 物理层字段

以下字段由物理层处理,通常不计入数据链路层帧的大小:

  • 前导码(Preamble): 7字节,10101010,用于发送方和接收方之间的时钟同步。
  • 帧起始定界符(SFD, Start Frame Delimiter): 1字节,固定值为10101011,标志着前导码的结束和帧头部的开始。

1.2 数据链路层头部字段

  • 目标MAC地址(DA, Destination MAC Address): 6字节,指定帧的接收者。可用于单播、多播或广播寻址 。
  • 源MAC地址(SA, Source MAC Address): 6字节,标识帧的发送设备。
  • 以太网类型(EtherType)/长度(Length): 2字节。如果值大于或等于1536(0x0600),则为以太网类型(Ethernet II帧),指示上层协议类型,例如0x0800表示IPv4数据报 。如果值小于或等于1500(0x05DC),则为长度(IEEE 802.3帧),指示数据载荷的长度,不包括FCS。
    MAC 地址详见:MAC地址格式

1.3 数据与校验字段

  • 数据载荷(Payload): 变长字段,包含实际数据,如上层协议数据单元。标准以太网帧的有效载荷大小为46到1500字节。如果数据小于46字节,会添加填充(Padding)字节以满足最小帧长要求。
  • 帧校验序列(FCS, Frame Check Sequence): 4字节,用于错误检测。发送方计算一个32位循环冗余校验(CRC)值,接收方重新计算并比对,如果不匹配则丢弃该帧。

2. IEEE 802.1Q(单标签)帧格式

IEEE 802.1Q是用于在以太网网络上支持虚拟局域网(VLAN)的协议标准。该标准定义了一种VLAN标签系统,将一个4字节的标签字段插入到原始以太网帧中,以区分来自不同VLAN的流量。此标签插入在源MAC地址和类型/长度字段之间,因此会使原始帧的帧校验序列(FCS)必须重新计算。

VLAN Tag 格式

标签协议识别符(TPID)优先级(PCP)标准格式指示(CFI)VLAN 标识符(VID)
16bit3bit1bit12bit
0x81000(最低)~7(最高)0:MAC地址标准格式,1:MAC地址非标准格式0x001~0xFFE

该4字节的VLAN标签包含两个主要部分:

  • 标签协议标识符(TPID): 一个16位的字段,其固定值为0x8100,用于标识该帧为IEEE 802.1Q标签帧。
  • 标签控制信息(TCI): 一个16位的字段,进一步细分为三个子字段:

    • 优先级代码点(PCP): 一个3位的字段,用于指定帧的优先级,支持8个优先级级别。
    • 规范格式指示符(CFI)/丢弃资格指示符(DEI): 一个1位的字段,在以太网中通常为0,用于兼容性和丢弃资格指示。
    • VLAN标识符(VID): 一个12位的字段,用于唯一标识帧所属的VLAN。它支持高达4094个VLAN(4095保留,0代表没有指定VLAN ID,只有优先级)。

由于插入了这4字节的标签,带有802.1Q标签的以太网帧最大尺寸可达1522字节。

3. QinQ(IEEE 802.1ad)帧格式

QinQ(也称“VLAN叠加”或“双层VLAN”)技术是IEEE 802.1ad标准的一部分。该协议通过在原有帧中添加一个额外的VLAN标签来扩展VLAN数量,从而解决IEEE 802.1Q标准中4096个VLAN ID的限制。它还允许运营商在骨干网中对不同客户的流量进行封装和隔离,以提供二层VPN服务。

3.1 QinQ帧结构:S-TAG与C-TAG

QinQ帧结构的核心是“双标签栈”设计。在原始以太网帧的源MAC地址和原始以太网类型字段之间插入一个额外的4字节VLAN标签 。

  • C-TAG(Customer Tag): 位于内层,最靠近数据载荷。其以太网类型为0x8100 。C-TAG承载客户私有网络的VLAN信息,在运营商网络中被透明传输。
  • S-TAG(Service Provider Tag): 位于外层,最靠近以太网头部 。其以太网类型通常为0x88a8 。S-TAG由运营商分配,用于在公共网络中区分来自不同客户的流量。

3.2 实现模式

  • 基于接口的封装(基本QinQ): 所有进入特定接口的流量,无论是否已带VLAN标签,都会被封装上一个相同的S-TAG。
  • 基于流的封装(选择性QinQ): 根据预定义规则对流量进行分类,并为不同类型的流量分配不同的S-TAG。分类规则可以基于内层VLAN ID或802.1p优先级。

无标签以太网帧、802.1Q帧和QinQ帧的结构

字段无标签以太网帧802.1Q帧QinQ帧
DA6 B6 B6 B
SA6 B6 B6 B
S-TAG4 B
C-TAG4 B4 B
类型/长度2 B2 B2 B
数据载荷46-1500 B42-1496 B38-1492 B
FCS4 B4 B4 B
总字节数64-1518 B64-1522 B64-1526 B

4. CRC校验

以太网的CRC校验是对从目标MAC地址到数据载荷的所有字节进行CRC-32计算,得到的32位校验值作为FCS附加在帧尾,接收端再按相同方法计算并检查结果是否为0,若不为0则丢弃该帧。CRC校验示例代码如下(小端):

uint32_t EthernetCrc32(const uint8_t *data, uint32_t length) 
{
    uint32_t crc = 0xFFFFFFFF;
    for(uint32_t i = 0; i < length; i++) {
        crc ^= data[i];
        for(uint8_t j = 0; j < 8; j++) {
            if(crc & 1) {
                crc = (crc >> 1) ^ 0xEDB88320;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc^0xFFFFFFFF;
}
最后修改:2025 年 09 月 29 日
如果觉得我的文章对你有用,请随意赞赏