📡 第二章 彻底理解L2交换机
📄 一句话概括

以太网帧有四种格式,今天实际在用的只有一种: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 秒实验

  1. 抓一个包,看它的 Type 字段是十六进制多少。
  2. 找一个带 VLAN 标签的包,数一下里面有几个 EtherType。
  3. 看你常用的抓包软件把 0x0800 显示成什么名字。

常见误区

  1. 以为长度和类型是两个字段。同一个位置,两种含义。
  2. 以为 1501 到 1535 也算类型。那是空洞。
  3. 以为 VLAN 帧的 EtherType 是 0x0800。外层是 0x8100。
自测三问(点开对答案) 1. 怎么区分长度字段与类型字段? —— 看数值:≤1500 是长度,≥1536 是类型,中间是空洞。 2. 今天实际在用哪种帧格式? —— Ethernet II(DIX),类型字段直接标明载荷协议。 3. 带 VLAN 标签的帧为什么有两个 EtherType? —— 0x8100 表示有标签,标签之后才是真正的载荷类型。

下一节:帧的格式清楚了,接下来看交换机拿这帧怎么办——三种转发方式的选择。

相关笔记