进阶 #network#datalink#crc

帧封装与差错检测(CRC)

数据链路层把网络层的 IP 包封装成"帧"(Frame),加上头部和尾部,并附加校验码——让接收方发现传输中的错误。就像寄快递时在箱子外面贴面单、里面放易碎标签

比特流里怎么区分”哪一段是一份完整的消息”?

物理层只负责把比特从 A 传到 B——它不关心这些比特的组织方式。就像邮局的运输车只管把包裹从北京运到上海,但包裹里装的是什么、寄给谁——运输车不管。

数据链路层的任务就是给物理层传输的比特流”划界”——告诉接收方”从这儿到这儿是一份完整的数据”。

🏫 类比:快递包裹 一堆书散装扔进卡车(比特流)——到了目的地一地狼藉,谁是谁的都不知道。 帧(Frame) 就像把书装进快递箱——贴上快递单(头部 MAC 地址)、放上易碎标签(校验码)、打上包装带(尾部)——整箱运输,开箱即用。

以太网帧格式——快递单长什么样

前导码 (7B) ┃ 定界符 (1B) ┃ 目标 MAC (6B) ┃ 源 MAC (6B) ┃ 类型 (2B) ┃ 数据 (46-1500B) ┃ 校验 (4B)
字段长度作用类比
前导码7 字节让接收方时钟同步——“准备好,要来了!“打电话时说”喂?“
定界符1 字节告诉接收方”帧开始了""下面是正题了”
目标 MAC6 字节要发给谁收件人地址
源 MAC6 字节谁发的寄件人地址
类型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 协议与以太网