🌐 第五章 以太网与无线局域网
📄 一句话概括

上一节讲完了线和插头,可线里跑的到底是什么形状的东西?本节回答这个——以太网帧的格式。所谓"格式",就是一串字节按约定的顺序摆好,每一段管一件事:最前面 8 个字节是"预备铃"(前导码,让人对上时钟),接着 6 字节目的 MAC + 6 字节源 MAC(这帧给谁、谁发的),再 2 字节类型(里面装的是 IP 还是 ARP),中间是数据区(装一整个 IP 包,最少 46 最多 1500 字节),最后 4 字节 FCS(帧尾校验)。这里有两个最值钱的点:① 以太网的帧格式其实有两个版本——今天全世界跑的是 Ethernet II(第三段写"类型"),而教科书上常讲的 IEEE 802.3 那套第三段写的是"长度"、后面还多插了个 LLC 头,今天基本见不到了;② 数据区里装的必须是"一整个" IP 包,而它 1500 字节的上限,正是我们一直挂在嘴边的 MTU。

📝 本节和前面几节的关系

5.2 已经拆过一次帧的字段——那是"认零件"(每个字段叫什么、多少个字节)。本节再往里走一层,回答三个更硬的问题:为什么标准会长成这样?为什么历史上还有另一个版本?里面装的到底是一整块什么东西?

  • 5.2 负责传输数据的以太网(以太网概要):帧的六字段、64 与 1518 的来历、最小帧为什么是 64。本节把其中最容易含糊过去的第三个字段和数据区讲透
  • 5.5 网络接口与线缆:那里讲比特靠什么送出去;本节讲串成什么形状送出去。一个管"路和车",一个管"货怎么装箱"
  • 3.6 数据的称谓:那里说网络接口层的数据叫"数据帧",还说"只有数据帧带帧尾校验"。本节的 FCS 就是那句话的实物
  • 3.4 数据打包与 MTU:那里的 MTU 1500、IP 分片,出处就在本节——帧的数据区能装多少,决定了 IP 包最大能多大
  • 3.2 双层门牌:帧里的两个 MAC 每跳都换,而里面的 IP 自始至终不变;本节让你看清这两层地址是怎么套在一起的
  • 3.9 单播、广播、组播 / 3.16 ARP:ARP 请求就是一条目的 MAC 全 F 的广播帧,类型字段写着 0x0806,本节给出它在这一套格式里的位置
  • 5.3 以太网标准(IEEE802 委员会):那里出现过 0x8100(VLAN 标签),本节说明这 4 个字节插在帧的哪个位置、插完帧会变成多长
  • 5.1 同一网络内传输:本节讲的格式,只在一段链路里有效——出了这个网络,这套帧就换一套了(收 3.2)

一、先把"格式"两个字说清楚

"格式"这个词听起来虚,其实非常实在。它的意思是:

一段字节流里,从第几个字节到第几个字节,代表什么意思——这件事双方事先约好。

为什么非要有它?因为线里跑的只是电压的高低,接收方拿到的是一串没有边界的 0 和 1。它必须知道:

格式就是这串问题的答案表。 没有它,收到的比特流只是一堆噪声。

而"数据帧"这个叫法(收 3.6)也就顺理成章了:帧(Frame)的本义就是"有边框的东西"——加上了框头(帧头)和框尾(帧尾)之后,里面那块数据才有边界、才知道是给谁的。

一句话:IP 包回答"最终送到哪台机器",而帧回答"在这一段路上,这个箱子怎么装、给哪个口"。

二、以太网的帧格式,其实有两个版本

这是本节最容易被教材含糊过去、但实际很值钱的一点。

以太网历史上,帧格式两度被定义过:

Ethernet II(DIX V2) IEEE 802.3
谁定的 DEC、Intel、Xerox 三家(DIX 就是三家首字母) IEEE 802 委员会
年代 1980 年 稍后
第三个字段 类型(里面装的是什么) 长度(数据区有多少字节)
后面还有谁 直接就是数据区 数据区前面还插了个 LLC 头(3 字节)
今天还存在吗 全世界在用的就是它 基本见不到了

为什么 IEEE 802.3 那套会消失? 因为它那个 LLC 头是为了"让一根线上能跑很多种上层协议"才设计的——既然第三段只写了长度、没写里面是什么,那就得在后面补一个字段来标明。可后来的事实是:IP 一家独大。为这一个协议专门加一层,就显得啰嗦了。于是 IEEE 后来干脆把自己的标准改成和 V2 一样,用类型字段。

❗ 一个很妙的兼容设计

这两个版本在同一个位置放了两种含义的东西,可它们居然能共存——靠的是这个规矩:

  • 值 ≤ 1500 → 当成长度(说明对面用 802.3 那套)
  • 值 ≥ 1536 → 当成类型(说明对面用 V2 那套)

中间 1501~1535 这段值没人用,是故意留出来的缓冲带。

所以老网卡收到一帧,只看这一个数,就知道对面在用哪个版本、该怎么解释后面那段字节。这是"用取值范围区分含义"的经典手法,也是为什么 1500 这个数字在这套标准里反复出现。

学的时候要注意一件事:很多教材讲以太网帧格式,讲的是 IEEE 802.3 那套(因为有 LLC 更好画)。但你用 Wireshark 抓包看到的是 V2。所以看到抓包里没有 LLC、第三段写的是 Type: IPv4 (0x0800),不要以为抓错了。

三、每个字段为什么是这个字节数

格式的字段不难背,难的是"为什么偏偏是这些字节"。一旦想通,就再也不会忘。

字段 长度 干什么 谁来看它
前导码 + SFD 8 字节 一串交替的 0/1,让接收方把时钟对上 网卡的物理部分
目的 MAC 6 字节 这一帧交给哪个接口 接收方网卡 + 交换机
源 MAC 6 字节 这一帧是谁发的 交换机(用它学 MAC 地址表)
类型 2 字节 里面装的是 IP 还是 ARP 还是别的 接收方的网卡(决定交给谁处理)
数据 46 ~ 1500 字节 真正的货 上层的程序
填充 0 ~ 46 字节 凑够最小帧长 谁也看不见(见第四节)
FCS 4 字节 帧尾校验,用来发现传输错误 接收方的网卡

几个"为什么":

① MAC 为什么是 6 字节? 因为要够多又不浪费:48 位能编出 2800 万亿个号,全世界的网卡用不完还有富余;而地址是要写进网卡硬件、还要逐帧比对的,位数越多成本越高。6 字节是个很好的平衡点(收 5.4)。

② 类型字段为什么只有 2 字节? 2 字节能表示 65536 种。而实际登记过的上层协议类型连十分之一都不到——常见的就是那么几个:

类型值 里面装的是
0x0800 IPv4
0x0806 ARP
0x86DD IPv6
0x8100 带 VLAN 标签的帧

③ FCS 为什么是 4 字节? 它用的是 CRC(循环冗余校验)算法,4 字节能给出大约 43 亿分之一的漏检率——足够低,又只占这么点空间。再多加字节,防护提升有限,白白浪费带宽。

规律:每个字段的长度都是"刚好够用"。这不是随手定的,是几十年里被"够用 + 便宜 + 好实现"三方拉扯出来的结果。

四、最容易被跳过的字段:填充

这是本节最值得单独讲一段的地方,因为 5.2 只提了一句。

问题从哪来? 以太网帧有个最小长度:64 字节(5.2 讲过原因:帧必须发得够久,撞车才能传回来被听见)。

但如果我只想发 20 个字节的数据呢?

14(帧头)+ 20(数据)+ 4(FCS)= 38 字节——不够 64。

于是规矩是:发送方的网卡在数据后面补一串 0(补到 46 字节),凑够 64 再发出去。

三件事要记住:

① 填充是网卡加的,不是程序加的。 你的程序只管交出那 20 字节,剩下的"凑数"是网卡自己干的——上层完全不知道有这回事。

② 填充不往上交。 接收方网卡看到数据区不足 46 字节、或者从里面的 IP 头读出"这包其实只有 20 字节",就知道后面的是填充,剥掉再往上送。

③ 它解释了一个经典困惑:

"我明明只 ping 了一个字节,抓包怎么看到 60 多字节?"

因为真实的线上是这样的:1 字节数据 + ICMP 头 8 + IP 头 20 = 29 字节,还不到 46,于是网卡要补 17 个 0;再加帧头 14 + FCS 4 = 64 字节。

你发的那 1 个字节,在线上被撑成了 64 字节的箱子。

五、数据区里装的是"一整个" IP 包

这是"数据的格式"这个标题真正指的层次关系。

把帧想成一个信封(收 3.6 的套娃):

┌──────────── 以太网帧(信封)────────────┐
│ 帧头 14 字节                           │
├───────────────────────────────────────┤
│ 数据区 ≤ 1500 字节                     │
│   ┌────────── 一个完整的 IP 包 ──────┐ │
│   │ IP 头 20 字节                     │ │
│   │ TCP 段 / UDP 数据报 / ICMP 报文…  │ │
│   └───────────────────────────────────┘ │
├───────────────────────────────────────┤
│ FCS 4 字节                            │
└───────────────────────────────────────┘

这里有一条很硬、但平时不会有人明说的规矩:

一个以太网帧里,装的是一个完整的东西——通常是一个完整的 IP 包,或者是 ARP 报文。

不能把两个包塞进一个帧里,也不能把一个包切成两半塞进两个帧里。

为什么这条重要?因为它直接决定了 MTU 1500 的来历(收 3.4):

帧的数据区最多装 1500 字节 → 所以一个 IP 包最多 1500 字节 → 这就是 MTU = 1500 的真正出处 → 所以 IP 包超过 1500 时,必须在 IP 层就把它切开(分片),而分片是网际层的活,不是以太网的活

换句话说:以太网只会说"你这箱子太大了,我装不下";把它拆小这件事,是 IP 自己回家干的。

而分片的代价也在 3.4 讲过:丢一片,整个包就废了——这就是为什么大文件传输最怕路上有 MTU 更小的链路(例如 VPN 隧道)。

六、帧长的四档数字

前面提到的那些数字,其实能排成一排:

长度 什么情况 由来
64 字节 最小帧 14 + 46 + 4(数据不足就填充)
1518 字节 标准上限 14 + 1500 + 4
1522 字节 带 VLAN 标签时 1518 + 4(标签插在源 MAC 后面)
9000 字节 巨帧(Jumbo Frame) 厂商扩展,只在局域网/数据中心

关于 1522(VLAN):VLAN 标签是 4 个字节,插在源 MAC 之后、类型之前——它会把原来的"类型"往后挤一格,自己占那个位置,并把自己的类型写成 0x8100(收 5.3)。所以带标签的帧最长 1522。

关于 9000(巨帧):数据中心里用它,是因为帧大 → 帧数少 → 每帧的固定开销摊薄了,效率更高。但它有个明确的坑:

公网上没人认巨帧。 中间某台设备只要不支持,它就会把巨帧直接丢掉。

所以"我在内网开了巨帧,怎么有些网站打不开了"——这就是原因。巨帧只能用在"整条路都是自己家的"环境里。

顺带解一个疑:抓到小于 64 字节的帧(叫 runt 帧)是怎么回事?——那是早期 CSMA/CD 时代"撞车撞出来的残片"(收 5.2)。今天全双工环境基本抓不到了。

七、换个介质,帧就换一套

最后要划清一条界线:本节讲的这套格式,是"以太网"的格式。

Wi-Fi 虽然和以太网同属网络接口层(收 5.1),但它有自己的帧格式(IEEE 802.11 的帧)——里面甚至有四个地址字段,帧尾的顺序也和以太网不一样。

但它们在同一层、干同一件事:

所以换介质不用改上层——IP、TCP、HTTP 完全不受影响(5.1 讲过这条)。

一套格式只管一段路。 从你的手机到 AP 是 Wi-Fi 帧,从路由器出来到光猫是以太网帧,中间换了介质就换了信封——但里面的 IP 包一路没变(收 3.2 的双层门牌)。

八、懂这些格式,实际能干什么

① 看抓包一眼就认出来。 Wireshark 里那一行 Ethernet II, Src: …, Dst: …, Type: IPv4 (0x0800),就是把本节这套字段一个个填进去显示出来的。看到 Type: 那一栏,就知道里面装的是什么。

② 一眼看穿"这帧给谁"。 - 目的 MAC 是具体地址 → 单播(收 3.9) - 目的 MAC 全 F(FF:FF:FF:FF:FF:FF)→ 广播,ARP 请求长这样(收 3.16) - 目的 MAC 第一个字节的低位是 1 → 组播

③ 判断 MTU 类故障。 "网页能开但大图加载不出来""连了 VPN 有些站打不开"——很可能是路上某段 MTU 更小,大包被丢了。这是抓包看帧大小最能派上用场的地方。

④ 认出 VLAN 环境。 抓包里出现 0x8100,说明这条路上跑了 VLAN 标签。

九、动手:Demo55 把帧格式抓到眼前对上号

💡 本节的目标

亲眼看到四件事:帧头真的是 14 字节、类型字段真的在变、填充真的存在、1500 真的是硬上限。

第 1 步:抓一个帧,数一遍字段

用 Wireshark 抓一次 ping,展开 Ethernet II 那一行,你会看到:

Wireshark 显示 对应字段
Destination: … 目的 MAC(6 字节)
Source: … 源 MAC(6 字节)
Type: IPv4 (0x0800) 类型字段——就是本节的主角

在下面那行的十六进制区,找到前 14 个字节——那就是帧头。数一数,正好 14。

第 2 步:看类型字段怎么变

过滤 arp,抓一个 ARP。看它的 Type: —— 变成了 0x0806。

同一个位置,装着不同的值,网卡就知道该把里面的东西交给谁处理。

第 3 步:亲手制造"填充"

ping -l 1 127.0.0.1

用 -l 1 只发 1 个字节的数据。然后在 Wireshark 里看这个包的帧长——会是 64 字节左右。

你发了 1 个字节,线上跑的是 64 字节——多出来的就是填充和帧头。

第 4 步:看 1500 这条硬线

ping -f -l 1472 8.8.8.8
ping -f -l 1473 8.8.8.8

第一条通、第二条报"需要拆分"(Packet needs to be fragmented)。

账要算清:1472(数据)+ 20(IP 头)+ 8(ICMP 头)= 1500。

1472 是这条路上数据区能塞的极限——再大,帧的数据区就超过 1500 了。

第 5 步:看 MTU 本身

netsh interface ipv4 show subinterfaces

对比一下各张网卡的 MTU。VPN 虚拟网卡经常比 1500 小——这就是"连了 VPN 有些网站打不开"的一类原因。

第 6 步:抓一个 VLAN 帧(如果有)

如果你在公司网络里、或者用带 VLAN 的交换机,抓包里可能会出现 Type: 802.1Q (0x8100)。

点开它,你会看到帧里真的多插了 4 个字节——这就是 1522 的来历。

第 7 步:看"每跳换 MAC、IP 不变"

抓一个去往外网的包,展开帧头和 IP 头:

这两行并排看,就是本节说的"帧是信封、IP 包是信"的实物。

第 8 步:30 秒实验

抓一个 ARP 请求,然后回答三个问题:

  1. 它的目的 MAC 是什么?(应全是 F——广播帧)
  2. 它的类型字段是多少?(0x0806)
  3. 从帧头到类型字段一共几个字节?(14)

十、常见误区

  1. "以太网帧格式就一种。" —— 有两种版本:今天用 Ethernet II(类型字段),教科书上常讲的 IEEE 802.3(长度字段 + LLC)已经基本见不到了。
  2. "类型字段和长度字段是两个不同的字段。" —— 它们在同一个位置(源 MAC 之后那 2 个字节),靠取值范围区分:≤1500 当长度、≥1536 当类型。
  3. "填充这个字段是浪费带宽。" —— 没它最小帧 64 字节就不成立,碰撞检测也就失去意义(收 5.2)。它是"用一点浪费换一个能工作的网络"。
  4. "一个帧能装多少数据都行。" —— 数据区 1500 是硬上限。更大就得在 IP 层分片(收 3.4)。
  5. "帧里可以装两个 IP 包。" —— 一个帧装一个完整的东西。这是为什么 MTU 和 IP 包上限是同一个数。
  6. "巨帧越大越快,都该开。" —— 公网不认巨帧。只在"整条路都是自己家"的环境里能用。
  7. "帧里的 MAC 地址全程不变。" —— 每跳都换(收 3.2)。变的是信封,不变的是信上的 IP。
  8. "FCS 能纠正传错的帧。" —— 它只发现、不补救(发现错了直接丢)。补不补是上层(TCP)的事(收 3.18)。
  9. "Wi-Fi 帧和以太网帧是一样的。" —— 是同一个层、同一个目的,但格式不同(802.11 帧有四个地址字段)。所以换介质要换信封,但不用换里面的 IP 包。
  10. "填充的 0 会被当成数据收上去。" —— 接收方靠帧长和 IP 头的总长度就能判断出哪些是填充,剥掉再往上交。

十一、动手自测

❓ 自测一下
  1. 以太网帧有哪两个版本?主要区别在哪个字段?
  2. 网卡怎么用"第三个字段"判断对面用的是哪个版本?
  3. 为什么 1501~1535 这几个值没人用?
  4. 帧头一共几个字节?由哪几部分组成?
  5. 类型字段为什么刚好是 2 字节?说出三个常见的类型值。
  6. 填充字段是谁加的?为什么需要它?接收方怎么知道哪些是填充?
  7. "我只 ping 了 1 个字节,为什么线上跑了 64 字节?"
  8. 帧的数据区跟 MTU 是什么关系?换个说法:MTU 1500 这个数字最初是从哪来的?
  9. 1522 字节的帧是怎么来的?
  10. 巨帧(9000 字节)为什么只能用在局域网里?

答案: ① Ethernet II(DIX V2) 和 IEEE 802.3。区别在第三个字段:V2 放类型,802.3 放长度,且 802.3 后面还多一个 LLC 头(3 字节)。 ② 看那个数的取值范围:≤ 1500 → 当长度(802.3);≥ 1536 → 当类型(V2)。 ③ 这段值是故意留出来的缓冲带,用来把"长度"和"类型"的取值范围分开,避免歧义。 ④ 14 字节 = 目的 MAC 6 + 源 MAC 6 + 类型 2。 ⑤ 2 字节 = 65536 种,而实际登记过的上层协议连十分之一都不到,够用且省。常见值:0x0800 IPv4、0x0806 ARP、0x86DD IPv6、0x8100 VLAN 标签。 ⑥ 发送方的网卡加的(上层不知道)。需要它是因为最小帧是 64 字节(帧必须发得够久,撞车才能传回来)。接收方靠帧长 + IP 头里的总长度判断出填充部分,剥掉再往上交。 ⑦ 因为 1 字节数据 + ICMP 头 8 + IP 头 20 = 29 字节,不足数据区下限 46 字节,网卡补了 17 个 0;再加帧头 14 + FCS 4 = 64 字节。 ⑧ 帧的数据区上限 1500,就是一个 IP 包的上限,也就是 MTU。 MTU 1500 最初就是从"帧能装多少"倒推出来的。 ⑨ VLAN 标签插了 4 个字节(插在源 MAC 之后、类型之前),1518 + 4 = 1522。 ⑩ 因为中间设备未必都支持巨帧——只要有一台不认,就会把它丢掉。所以只能用在"整条路都自己管"的局域网/数据中心里。

十二、下一步学什么

相关笔记