帧封装与差错检测(CRC)
数据链路层把网络层的 IP 包封装成"帧"(Frame),加上头部和尾部,并附加校验码——让接收方发现传输中的错误。就像寄快递时在箱子外面贴面单、里面放易碎标签
比特流里怎么区分”哪一段是一份完整的消息”?
物理层只负责把比特从 A 传到 B——它不关心这些比特的组织方式。就像邮局的运输车只管把包裹从北京运到上海,但包裹里装的是什么、寄给谁——运输车不管。
数据链路层的任务就是给物理层传输的比特流”划界”——告诉接收方”从这儿到这儿是一份完整的数据”。
🏫 类比:快递包裹 一堆书散装扔进卡车(比特流)——到了目的地一地狼藉,谁是谁的都不知道。 帧(Frame) 就像把书装进快递箱——贴上快递单(头部 MAC 地址)、放上易碎标签(校验码)、打上包装带(尾部)——整箱运输,开箱即用。
以太网帧格式——快递单长什么样
前导码 (7B) ┃ 定界符 (1B) ┃ 目标 MAC (6B) ┃ 源 MAC (6B) ┃ 类型 (2B) ┃ 数据 (46-1500B) ┃ 校验 (4B)
| 字段 | 长度 | 作用 | 类比 |
|---|---|---|---|
| 前导码 | 7 字节 | 让接收方时钟同步——“准备好,要来了!“ | 打电话时说”喂?“ |
| 定界符 | 1 字节 | 告诉接收方”帧开始了" | "下面是正题了” |
| 目标 MAC | 6 字节 | 要发给谁 | 收件人地址 |
| 源 MAC | 6 字节 | 谁发的 | 寄件人地址 |
| 类型 | 2 字节 | 上层协议(IPv4=0x0800,ARP=0x0806) | 箱子里是书还是衣服 |
| 数据 | 46-1500 字节 | 真正的 IP 包 | 箱子里的内容 |
| 校验 | 4 字节 | CRC-32 校验码——检测传输错误 | 易碎标签+密封条 |
💡 数据字段最小 46 字节、最大 1500 字节(这就是 MTU——Maximum Transmission Unit)。如果 IP 包小于 46 字节,要补 0 填充;如果大于 1500 字节,IP 层要先分片再发。
为什么有”数据最小 46 字节”的限制?
CSMA/CD 协议要求:发送方在发送完毕之前必须能检测到冲突。对于 10Mbps 以太网,最远距离下,检测到冲突所需的最短传输时间对应 64 字节——减去 18 字节头部和尾部,数据至少 46 字节。
💡 这个限制对今天的全双工交换机网络已经不重要了——因为不会再有冲突,但你仍然能见到这个”历史遗留”的 46 字节下限。
CRC——怎么知道数据传错了?
物理层传输过程中可能因为电磁干扰、信号衰减导致比特翻转——发送的是 1,收到的是 0。
CRC(Cyclic Redundancy Check,循环冗余校验) 就是数据链路层用来检测这种错误的方法。
🏫 类比:100 除以几才能整除? 你送朋友一本书,怕朋友收到后发现缺页。你在书里夹了一张小纸条,上面写了一个数字。朋友收到后重新算一遍,如果数字对得上,说明书完整——这就是 CRC 的思想。
CRC 的工作原理
CRC 把数据看作一个巨大的二进制数,除以一个事先约定好的”生成多项式”(也是一个二进制数),余数就是 CRC 校验码。
数据:11010011101100(要发送的数据)
生成多项式:1011(发送方和接收方事先约定)
二进制除法计算余数:
1100001010
1011 ) 11010011101100
1011
----
1100
1011
----
1111
1011
----
1001
1011
----
100 → 余数 = 100(CRC 校验码)
发送方: 把数据 11010011101100 和 CRC 100 一起发送 接收方: 用收到的数据(包含 CRC)除以同样的多项式——如果余数为 0,说明传输正确;否则一定出错了。
CRC 的强大之处
| CRC-32 能检测出 | 检测率 |
|---|---|
| 所有单比特错误 | 100% |
| 所有双比特错误 | 100% |
| 所有奇数个比特错误 | 100% |
| 所有长度 ≤ 32 位的突发错误 | 100% |
| 长度 > 32 位的突发错误 | 99.99999998% |
💡 你平时下载文件时看到的 MD5 或 SHA256 校验也是类似思想——但工作在不同的层。CRC 在硬件中实现(快到不影响网络速度),MD5/SHA 在软件中实现(慢但更安全)。
MTU 与 IP 分片
MTU(Maximum Transmission Unit) 是数据链路层帧能承载的最大数据量。以太网是 1500 字节。
如果 IP 层要发送一个 4000 字节的包——比 MTU 大——IP 层必须先把它拆成多个小片,每片单独封装成帧:
IP 包 4000 字节(太大了,装不进一个以太网帧)
│
▼
┌────────────┐
│ 帧 1: 1500B│ ← IP 分片 1(片偏移 0)
│ 帧 2: 1500B│ ← IP 分片 2(片偏移 1480)
│ 帧 3: 1060B│ ← IP 分片 3(片偏移 2960)
└────────────┘
接收方收集所有分片后重组
# 检查你的网络 MTU
$ ping -M do -s 1472 google.com
# -M do 表示禁止分片
# -s 1472 表示发送 1472 字节的数据 + 28 字节 IP+ICMP 头部 = 1500
# 如果能 ping 通,说明 MTU = 1500
# 如果超过 MTU:
$ ping -M do -s 1500 google.com
ping: local error: message too long, mtu=1500
💡 VPN 经常遇到 MTU 问题——因为 VPN 加密后的数据包比原来的大,加上额外的 VPN 头部,超过了 MTU,导致连接卡顿。解决方法通常是调整 MTU(比如设为 1400)。
小结
| 概念 | 要点 | 一句话 |
|---|---|---|
| 帧(Frame) | 数据链路层的数据单元 | 加了”快递面单”的 IP 包 |
| MAC 地址 | 网卡的物理标识,48 位 | 设备的”身份证号” |
| CRC | 循环冗余校验,检测传输错误 | 除法余数做校验 |
| MTU | 最大传输单元(以太网 1500B) | 一个”包裹”最多装 1500 字节 |
| IP 分片 | 大包拆成多个小帧传输 | 一箱书装不下,分两箱 |
为什么先学这个? 帧封装让物理层的比特流有了”结构”——接收方知道”从哪到哪是一份消息”。但多台电脑连在同一根线上时,怎么避免冲突?下一节看看MAC 协议与以太网。