本文是个人学习以太网相关知识的笔记汇总,持续更新中。内容涵盖各类网络数据包的帧格式解析,以及 VLAN 相关技术原理。
一、网络包格式
1.1 协议栈层次与封装关系
网络数据包采用分层封装的方式,每一层协议在上层数据前添加自己的头部(Header),形成嵌套结构:
┌─────────────────────────────────────────────────────────────────┐
│ 应用层数据 (Application Data) │
├─────────────────────────────────────────────────────────────────┤
│ 传输层头部 (TCP/UDP Header) + 应用层数据 │ ← Segment
├─────────────────────────────────────────────────────────────────┤
│ 网络层头部 (IPv4/IPv6 Header) + 传输层数据 │ ← Packet
├─────────────────────────────────────────────────────────────────┤
│ 链路层头部 (Ethernet Header) + 网络层数据 + FCS │ ← Frame
└─────────────────────────────────────────────────────────────────┘
各层对应关系如下表:
| OSI 层 | TCP/IP 层 | 协议示例 | 数据单元 |
|---|---|---|---|
| 应用层 / 表示层 / 会话层 | 应用层 | HTTP, DNS, DHCP | Message |
| 传输层 | 传输层 | TCP, UDP | Segment / Datagram |
| 网络层 | 网络层 | IPv4, IPv6, ARP | Packet |
| 数据链路层 | 链路层 | Ethernet, 802.1Q | Frame |
| 物理层 | 物理层 | 1000BASE-T, 25GbE | Bit |
1.2 以太网帧格式(MAC 层)
以太网帧是所有网络包的最外层封装,有两种主要标准:
Ethernet II(DIX 以太网)
这是目前最常用的以太网帧格式,EtherType ≥ 0x0600(1536)时为 Ethernet II。
字节偏移: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ Destination MAC (6 B) │ Source MAC (6 B) ...
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
字节偏移: 12 13 14 ... N-4 N-3 N-2 N-1
┌─────┬─────┬──────────────────────────────────────────────────────┬─────┬─────┬─────┬─────┐
│ EtherType │ Payload (46~1500 B) │ FCS (4 B) │
│ (2 B) │ │ │
└─────┴─────┴──────────────────────────────────────────────────────┴─────┴─────┴─────┴─────┘
| 字段 | 长度 | 说明 |
|---|---|---|
| Destination MAC | 6 B | 目的 MAC 地址,全 FF 为广播,01:xx:xx:xx:xx:xx 为组播 |
| Source MAC | 6 B | 源 MAC 地址 |
| EtherType | 2 B | 上层协议类型(≥ 0x0600),见下表 |
| Payload | 46~1500 B | 上层协议数据(不足 46 字节需填充 Padding) |
| FCS | 4 B | CRC32 校验,覆盖 DA/SA/Type/Payload |
常见 EtherType 值:
| EtherType | 协议 |
|---|---|
0x0800 |
IPv4 |
0x0806 |
ARP |
0x86DD |
IPv6 |
0x8100 |
802.1Q VLAN Tag |
0x88A8 |
802.1ad QinQ(外层 VLAN) |
0x8847 |
MPLS 单播 |
0x8848 |
MPLS 多播 |
0x8863 |
PPPoE Discovery |
0x8864 |
PPPoE Session |
0x88CC |
LLDP |
0x0842 |
Wake-on-LAN |
帧长度约束:以太网帧最小 64 字节(含 FCS),最大 1518 字节(含 FCS)。超过 1518 字节的帧称为 Jumbo Frame,数据中心常用 9000+ 字节(需设备支持)。
1.3 纯 MAC 帧(非 IP 协议)
ARP 帧格式
ARP(Address Resolution Protocol)用于 IPv4 地址到 MAC 地址的映射,EtherType = 0x0806。
字节偏移: 0 1 2 3 4 5 6 7
┌─────────────────────┬─────────────────────┐
│ Hardware Type (2B) │ Protocol Type (2B) │
│ 0x0001 = Ethernet │ 0x0800 = IPv4 │
├──────────┬──────────┼─────────────────────┤
│ HW Len │Proto Len │ Operation (2B) │
│ (1B)=6 │ (1B)=4 │ 1=Request 2=Reply │
├──────────┴──────────┴─────────────────────┤
│ Sender Hardware Address (6B) │
│ 发送方 MAC 地址 │
├────────────────────────────────────────────┤
│ Sender Protocol Address (4B) │
│ 发送方 IPv4 地址 │
├────────────────────────────────────────────┤
│ Target Hardware Address (6B) │
│ 目标 MAC(Request 时全为 0x00) │
├────────────────────────────────────────────┤
│ Target Protocol Address (4B) │
│ 目标 IPv4 地址 │
└────────────────────────────────────────────┘
ARP 报文总长 28 字节,加上 14 字节以太网头部共 42 字节,需填充 18 字节 Padding 才能达到最小帧长 64 字节(含 4 字节 FCS)。
LLDP 帧格式
LLDP(Link Layer Discovery Protocol)用于设备发现,EtherType = 0x88CC,目的 MAC 固定为组播地址 01:80:C2:00:00:0E。LLDP 载荷由一系列 TLV(Type-Length-Value)结构组成。
1.4 IPv4 包格式
IPv4 头部最小 20 字节(IHL=5),EtherType = 0x0800。
Bit: 0 8 16 24 31
┌───────┬───────┬───────────────┬───────────────────────────────┐
+0 │Version│ IHL │ DSCP │ ECN │ Total Length │
│ (4b) │ (4b) │ (6b) │ (2b) │ (16b) │
├───────────────┴───────────────┼───────┬───────────────────────┤
+4 │ Identification (16b) │Flags │ Fragment Offset (13b) │
│ │ (3b) │ │
├───────────────────────────────┴───────┴───────────────────────┤
+8 │ Time to Live (8b) │ Protocol (8b) │ Header Checksum (16b) │
├─────────────────────┴─────────────────┴───────────────────────┤
+12 │ Source IP Address (32b) │
├────────────────────────────────────────────────────────────────┤
+16 │ Destination IP Address (32b) │
├────────────────────────────────────────────────────────────────┤
+20 │ Options (0~40B, 可选, IHL>5 时存在) │
├────────────────────────────────────────────────────────────────┤
│ Payload(上层协议数据) │
└────────────────────────────────────────────────────────────────┘
| 字段 | 位宽 | 说明 |
|---|---|---|
| Version | 4 b | IP 版本,IPv4 = 4 |
| IHL | 4 b | 头部长度(单位:4字节),最小值 5(即 20B),最大 15(即 60B) |
| DSCP | 6 b | 差分服务代码点,用于 QoS 优先级标记 |
| ECN | 2 b | 显式拥塞通知(00=不支持,10/01=支持,11=拥塞) |
| Total Length | 16 b | 整个 IP 包长度(含头部),最大 65535 B |
| Identification | 16 b | 分片标识,同一数据报的所有分片具有相同 ID |
| Flags | 3 b | bit2=保留(0), bit1=DF(禁止分片), bit0=MF(后续还有分片) |
| Fragment Offset | 13 b | 分片偏移(单位:8字节),第一个分片为 0 |
| TTL | 8 b | 生存时间,每经过一个路由器减 1,为 0 时丢弃并回 ICMP |
| Protocol | 8 b | 上层协议类型,见下表 |
| Header Checksum | 16 b | 仅覆盖 IP 头部的校验和(每跳 TTL 变化后需重新计算) |
| Source IP | 32 b | 源 IPv4 地址 |
| Destination IP | 32 b | 目的 IPv4 地址 |
常见 IP Protocol 值:
| Protocol(十进制) | 十六进制 | 协议 |
|---|---|---|
| 1 | 0x01 |
ICMP |
| 2 | 0x02 |
IGMP |
| 6 | 0x06 |
TCP |
| 17 | 0x11 |
UDP |
| 41 | 0x29 |
IPv6-in-IPv4 隧道 |
| 47 | 0x2F |
GRE |
| 50 | 0x32 |
ESP(IPsec) |
| 51 | 0x33 |
AH(IPsec) |
| 89 | 0x59 |
OSPF |
1.5 IPv6 包格式
IPv6 头部固定 40 字节,EtherType = 0x86DD。
Bit: 0 8 16 24 31
┌───────┬───────────────────────┬──────────────────────────────┐
+0 │Version│ Traffic Class (8b) │ Flow Label (20b) │
│ (4b) │ │ │
├───────┴───────────────────────┴──────────────────────────────┤
+4 │ Payload Length (16b) │ Next Header │ Hop Limit │
│ │ (8b) │ (8b) │
├───────────────────────────────────┴─────────────┴────────────┤
+8 │ │
+12 │ Source IPv6 Address (128b / 16B) │
+16 │ │
+20 │ │
├───────────────────────────────────────────────────────────────┤
+24 │ │
+28 │ Destination IPv6 Address (128b / 16B) │
+32 │ │
+36 │ │
├───────────────────────────────────────────────────────────────┤
+40 │ Extension Headers(扩展头,可选,链式结构) │
├───────────────────────────────────────────────────────────────┤
│ Payload(上层协议数据) │
└───────────────────────────────────────────────────────────────┘
| 字段 | 位宽 | 说明 |
|---|---|---|
| Version | 4 b | IP 版本,IPv6 = 6 |
| Traffic Class | 8 b | 流量类别,对应 IPv4 的 DSCP(6b)+ECN(2b) |
| Flow Label | 20 b | 流标签,用于标识同一流的数据包,路由器可据此快速转发 |
| Payload Length | 16 b | 载荷长度(不含 40B 固定头部,含扩展头) |
| Next Header | 8 b | 下一个头部类型(扩展头类型或上层协议号) |
| Hop Limit | 8 b | 跳数限制,对应 IPv4 的 TTL |
| Source Address | 128 b | 源 IPv6 地址(16 字节) |
| Destination Address | 128 b | 目的 IPv6 地址(16 字节) |
IPv6 与 IPv4 的关键差异对比:
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 bit(4 B) | 128 bit(16 B) |
| 头部长度 | 20~60 B(可变) | 40 B(固定) |
| 头部校验和 | 有(每跳重算) | 无(由上层负责) |
| 分片 | 路由器可分片 | 仅源端可分片(通过扩展头) |
| 地址解析 | ARP | NDP(Neighbor Discovery Protocol) |
| 广播 | 有 | 无(用多播替代) |
| 自动配置 | DHCP | SLAAC / DHCPv6 |
| 选项/扩展 | Options 字段(头部内) | 扩展头(链式,头部外) |
IPv6 扩展头类型(Next Header 值):
| Next Header | 扩展头 / 协议 |
|---|---|
0 |
Hop-by-Hop Options(逐跳选项,每个路由器都处理) |
43 |
Routing Header(路由头,指定路由路径) |
44 |
Fragment Header(分片头) |
50 |
ESP(IPsec 加密载荷) |
51 |
AH(IPsec 认证头) |
59 |
No Next Header(无下一头部,载荷为空) |
60 |
Destination Options(目的选项,仅目的节点处理) |
6 |
TCP |
17 |
UDP |
58 |
ICMPv6 |
1.6 TCP 段格式
TCP 头部最小 20 字节,IP Protocol = 0x06(6)。
Bit: 0 8 16 24 31
┌───────────────────────────────┬───────────────────────────────┐
+0 │ Source Port (16b) │ Destination Port (16b) │
├───────────────────────────────┴───────────────────────────────┤
+4 │ Sequence Number (32b) │
├───────────────────────────────────────────────────────────────┤
+8 │ Acknowledgment Number (32b) │
├───────┬───────┬───┬───┬───┬───┬───┬───┬───┬───┬──────────────┤
+12 │DataOff│ Rsv │CWR│ECE│URG│ACK│PSH│RST│SYN│FIN│ Window (16b) │
│ (4b) │ (3b) │(1)│(1)│(1)│(1)│(1)│(1)│(1)│(1)│ │
├───────┴───────┴───┴───┴───┴───┴───┴───┴───┴───┴──────────────┤
+16 │ Checksum (16b) │ Urgent Pointer (16b) │
├───────────────────────────────────┴───────────────────────────┤
+20 │ Options (0~40B, 可选, DataOff>5 时存在) │
├───────────────────────────────────────────────────────────────┤
│ Application Data(应用数据) │
└───────────────────────────────────────────────────────────────┘
| 字段 | 位宽 | 说明 |
|---|---|---|
| Source Port | 16 b | 源端口号(0~65535) |
| Destination Port | 16 b | 目的端口号 |
| Sequence Number | 32 b | 序列号,标识本段数据的起始字节位置 |
| Acknowledgment Number | 32 b | 确认号,期望收到的下一个字节序号(ACK=1 时有效) |
| Data Offset | 4 b | 头部长度(单位:4字节),最小值 5(即 20B) |
| Flags | 9 b | 控制标志位,见下表 |
| Window Size | 16 b | 接收窗口大小(字节),用于流量控制 |
| Checksum | 16 b | 校验和,覆盖伪头部 + TCP 头部 + 数据 |
| Urgent Pointer | 16 b | 紧急指针(URG=1 时有效) |
TCP 标志位说明:
| 标志 | 含义 |
|---|---|
| SYN | 建立连接请求(三次握手第一步) |
| ACK | 确认号字段有效 |
| FIN | 请求关闭连接(四次挥手) |
| RST | 强制重置连接 |
| PSH | 立即推送数据到应用层,不等缓冲区满 |
| URG | 紧急数据,Urgent Pointer 有效 |
| ECE | ECN 回显(通知发送方网络拥塞) |
| CWR | 拥塞窗口减小(已响应 ECN) |
1.7 UDP 数据报格式
UDP 头部固定 8 字节,IP Protocol = 0x11(17)。
Bit: 0 8 16 24 31
┌───────────────────────────────┬───────────────────────────────┐
+0 │ Source Port (16b) │ Destination Port (16b) │
├───────────────────────────────┼───────────────────────────────┤
+4 │ Length (16b) │ Checksum (16b) │
├───────────────────────────────┴───────────────────────────────┤
+8 │ Application Data(应用数据) │
└───────────────────────────────────────────────────────────────┘
| 字段 | 位宽 | 说明 |
|---|---|---|
| Source Port | 16 b | 源端口号 |
| Destination Port | 16 b | 目的端口号 |
| Length | 16 b | UDP 头部 + 数据的总长度(最小 8) |
| Checksum | 16 b | 校验和(IPv4 中可选,IPv6 中必须) |
TCP vs UDP 对比:
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(重传、确认) | 不可靠 |
| 顺序保证 | 有序 | 无序 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有 | 无 |
| 头部开销 | 20~60 B | 8 B(固定) |
| 典型应用 | HTTP, FTP, SSH, SMTP | DNS, DHCP, RTP, QUIC |
1.8 各类网络包完整格式汇总
下表汇总了常见网络包的层次结构与头部大小:
| 包类型 | L2 头 | L3 头 | L4 头 | 最小帧长(含FCS) |
|---|---|---|---|---|
| Ethernet + IPv4 + TCP | 14 B | 20 B | 20 B | 64 B(需填充) |
| Ethernet + IPv4 + UDP | 14 B | 20 B | 8 B | 64 B(需填充) |
| Ethernet + IPv6 + TCP | 14 B | 40 B | 20 B | 78 B |
| Ethernet + IPv6 + UDP | 14 B | 40 B | 8 B | 66 B |
| Ethernet + IPv4(ICMP) | 14 B | 20 B | 8 B | 64 B(需填充) |
| Ethernet + IPv6(ICMPv6) | 14 B | 40 B | 8 B | 66 B |
| Ethernet + ARP | 14 B | — | — | 64 B(需填充) |
| 802.1Q + IPv4 + TCP | 18 B | 20 B | 20 B | 64 B(需填充) |
| QinQ + IPv4 + TCP | 22 B | 20 B | 20 B | 64 B(需填充) |
格式一:Ethernet + IPv4 + TCP
┌──────────────────────────────────────────────────────────────────┐
│ Ethernet Header (14 B) │
│ DA(6B) | SA(6B) | EtherType=0x0800(2B) │
├──────────────────────────────────────────────────────────────────┤
│ IPv4 Header (20 B 起) │
│ Ver=4 | IHL | DSCP | ECN | TotalLen | ID | Flags | FragOff │
│ TTL | Proto=0x06 | HdrCksum | SrcIP(4B) | DstIP(4B) │
├──────────────────────────────────────────────────────────────────┤
│ TCP Header (20 B 起) │
│ SrcPort(2B) | DstPort(2B) | SeqNum(4B) | AckNum(4B) │
│ DataOff | Flags | Window | Checksum | UrgPtr │
├──────────────────────────────────────────────────────────────────┤
│ Application Data(可变长度) │
├──────────────────────────────────────────────────────────────────┤
│ FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
格式二:Ethernet + IPv4 + UDP
┌──────────────────────────────────────────────────────────────────┐
│ Ethernet Header (14 B) │
│ DA(6B) | SA(6B) | EtherType=0x0800(2B) │
├──────────────────────────────────────────────────────────────────┤
│ IPv4 Header (20 B 起) │
│ Ver=4 | IHL | DSCP | ECN | TotalLen | ID | Flags | FragOff │
│ TTL | Proto=0x11 | HdrCksum | SrcIP(4B) | DstIP(4B) │
├──────────────────────────────────────────────────────────────────┤
│ UDP Header (8 B, 固定) │
│ SrcPort(2B) | DstPort(2B) | Length(2B) | Checksum(2B) │
├──────────────────────────────────────────────────────────────────┤
│ Application Data(可变长度) │
├──────────────────────────────────────────────────────────────────┤
│ FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
格式三:Ethernet + IPv6 + TCP
┌──────────────────────────────────────────────────────────────────┐
│ Ethernet Header (14 B) │
│ DA(6B) | SA(6B) | EtherType=0x86DD(2B) │
├──────────────────────────────────────────────────────────────────┤
│ IPv6 Header (40 B, 固定) │
│ Ver=6 | TrafficClass(8b) | FlowLabel(20b) | PayloadLen(16b) │
│ NextHdr=0x06 | HopLimit | SrcIPv6(16B) | DstIPv6(16B) │
├──────────────────────────────────────────────────────────────────┤
│ TCP Header (20 B 起) │
│ SrcPort(2B) | DstPort(2B) | SeqNum(4B) | AckNum(4B) │
│ DataOff | Flags | Window | Checksum | UrgPtr │
├──────────────────────────────────────────────────────────────────┤
│ Application Data(可变长度) │
├──────────────────────────────────────────────────────────────────┤
│ FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
格式四:Ethernet + IPv6 + UDP
┌──────────────────────────────────────────────────────────────────┐
│ Ethernet Header (14 B) │
│ DA(6B) | SA(6B) | EtherType=0x86DD(2B) │
├──────────────────────────────────────────────────────────────────┤
│ IPv6 Header (40 B, 固定) │
│ Ver=6 | TrafficClass(8b) | FlowLabel(20b) | PayloadLen(16b) │
│ NextHdr=0x11 | HopLimit | SrcIPv6(16B) | DstIPv6(16B) │
├──────────────────────────────────────────────────────────────────┤
│ UDP Header (8 B, 固定) │
│ SrcPort(2B) | DstPort(2B) | Length(2B) | Checksum(2B) │
├──────────────────────────────────────────────────────────────────┤
│ Application Data(可变长度) │
├──────────────────────────────────────────────────────────────────┤
│ FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
格式五:Ethernet + ARP(纯 MAC,非 IP)
┌──────────────────────────────────────────────────────────────────┐
│ Ethernet Header (14 B) │
│ DA=FF:FF:FF:FF:FF:FF(6B) | SA(6B) | EtherType=0x0806(2B) │
├──────────────────────────────────────────────────────────────────┤
│ ARP Payload (28 B) │
│ HWType(2B) | ProtoType(2B) | HWLen(1B) | ProtoLen(1B) │
│ Operation(2B) | SenderMAC(6B) | SenderIP(4B) │
│ TargetMAC(6B) | TargetIP(4B) │
├──────────────────────────────────────────────────────────────────┤
│ Padding (18 B) + FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
总长度:14 + 28 + 18 + 4 = 64 B(最小帧)
格式六:802.1Q VLAN Tagged 帧(单层 VLAN)
在 Ethernet Header 中插入 4 字节 VLAN Tag,EtherType 变为 0x8100:
┌──────────────────────────────────────────────────────────────────┐
│ DA (6B) | SA (6B) │
├──────────────────────────────────────────────────────────────────┤
│ TPID = 0x8100 (2B) │ TCI: PCP(3b)|DEI(1b)|VID(12b) (2B) │
│ ← VLAN Tag (4B) ──────────────────────────────────────────────→ │
├──────────────────────────────────────────────────────────────────┤
│ Inner EtherType (2B, 如 0x0800/0x86DD) │
├──────────────────────────────────────────────────────────────────┤
│ Payload (42~1500 B) │
├──────────────────────────────────────────────────────────────────┤
│ FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
总头部:6+6+4+2 = 18 B(比普通以太网帧多 4 字节)
格式七:QinQ 双层 VLAN Tagged 帧
┌──────────────────────────────────────────────────────────────────┐
│ DA (6B) | SA (6B) │
├──────────────────────────────────────────────────────────────────┤
│ Outer TPID = 0x88A8 (2B) │ Outer TCI: PCP|DEI|VID (2B) │
│ ← Outer VLAN Tag (4B) ──────────────────────────────────────── │
├──────────────────────────────────────────────────────────────────┤
│ Inner TPID = 0x8100 (2B) │ Inner TCI: PCP|DEI|VID (2B) │
│ ← Inner VLAN Tag (4B) ──────────────────────────────────────── │
├──────────────────────────────────────────────────────────────────┤
│ Inner EtherType (2B, 如 0x0800) │
├──────────────────────────────────────────────────────────────────┤
│ Payload (38~1500 B) │
├──────────────────────────────────────────────────────────────────┤
│ FCS (4 B) │
└──────────────────────────────────────────────────────────────────┘
总头部:6+6+4+4+2 = 22 B(比普通以太网帧多 8 字节)
二、VLAN 相关知识
2.1 VLAN 基本概念
VLAN(Virtual Local Area Network,虚拟局域网)是一种将物理网络在逻辑上划分为多个独立广播域的技术。
为什么需要 VLAN?
| 问题 | VLAN 解决方案 |
|---|---|
| 广播风暴:大型网络中广播包泛滥 | 将网络划分为多个广播域,广播不跨 VLAN |
| 安全隔离:不同部门需要网络隔离 | 不同 VLAN 的设备默认无法直接通信 |
| 灵活组网:物理位置不同的设备需逻辑分组 | 跨交换机的设备可属于同一 VLAN |
| 资源利用:减少不必要的广播流量 | 缩小广播域,提升网络效率 |
VLAN 的核心特性:
- 同一 VLAN 内的设备可以直接二层通信
- 不同 VLAN 之间的通信需要经过三层路由(路由器或三层交换机)
- VLAN 与物理拓扑无关,可以跨越多台交换机
2.2 802.1Q VLAN 标签格式
IEEE 802.1Q 是 VLAN 的国际标准,定义了在以太网帧中插入 4 字节 VLAN Tag 的方式。
Bit: 0 8 16 24 31
┌───────────────────────────────┬───┬───┬───────────────────────┐
│ TPID (Tag Protocol ID) │PCP│DEI│ VID (12b) │
│ (16b) = 0x8100 │(3b│(1b│ VLAN ID: 0~4095 │
└───────────────────────────────┴───┴───┴───────────────────────┘
←──────────────── TCI (Tag Control Information, 16b) ──────────→
←──────────────────────── VLAN Tag (32b / 4B) ─────────────────→
| 字段 | 位宽 | 说明 |
|---|---|---|
| TPID | 16 b | Tag Protocol Identifier,固定为 0x8100(802.1Q)或 0x88A8(QinQ 外层) |
| PCP | 3 b | Priority Code Point,802.1p 优先级,0~7,值越大优先级越高 |
| DEI | 1 b | Drop Eligible Indicator,拥塞时优先丢弃标记(原称 CFI) |
| VID | 12 b | VLAN Identifier,VLAN 编号,范围 0~4095 |
VID 特殊值:
| VID | 含义 |
|---|---|
0 |
不携带 VLAN 信息,仅携带 PCP 优先级(Priority Tagged Frame) |
1 |
默认 VLAN(Default VLAN),通常为管理 VLAN |
4095 (0xFFF) |
保留,不可用于实际 VLAN |
2~4094 |
可用 VLAN 范围 |
PCP 优先级对应关系(802.1p):
| PCP 值 | 优先级名称 | 典型用途 |
|---|---|---|
| 7 | Network Control | 网络控制协议(最高) |
| 6 | Internetwork Control | 路由协议 |
| 5 | Critical | 语音 |
| 4 | Video | 视频会议 |
| 3 | Excellent Effort | 关键业务数据 |
| 2 | Best Effort+ | — |
| 1 | Background | 后台流量(最低) |
| 0 | Best Effort | 默认(普通数据) |
2.3 VLAN 端口类型
交换机端口根据 VLAN 处理方式分为三种类型:
Access 端口(接入端口)
- 用途:连接终端设备(PC、服务器等)
- 特点:只属于一个 VLAN,收发的帧不带 VLAN Tag
- 入方向:收到无 Tag 帧,打上该端口所属 VLAN 的 Tag
- 出方向:发送前剥除 VLAN Tag,终端设备感知不到 VLAN
终端设备 交换机
┌──────┐ 无 Tag 帧 ┌──────────────────────┐
│ PC │ ─────────────────→ │ Access Port (VLAN 10) │ → 内部带 Tag=10 转发
│ │ ←───────────────── │ │ ← 剥除 Tag 后发出
└──────┘ 无 Tag 帧 └──────────────────────┘
Trunk 端口(干道端口)
- 用途:连接交换机之间,或交换机与路由器之间
- 特点:可以承载多个 VLAN 的流量,帧带 VLAN Tag 传输
- Native VLAN:Trunk 端口上有一个 Native VLAN(默认 VLAN 1),该 VLAN 的帧不带 Tag 传输
- 入方向:收到带 Tag 帧,检查 VID 是否在允许列表中;收到无 Tag 帧,归入 Native VLAN
- 出方向:发送时保留 Tag(Native VLAN 除外)
交换机 A 交换机 B
┌──────────────┐ 带 Tag 帧(多 VLAN) ┌──────────────┐
│ Trunk Port │ ─────────────────────────→ │ Trunk Port │
│ │ ←───────────────────────── │ │
└──────────────┘ └──────────────┘
Hybrid 端口(混合端口)
- 用途:华为设备特有,兼具 Access 和 Trunk 的特性
- 特点:可以属于多个 VLAN,且可以灵活控制哪些 VLAN 的帧带 Tag、哪些不带 Tag 发出
- 应用场景:需要对不同 VLAN 的帧做差异化处理时使用
三种端口类型对比:
| 特性 | Access | Trunk | Hybrid |
|---|---|---|---|
| 所属 VLAN 数量 | 1 个 | 多个 | 多个 |
| 入帧处理 | 打 Tag | 保留/打 Tag | 灵活配置 |
| 出帧处理 | 剥 Tag | 保留 Tag(Native 除外) | 灵活配置 |
| 典型连接对象 | 终端设备 | 交换机/路由器 | 灵活 |
2.4 VLAN 的工作流程
以一个典型的跨交换机 VLAN 通信为例:
PC-A (VLAN 10) SW-1 SW-2 PC-B (VLAN 10)
┌──────┐ ┌──────────────────────────────────────────────┐
│ │ ──无Tag帧──→ │Access(V10) Trunk ──带Tag(10)帧── Access(V10)│ ──无Tag帧──→ │ │
│ │ ←─无Tag帧── │ Port │ ←─无Tag帧── │ │
└──────┘ └──────────────────────────────────────────────┘ └──────┘
帧处理步骤:
- PC-A 发出无 Tag 的以太网帧
- SW-1 的 Access 端口(VLAN 10)收到帧,打上 Tag(VID=10)
- SW-1 查找 MAC 地址表,从 Trunk 端口转发,保留 Tag
- SW-2 的 Trunk 端口收到带 Tag 帧,检查 VID=10 在允许列表中,继续转发
- SW-2 查找 MAC 地址表,从 Access 端口(VLAN 10)转发,剥除 Tag
- PC-B 收到无 Tag 的以太网帧
2.5 VLAN 间路由
不同 VLAN 之间默认无法通信,需要三层设备进行路由。常见方案:
方案一:单臂路由(Router-on-a-Stick)
路由器通过一个物理接口连接交换机,接口上配置多个子接口,每个子接口对应一个 VLAN。
路由器
┌────────┐
│ eth0.10│ ← 子接口,VLAN 10 网关
│ eth0.20│ ← 子接口,VLAN 20 网关
└────┬───┘
│ Trunk 链路
┌────┴───────────────────┐
│ 交换机 │
│ Access(V10) Access(V20)│
└────────────────────────┘
│ │
PC-A(V10) PC-B(V20)
方案二:三层交换机(SVI 接口)
三层交换机为每个 VLAN 创建 SVI(Switch Virtual Interface)虚拟接口,作为该 VLAN 的网关,路由在交换机内部完成,性能更高。
┌──────────────────────────────────────────┐
│ 三层交换机 │
│ SVI VLAN 10: 192.168.10.1/24 │
│ SVI VLAN 20: 192.168.20.1/24 │
│ │
│ Access(V10) Access(V20) │
└──────────────────────────────────────────┘
│ │
PC-A PC-B
192.168.10.2 192.168.20.2
2.6 QinQ(双层 VLAN / 802.1ad)
QinQ(IEEE 802.1ad)在原有 802.1Q Tag 的基础上再封装一层外层 Tag,实现 VLAN 的嵌套。
应用场景:运营商网络中,为不同客户的 VLAN 流量提供隔离和透传。
客户网络 A (VLAN 10~20) 运营商网络 客户网络 A (VLAN 10~20)
┌──────────────────┐ ┌──────────────┐ ┌──────────────────┐
│ 内层 Tag: 0x8100│ ────────→ │外层 Tag:0x88A8│ ────────→ │ 内层 Tag: 0x8100│
│ VID = 10 │ │VID = 100(客户A│ │ VID = 10 │
└──────────────────┘ └──────────────┘ └──────────────────┘
QinQ 帧结构:
| 字段 | 值 | 说明 |
|---|---|---|
| DA | — | 目的 MAC |
| SA | — | 源 MAC |
| Outer TPID | 0x88A8 |
外层 VLAN Tag 标识(运营商 VLAN) |
| Outer TCI | PCP|DEI|VID | 外层 VLAN ID(运营商分配) |
| Inner TPID | 0x8100 |
内层 VLAN Tag 标识(客户 VLAN) |
| Inner TCI | PCP|DEI|VID | 内层 VLAN ID(客户自定义) |
| EtherType | 0x0800 等 |
上层协议 |
| Payload | — | 数据 |
| FCS | — | CRC32 |
注意:QinQ 使得最大帧长从 1518 B 增加到 1522 B(多 4 字节外层 Tag),网络设备需支持 QinQ 帧才能正确处理。
2.7 VLAN 相关协议汇总
| 协议 | 标准 | 说明 |
|---|---|---|
| 802.1Q | IEEE | 单层 VLAN 标签,TPID=0x8100 |
| 802.1ad | IEEE | QinQ 双层 VLAN,外层 TPID=0x88A8 |
| 802.1p | IEEE | VLAN Tag 中的 PCP 优先级(已并入 802.1Q) |
| VTP | Cisco 私有 | VLAN Trunking Protocol,自动同步 VLAN 配置 |
| GVRP | IEEE 802.1Q | 动态 VLAN 注册协议 |
| MVRP | IEEE 802.1ak | GVRP 的继任者,基于 MRP 框架 |
| PVLAN | — | Private VLAN,在同一 VLAN 内进一步隔离端口 |
📝 持续更新:本文将持续补充更多网络数据平面相关知识,包括 MPLS、隧道封装、QoS 标记、组播包格式等内容。