以太网帧有四种格式,今天实际在用的只有一种:Ethernet II。 区分它们靠第 13、14 字节那条 1536 的分界线。
上一节讲「怎么转」,这一节讲「转的是什么」。 帧格式是后面所有功能的基础:VLAN 标签插在哪、QoS 优先级放哪,都取决于它。
一、四种格式,一句话说完
Ethernet II(DIX):类型字段写「载荷是什么协议」。今天唯一在用的。 802.3 原始版(Raw 802.3):那个位置写「载荷有多长」。已经不用了。 802.3/LLC:长度后面跟 3 字节 LLC 头。只有 STP 这类协议还在用。 802.3/SNAP:LLC 再扩 5 字节,把类型找回来。用在某些老协议上。
为什么 Ethernet II 赢了:它最简单——一个类型字段就说明了载荷是什么,不需要再套一层 LLC。 简单的东西活下来,这是一条反复验证的规律。
二、1536 这条分界线
同一个位置,两种含义,靠数值区分:小于等于 1500 是「长度」,大于等于 1536 是「类型」。 1501 到 1535 是没人用的空洞。
为什么是 1500 与 1536:1500 是 MTU,也就是载荷上限;1536 是 0x0600,是当年能选的最小类型值。 中间那段留作将来用,结果一直没用上。
所以判断帧格式其实只要看一眼这两个字节:数值大的是 Ethernet II,数值小的是 802.3。 抓包软件显示的就是这个判断结果。
三、常见的 EtherType
0x0800 IPv4、0x0806 ARP、0x86DD IPv6、0x8100 VLAN 标签、0x8808 流控。这五个覆盖了日常九成以上。
最容易混的是 0x8100:它是「VLAN 标签」,插在源 MAC 后面,等于把类型字段往后挤了 4 个字节。 所以带标签的帧里会出现两个 EtherType。
外层 0x8100、内层才是真的 IPv4 或 ARP。抓包时看到 0x8100 别以为协议不对, 往下再看 4 个字节就对了。
四、动手 Demo:第 13、14 字节是长度还是类型
这段按 1536 这条分界线,把九个典型值判一遍。注意 1501 到 1535 那两行——它们是空洞,不属于任何一侧。
for v, note in vals:
if v <= 1500:
kind = u"长度"
elif v < 1536:
kind = u"异常"
else:
kind = u"类型"
T([u"%d" % v, u"0x%04X" % v, kind, note], [0, 0, 0, 0])
实跑输出:
--------------------------------------------------------------------
帧头那两个字节,到底是长度还是类型
--------------------------------------------------------------------
**以太网帧的第 13、14 字节有个历史包袱**:同一个位置,早期用来写长度,后来用来写类型。怎么区分?
靠一条数值分界线。
**分界是 1536(0x0600)。**小于等于 1500 是长度(802.3),大于等于 1536 是类型(Ethernet II),
1501 到 1535 是没人用的空洞。
十进制 十六进制 判为 含义
------------------------------------------------------------------
46 0x002E 长度 长度 46——合法的 802.3 短帧
1500 0x05DC 长度 长度 1500——802.3 上限
1501 0x05DD 异常 空洞,无定义
1535 0x05FF 异常 空洞,无定义
1536 0x0600 类型 类型 0x0600——XNS
2048 0x0800 类型 类型 0x0800——IPv4
2054 0x0806 类型 类型 0x0806——ARP
34525 0x86DD 类型 类型 0x86DD——IPv6
33024 0x8100 类型 类型 0x8100——802.1Q VLAN 标签
**所以今天的网络里几乎所有帧都是「类型」派**:IPv4、ARP、IPv6、VLAN 标签,全是 EtherType。
802.3 的「长度」用法只剩在 LLC/SNAP 那套老协议里。
**最容易混的一处:VLAN 标签 0x8100。**它插在源 MAC 后面,等于把类型字段往后挤了 4 个字节,
所以带 VLAN 标签的帧里会出现两个 EtherType。
**外层 0x8100,内层才是真的 IPv4 或 ARP。**抓包时看到 0x8100 别以为协议不对,
往下再看 4 个字节就对了。
2048 就是 0x0800,2054 就是 0x0806,34525 就是 0x86DD。十进制看着陌生, 十六进制一眼就认出来了——抓包软件显示的是十六进制。
空洞那两行值得看一眼:1501 到 1535 既不合规也不该出现,设备收到会怎么处理各家不同。 这种边界值是最容易出兼容问题的地方。
最后一个 0x8100 是重点:它不是载荷类型,是「我身上还有一层标签」。 真正的载荷类型在标签之后那 2 个字节。这也解释了为什么 VLAN 标签会让帧从 1518 变成 1522。
30 秒实验
- 抓一个包,看它的 Type 字段是十六进制多少。
- 找一个带 VLAN 标签的包,数一下里面有几个 EtherType。
- 看你常用的抓包软件把 0x0800 显示成什么名字。
常见误区
- 以为长度和类型是两个字段。同一个位置,两种含义。
- 以为 1501 到 1535 也算类型。那是空洞。
- 以为 VLAN 帧的 EtherType 是 0x0800。外层是 0x8100。
自测三问(点开对答案)
1. 怎么区分长度字段与类型字段? —— 看数值:≤1500 是长度,≥1536 是类型,中间是空洞。 2. 今天实际在用哪种帧格式? —— Ethernet II(DIX),类型字段直接标明载荷协议。 3. 带 VLAN 标签的帧为什么有两个 EtherType? —— 0x8100 表示有标签,标签之后才是真正的载荷类型。下一节:帧的格式清楚了,接下来看交换机拿这帧怎么办——三种转发方式的选择。
- ☐ (本节完,下一节 02.03.02 交换机数据帧的传输方式)