Appearance
封装成帧与透明传输
考情分析
封装成帧和透明传输属于数据链路层的基础概念,408 中偶尔以选择题形式出现,通常考查各种成帧方法的区别以及位填充的具体操作。
考频:★★☆
封装成帧的目的
数据链路层从网络层拿到的是 IP 数据报,但物理层传输的是比特流。如果直接把数据丢给物理层,接收方根本分不清一个帧从哪里开始、到哪里结束。
封装成帧就是在数据前后分别加上帧头和帧尾,构成一个完整的帧(Frame)。帧头和帧尾中包含了帧定界的标志,让接收方能够从连续的比特流中准确识别出每一帧的边界。
帧 = 帧头 + 数据部分 + 帧尾
帧头和帧尾中还可以包含源地址、目的地址、帧类型、校验码等控制信息。
四种成帧方法
1. 字符计数法
在帧头用一个字段标明该帧的总字节数(包含计数字段本身)。
原理: 接收方读取计数值,就知道这一帧有多少字节,从而确定帧的边界。
致命缺陷: 如果计数字段在传输中出错,后续所有帧的边界都会错位,无法恢复同步。因此这种方法很少单独使用。
2. 字符填充法
使用特殊字符标记帧的开始和结束:
- SOH(Start Of Header):帧开始标志
- EOT(End Of Transmission):帧结束标志
透明传输问题: 如果数据部分恰好出现了与 SOH 或 EOT 相同的字节,接收方会误判帧边界。
解决方案——字符填充(转义字符):
- 数据中出现 EOT → 在其前面插入转义字符 ESC,变为
ESC EOT - 数据中出现 SOH → 在其前面插入转义字符 ESC,变为
ESC SOH - 数据中出现 ESC → 在其前面再插入一个 ESC,变为
ESC ESC
接收方的处理规则:遇到 ESC 就把它去掉,取后面的字符作为数据。
3. 零比特填充法(位填充法)
使用 01111110(即 0x7E)作为帧的开始和结束标志。这个标志也叫 Flag。
透明传输问题: 数据中可能出现连续 6 个 1,被误认为是 Flag。
解决方案——零比特填充:
- 发送方: 扫描数据部分,每遇到连续 5 个 1,就在后面自动插入一个 0
- 接收方: 每遇到连续 5 个 1,就自动删除其后的 0
这样数据部分永远不会出现连续 6 个 1,不会与 Flag 混淆。
示例:
原始数据: 011111 11010
↑ 5个1后插0
填充后: 0111110 11010
↑ 5个1后插0
再检查: 01111101 1010
↑ 这里只有2个1,不需要填充
最终发送: 0111110 1 1010更准确地逐步看:
原始数据: 1 1 1 1 1 1 1 0 1 0
位置: 1 2 3 4 5 6 7 8 9 10
第1-5位是连续5个1 → 在第5位后插入0:
结果: 1 1 1 1 1 0 1 1 0 1 04. 违规编码法
利用物理层编码中的"违规"信号来标记帧边界。例如曼彻斯特编码中,"高-高"和"低-低"是不会出现在正常数据中的,可以用它们来做帧定界。
这种方法只适用于特定编码方式,不通用。
四种方法对比
| 成帧方法 | 定界方式 | 透明传输 | 优点 | 缺点 |
|---|---|---|---|---|
| 字符计数法 | 帧头计数字段 | 天然透明 | 简单 | 计数出错则全部错位,无法恢复 |
| 字符填充法 | SOH/EOT 标志 | ESC 转义 | 能恢复同步 | 面向字符,与编码相关 |
| 零比特填充法 | 01111110 标志 | 5个1后加0 | 面向比特,通用性好 | 需要逐位扫描 |
| 违规编码法 | 违规信号 | 天然透明 | 不占用数据带宽 | 依赖特定编码 |
408 考试中最常考的是零比特填充法的具体操作过程。
易错点
1. 零比特填充是"5个1后加0",不是"6个1后加0"
Flag 是 01111110,包含 6 个连续 1。为了确保数据中不出现 6 个连续 1,在连续 5 个 1 后就插入 0。有些同学会搞成 6 个 1 后加 0,那就晚了——已经和 Flag 冲突了。
2. 字符填充中 ESC 本身也要转义
如果数据中出现 ESC 字符,不能不管它。否则接收方遇到 ESC EOT 时,无法区分这是"转义后的 EOT"还是"数据中的 ESC + 帧结束标志 EOT"。
3. 字符计数法的同步问题
字符计数法看起来最简单,但一旦计数字段传错,后续所有帧都会解析错误,而且无法重新同步。其他三种方法都能通过查找帧定界标志恢复同步。
高频考点清单
- 零比特填充的操作规则:连续 5 个 1 后插入 0
- 给定一段原始比特串,写出填充后的结果
- 四种成帧方法的对比(尤其是优缺点)
- 字符填充中转义字符的处理过程
- 透明传输的含义:数据中的任何比特组合都不会被误判为控制信息