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) |
---|---|---|---|
16bit | 3bit | 1bit | 12bit |
0x8100 | 0(最低)~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帧 |
---|---|---|---|
DA | 6 B | 6 B | 6 B |
SA | 6 B | 6 B | 6 B |
S-TAG | 无 | 无 | 4 B |
C-TAG | 无 | 4 B | 4 B |
类型/长度 | 2 B | 2 B | 2 B |
数据载荷 | 46-1500 B | 42-1496 B | 38-1492 B |
FCS | 4 B | 4 B | 4 B |
总字节数 | 64-1518 B | 64-1522 B | 64-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;
}