在计算机网络的世界里,物理层像是一个不知疲倦的搬运工,它只负责传输比特流(0 和 1),却并不关心这些比特代表什么意义。
而数据链路层(Data Link Layer)的核心任务之一,就是把这些散乱的比特流“打包”成一个个有意义的单元,这个单元就是帧(Frame)。这个过程,我们称为组帧(Framing)或封装成帧。
这就好比寄快递:物理层是传送带,数据链路层则是把物品装进纸箱、封好胶带、贴上快递单的过程。只有装箱了,接收方才知道哪里是一件货物的开始,哪里是结束。
一、 为什么需要组帧?
组帧主要解决两个核心问题:
- 帧定界(Frame Delimitation):
接收方如何从连续不断的比特流中区分出哪一段是第一帧,哪一段是第二帧?必须要有明确的界限。 - 透明传输(Transparent Transmission):
这是组帧最难理解也最重要的概念。- 问题:如果数据中恰好出现了和“帧定界符”(比如结束标记)一模一样的比特组合,接收方会不会误以为帧传输结束了?
- 目标:无论上层传下来什么样的数据(文本、图像、可执行文件),数据链路层都能原封不动地传输,不会被误判。
为了解决这两个问题,网络先驱们发明了四种经典的组帧方法。
二、 组帧的四种“招式”
1. 字符计数法 (Character Count)
这是最古老的方法。原理很简单:在帧的头部使用一个特定的字段,来记录这个帧一共有多少个字节。
- 原理:帧头第一个字节是
5,说明包括这个字节在内,本帧共有 5 个字节。接收方读到5,就往后数 4 个字节,结束。 - 致命缺陷:如果这个“计数字节”在传输中出错了(例如
5变成了3),接收方就会弄错帧的结束位置,进而导致后面所有的帧都无法正确识别(同步丢失)。
由于其脆弱性,现代计算机网络已基本淘汰该方法。
2. 字符填充法 (Byte Stuffing / Character Stuffing)
这种方法常用于以字节为单位传输的协议(如 PPP 协议)。
- 原理:
- 用特定的控制字符来定界。例如:SOH (Start of Header) 表示开始,EOT (End of Transmission) 表示结束。
- 透明传输的实现:
- 如果数据中真的出现了
EOT怎么办? - 发送方:在数据中的控制字符(如
EOT或转义字符本身ESC)前面,插入一个转义字符 (ESC)。 - 接收方:看到
ESC,就知道后面的那个字节是真数据,不是控制指令,把它留下来,把ESC删掉。
- 如果数据中真的出现了
3. 零比特填充法 (Zero-Bit Stuffing) ——★ 重点
这是高级数据链路控制协议(HDLC)采用的方法,它不处理字节,而是处理比特流,非常灵活。
(1) 核心规则
- 帧定界符(Flag):使用一个特殊的比特模式
01111110(十六进制7E)作为帧的开始和结束标记。 - 发送方规则(5 “1” 填 0):
只要在数据负载中扫描到连续的5 个 1,立即在后面插入一个0。- 例如:数据
0111111-> 发送01111101。 - 目的:确保数据中永远不会出现连续的 6 个 1,从而与 Flag (
01111110) 区分开。
- 例如:数据
- 接收方规则(5 “1” 删 0):
接收方检测数据流,当发现连续5 个 1时,检查下一位:- 如果是0:说明是填充的,删除该 0,保留数据。
- 如果是1:说明是Flag(01111110),或者是错误(01111111…)。
【例题 1】假设网络层需要传输的二进制数据为:011011111101111100。采用零比特填充法进行组帧,请问发送到链路上的实际比特流是什么?
【解析】
- 先写出定界符(首尾):
01111110…01111110- 扫描数据部分,寻找连续的 5 个 1:
- 原数据:
0110 11111 10 11111 00- 第一处:
...0110111111...-> 发现 5 个 1,后面是 1。根据规则,不管后面是啥,只要见 5 个 1 就填 0。- 第二处:
...101111100-> 发现 5 个 1。- 执行填充:
- 第一处
11111后加0->1111101- 第二处
11111后加0->11111000- 组合结果:
011111100110111110101111100001111110答案:中间的数据部分变为
01101111101011111000。
4. 违规编码法 (Physical Layer Coding Violation)
这种方法比较巧妙,它利用物理层编码的特性。
- 背景:在曼彻斯特编码(常用于以太网)中,每一个比特的中间都有一次电压跳变(“高-低”代表 1,“低-高”代表 0)。
- 原理:
曼彻斯特编码中,“高-高”和“低-低”电平是违规的,物理层通常不会出现这种信号。
既然不会出现在数据中,那我们就可以故意用“高-高”或“低-低”来定界! - 优点:不需要任何填充技术,效率很高。
- 应用:IEEE 802 标准(如以太网)中广泛使用。
三、 知识点总结
为了方便记忆,我们将这四种方法整理如下表:
| 方法 | 核心手段 | 优点 | 缺点/局限 | 考研关注度 |
|---|---|---|---|---|
| 字符计数法 | 头部加长度字段 | 简单 | 错一位全盘皆输 | ★ |
| 字符填充法 | 特殊字符定界 + ESC转义 | 兼容性好 | 依赖字符集 (ASCII),处理复杂 | ★★★ |
| 零比特填充法 | Flag(7E) + 5个1填0 | 任意比特流传输,效率高 | 需硬件处理位流 | ★★★★★ |
| 违规编码法 | 利用物理层非法电平 | 不需要填充,简单 | 只适用于特定物理层编码 | ★★ |
避坑指南:
- MTU(最大传输单元):
组帧时,帧的数据部分长度不能超过 MTU。这不仅仅是软件限制,更是底层硬件的要求。如果网络层数据包(IP Datagram)大于 MTU,就必须分片。 - 以太网的特殊性:
虽然教材上讲了四种方法,但以太网实际抓包时,你看不到“帧长度”字段(由前导码和帧间隙界定),也看不到复杂的位填充(因为它用了曼彻斯特编码或 4B/5B 编码等物理层特性)。但在做理论题时,零比特填充法是考察算法逻辑的首选。
结语
组帧是数据从抽象的比特流走向有组织的逻辑数据的第一步。理解了组帧,就理解了计算机网络中“分层”与“封装”的精髓——下一层为上一层服务,且对上一层的数据内容保持透明。