上一节讲完了线和插头,可线里跑的到底是什么形状的东西?本节回答这个——以太网帧的格式。所谓"格式",就是一串字节按约定的顺序摆好,每一段管一件事:最前面 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 的帧)——里面甚至有四个地址字段,帧尾的顺序也和以太网不一样。
但它们在同一层、干同一件事:
- 都用 MAC 寻址
- 都带校验
- 都有一个字段标明"里面装的是什么"
所以换介质不用改上层——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 头:
- 帧的源 MAC = 你自己,目的 MAC = 网关(不是服务器!收 5.4)
- IP 头的源和目的,是你和真正的服务器
这两行并排看,就是本节说的"帧是信封、IP 包是信"的实物。
第 8 步:30 秒实验
抓一个 ARP 请求,然后回答三个问题:
- 它的目的 MAC 是什么?(应全是 F——广播帧)
- 它的类型字段是多少?(
0x0806) - 从帧头到类型字段一共几个字节?(14)
十、常见误区
- "以太网帧格式就一种。" —— 有两种版本:今天用 Ethernet II(类型字段),教科书上常讲的 IEEE 802.3(长度字段 + LLC)已经基本见不到了。
- "类型字段和长度字段是两个不同的字段。" —— 它们在同一个位置(源 MAC 之后那 2 个字节),靠取值范围区分:≤1500 当长度、≥1536 当类型。
- "填充这个字段是浪费带宽。" —— 没它最小帧 64 字节就不成立,碰撞检测也就失去意义(收 5.2)。它是"用一点浪费换一个能工作的网络"。
- "一个帧能装多少数据都行。" —— 数据区 1500 是硬上限。更大就得在 IP 层分片(收 3.4)。
- "帧里可以装两个 IP 包。" —— 一个帧装一个完整的东西。这是为什么 MTU 和 IP 包上限是同一个数。
- "巨帧越大越快,都该开。" —— 公网不认巨帧。只在"整条路都是自己家"的环境里能用。
- "帧里的 MAC 地址全程不变。" —— 每跳都换(收 3.2)。变的是信封,不变的是信上的 IP。
- "FCS 能纠正传错的帧。" —— 它只发现、不补救(发现错了直接丢)。补不补是上层(TCP)的事(收 3.18)。
- "Wi-Fi 帧和以太网帧是一样的。" —— 是同一个层、同一个目的,但格式不同(802.11 帧有四个地址字段)。所以换介质要换信封,但不用换里面的 IP 包。
- "填充的 0 会被当成数据收上去。" —— 接收方靠帧长和 IP 头的总长度就能判断出哪些是填充,剥掉再往上交。
十一、动手自测
- 以太网帧有哪两个版本?主要区别在哪个字段?
- 网卡怎么用"第三个字段"判断对面用的是哪个版本?
- 为什么 1501~1535 这几个值没人用?
- 帧头一共几个字节?由哪几部分组成?
- 类型字段为什么刚好是 2 字节?说出三个常见的类型值。
- 填充字段是谁加的?为什么需要它?接收方怎么知道哪些是填充?
- "我只 ping 了 1 个字节,为什么线上跑了 64 字节?"
- 帧的数据区跟 MTU 是什么关系?换个说法:MTU 1500 这个数字最初是从哪来的?
- 1522 字节的帧是怎么来的?
- 巨帧(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。 ⑩ 因为中间设备未必都支持巨帧——只要有一台不认,就会把它丢掉。所以只能用在"整条路都自己管"的局域网/数据中心里。
十二、下一步学什么
- ☑ 5.7 如何连接(网络拓扑) ✅ 已完成 —— 如何连接(网络拓扑)(把本节这些帧放到"形状"这一层来看:拓扑="谁跟谁能直接通"的关系图、六种基本形状与各自的代价〔总线型为什么全瘫、环型为什么靠令牌不靠抢、网状为什么只有骨干用得起〕、本节最值钱的一刀——物理拓扑 ≠ 逻辑拓扑〔集线器=物理星型 / 逻辑总线,收 5.2 那句判据的正式名字;无线更接近总线因为空气共用〕、星型凭什么赢下整个局域网、真实网络=层次化树型、无线的三种形态〔基础架构 / 自组网 / Mesh,一个 SSID 背后可能是好几台 AP〕、环路为什么撞成广播风暴而 STP(802.1D) 靠"物理有环逻辑无环"解决)
- ☐ 5.8(按教材顺序) —— 报个标题接着走:第五章前七节已经把网络接口层从头到尾铺了一遍——介质(5.1)→ 以太网本体(5.2)→ 标准(5.3)→ 地址(5.4)→ 接口与线缆(5.5)→ 帧格式(5.6)→ 连接形状(5.7)。下一节大概率是交换机的作用与转发原理(MAC 地址表怎么学习、泛洪、为什么它比集线器聪明)、无线局域网(Wi-Fi)的工作机制(CSMA/CA 细节、信道、AP 与 SSID),或第五章小结。等你报标题。
相关笔记
- 常用的网络接口和线缆是什么(RJ-45接口与UTP线缆) —— 上一节:帧这些比特靠什么送出去;本节讲它们串成什么形状
- 负责传输数据的以太网(以太网概要) —— 帧的字段初识、64 与 1518 的来历、最小帧为什么是 64;本节把第三个字段和数据区讲透
- 接口是哪个(MAC地址) —— 帧头里那两个 6 字节地址的来龙去脉
- 以太网标准(IEEE802委员会) —— 802.3 与 802.11 的编号、
0x8100(VLAN)的出处;本节说明 VLAN 标签插在帧的哪个位置 - 在同一网络中传输数据(以太网、无线局域网(Wi-Fi)) —— 以太网与 Wi-Fi 是同一层的两副肉身;本节说明它们的帧格式为什么不同却能互通
- 收发数据时的规则(数据打包) —— MTU 1500 与 IP 分片的完整机制;本节给出 1500 这个数字的出处
- 数据的称谓(信息、数据段、数据包、数据帧) —— "数据帧"这个名字的来历、"只有数据帧带帧尾校验"的实物
- 负责传输数据的网络分层(网络接口层与网际层) —— 双层门牌:帧里的 MAC 每跳换、里面的 IP 全程不变
- 接收方是1个还是多个(单播、广播、组播) —— 目的 MAC 全 F 就是广播帧;本节给出它在帧里的位置
- 将IP地址与MAC地址对应(ARP) —— ARP 请求就是一条类型为
0x0806的广播帧