105 lines
4.8 KiB
Markdown
105 lines
4.8 KiB
Markdown
---
|
||
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 表转发帧
|