Files
cs-note/hhs/NETWORK/02-链路层/01-Ethernet帧结构.md
T
2026-05-24 11:42:38 +08:00

105 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [计算机网络, Ethernet, MAC, 帧结构, 数据链路层]
create time: 2026-05-17 22:50
---
# Ethernet 帧结构
## 概述
Ethernet(以太网)是目前最主流的局域网技术,由 Xerox、DEC 和 Intel 在 1980 年联合制定(IEEE 802.3)。理解 Ethernet 帧结构是掌握网络底层通信的基础——每一帧都包含了足够的信息来让网卡判断"这是给我的吗?内容完整吗?上层协议是什么?"
## Ethernet II 帧格式(最常见)
```
┌──────────┬──────────┬──────────┬─────────────┬──────────┐
│ Dest MAC │ Src MAC │ EtherType│ Payload │ FCS │
│ 6 bytes │ 6 bytes │ 2 bytes │ 46–1500 B │ 4 bytes │
│ aabb.ccdd│ dd.eeff. │ 0x0800 │ IP Packet │ crc32() │
│ ee.ff.00│ │ │ │ │
└──────────┴──────────┴──────────┴─────────────┴──────────┘
←──────── 14 bytes Header ───────→ ← Tail →
←──── Min Frame = 64B ────→
←──── Max Frame = 1518B ────→
```
### 字段详解
| 字段 | 大小 | 说明 |
|------|------|------|
| Dest MAC | 6 bytes | 目标 MAC 地址,`ff:ff:ff:ff:ff:ff` 表示广播 |
| Src MAC | 6 bytes | 源 MAC 地址,发出方的物理地址 |
| EtherType | 2 bytes | 上一层协议类型:`0x0800`=IPv4, `0x86DD`=IPv6, `0x0806`=ARP |
| Payload | 46–1500 bytes | 承载的上层数据包。**最小 46 字节**,不足则填充(Padding) |
| FCS | 4 bytes | CRC-32 校验和,网卡硬件自动计算,接收端验证错误则直接丢弃 |
### 为什么 Payload 最小 46 字节?
最早的以太网最大电缆长度 2500m,信号传播延迟需要至少 64 字节才能保证碰撞检测(CSMA/CD)生效。所以规定**整个帧最小 64 字节**,减去 14 字节头部和 4 字节 FCS,Payload 最少 46 字节。短包会补零填满。
现代 Gigabit+ 网卡已不用 CSMA/CD,但为了兼容仍保留此限制。
## IEEE 802.3 / 802.3Q(VLAN Tagged)帧
当网络中使用 VLAN 时,帧中会插入一个 4 字节的 802.1Q Tag:
```
┌──────────┬──────────┬──────┬──────┬──────────┬─────────────┬──────────┐
│ Dest MAC │ Src MAC │ Type │ TPID │ TCI/VID │ Payload │ FCS │
│ 6 bytes │ 6 bytes │ 2B │2B │ 2B │ 46–1500 B │ 4 bytes │
└──────────┴──────────┴──────┴──────┴──────────┴─────────────┴──────────┘
```
新增字段:
- **TPID** (Tag Protocol Identifier): `0x8100` — 标识这是带 VLAN Tag 的帧
- **TCI** (Tag Control Information): 包含 PCP(优先级,3 bit)、CFI(规范格式指示符,1 bit)、**VID**(VLAN ID,12 bit)
VID 取值范围 1–4094,共 4094 个可用 VLAN。
## 常见 EtherType 对照表
| EtherType | 十六进制 | 协议 |
|-----------|---------|------|
| IPv4 | `0x0800` | IP 数据包 |
| IPv6 | `0x86DD` | IPv6 数据包 |
| ARP | `0x0806` | 地址解析协议 |
| RARP | `0x8035` | 反向 ARP(历史遗留) |
| PPPoE | `0x8864` | PPP over Ethernet |
| 802.1Q | `0x8100` | VLAN 标记 |
| LACP | `0x8809` | 链路聚合控制协议 |
## MAC 地址空间与 OUI
### OUI(Organizationally Unique Identifier)
MAC 地址的前三个字节由 **IEEE** 统一分配给厂商,称为 OUI。查询 OUI 可以知道网卡的制造商:
```bash
$ ip link show
link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
↑ 前三个字节 aa:bb:cc 就是 OUI
# 在线查询:https://www.wireshark.org/tools/oui-lookup.html
# Linux 也可以用 ethtool -P eth0 查看出厂 MAC
```
### 单播/多播位(LSB of First Byte)
第一个字节的最低比特位决定寻址类型:
| LSB | 类型 | 示例 |
|-----|------|------|
| 0 | 单播 (Unicast) | `aa:bb:cc:dd:ee:ff` |
| 1 | 多播 (Multicast) | `01:00:5e:xx:xx:xx`(IPv4 组播) |
| 1 | 广播 (Broadcast) | `ff:ff:ff:ff:ff:ff` |
> [!tip] 如何快速判断?看 MAC 第一个字节的十六进制最后一位
> - `a` → 1010 → LSB=0 → 单播
> - `3` → 0011 → LSB=1 → 多播/广播
## 关联笔记
- [[hhs/NETWORK/OSI与TCP-IP模型对比]] — 以太网属于链路层
- [[hhs/NETWORK/MAC地址与广播域]] — MAC 地址的工作范围
- [[hhs/NETWORK/Switch与路由器]] — Switch 如何使用 MAC 表转发帧