由于CSMA/CD算法的限制,以太网帧必须不能小于某个最小长度。以太网中,最小帧长为64字节,这是由最大传输距离和冲突检测机制共同决定的。
规定最小帧长是为了避免这种情况发生:A站点已经将一个数据包的最后一个Bit发送完毕,但这个报文的第一个Bit还没有传送到距离很远的B站点。B站点认为线路空闲继续发送数据,导致冲突。

高层协议必须保证Data域至少包含46字节,这样加上以太网帧头的14字节和帧尾的4字节校验码正好满足64字节的最小帧长,如图所示。如果实际数据不足46个字节,则高层协议必须填充一些数据单元。
1. 最小帧长的组成
| 目标MAC (6) | 源MAC (6) | 类型 (2) | 数据 (≥46) | FCS (4) |
- 以太网头部 = 6 (DMAC) + 6 (SMAC) + 2 (Type) = 14 字节
- FCS(帧校验序列) = 4 字节
- 数据部分(Payload) ≥ 46 字节
- 为什么是 46?
- 因为 `14 (头) + 46 (数据) + 4 (FCS) = 64 字节`(最小帧长)。
2. 如果数据不足 46 字节,如何填充?
(1)什么是“填充数据单元”?
- 填充(Padding) 是指 高层协议(如 TCP/IP)或网卡驱动 在数据部分后面 补零(或随机数据),使其达到 46 字节。
- 填充内容:通常是 `0x00`(零填充),但也可能是任意值(不影响上层协议解析即可)。
(2)填充示例
假设上层协议(如 HTTP)发送的数据只有 20 字节:
- 原始数据:`GET /index.html HTTP/1.1`(20 字节)
- 填充后数据:
GET /index.html HTTP/1.1 [26 个 0x00]
- 这样 数据部分 = 20 (真实数据) + 26 (填充) = 46 字节,满足最小帧长要求。
(3)Wireshark 如何显示填充?
- Wireshark 会标记填充部分,例如:
Data (20 bytes) 真实数据
Padding (26 bytes) 填充部分
- 在 Hex Dump 中,填充通常是 `00 00 00...`。
3. 谁负责填充?
| 场景 | 填充执行者 | 说明 |
| TCP/IP 协议栈 | 操作系统网络协议栈 | 在组包时自动填充(如 Linux 的 `eth_header()`)。 |
| 硬件加速(如网卡) | 网卡驱动或硬件 | 某些网卡支持 自动填充,减少 CPU 负担。 |
| 测试工具(如 iPerf) | 测试工具自身 | 可配置是否填充,例如 `-l` 参数控制数据长度。 |
4. 为什么填充不影响上层协议?
- IP 头部有“Total Length”字段,告诉接收方真实数据长度。
- TCP/UDP 头部有“Length”字段,标记有效数据范围。
- 接收方会丢弃填充部分,只提取有效数据。
示例:
- 发送方:`[IP头][TCP头][20字节数据][26字节填充]`
- 接收方:解析 `IP Total Length` 后,只取前 `20 字节`,忽略填充。
5. 特殊情况
(1)VLAN 标签(802.1Q)
如果帧带 VLAN 标签(+4 字节),则 最小数据部分可减少至 42 字节(因为帧头变成 18 字节):
14 (标准头) + 4 (VLAN) + 42 (数据) + 4 (FCS) = 64 字节
(2)Jumbo Frame(巨帧)
- 巨帧(如 9000 字节)不受最小 64 字节限制(因为千兆/万兆以太网不再依赖 CSMA/CD)。
- 但仍需保证 数据部分 ≥ 46 字节(兼容传统设备)。
6. 总结
| 关键点 | 说明 |
| 最小帧长 64 字节 | 由 `14 (头) + 46 (数据) + 4 (FCS)` 组成。 |
| 填充数据单元 | 高层协议或网卡自动补零,使数据部分 ≥ 46 字节。 |
| 不影响上层协议 | IP/TCP 头部已定义有效数据长度,接收方会丢弃填充。 |
| Wireshark 显示 | 会标记 `Padding`,填充内容通常是 `00 00 00...`。 |
| VLAN 和 Jumbo Frame | VLAN 帧最小数据可减至 42 字节,巨帧不受限但仍建议 ≥46。 |
最终结论
- 高层协议填充 是为了满足以太网最小帧长要求,通常补零。
- 不影响通信,因为 IP/TCP 头部已指明真实数据长度。
- Wireshark 可查看填充部分,帮助调试网络问题。
浙公网安备 33010602011771号