在 HDLC 协议的成帧中,假设接收器收到以下位串:
[…]01111010[…]
如何判断序列“01111010”是真实数据,还是对原始标志序列“01111110”进行位填充操作的结果?
接收者如何识别这两个不同的选项?
首先,你举的例子并不正确。零插入在 Five 之后,而不是设置为 1
的
four位,所以您的意思是
011111010
。
简单。没有两个选择。帧中的原始数据不允许使用序列
01111110 (0x7E)
,即它是为标志保留的。因此,当位填充时,只有data位序列受到影响,而不是flag位序列。这样任何连续 5 个的序列绝对不是标志序列。
--(参考见下文)请注意,标志字符的位模式为 01111110(六个 1 位的连续序列),位填充会安排在除标志字符本身以外的位置出现的任意五个 1 位的连续字符串之后插入 0 位.
当
字节填充时,数据中发现的任何0x7E
都会被2字节
0x7D5E
替换,其中
0x7D
在放入帧之前充当转义字符。请参阅
K.R.Fall 和 W.R.Stevens (2012),TCP/IP 图解卷 1:协议,第 2 版,Addison-Wesley,第 131 页了解整个过程:
在使用类 HDLC 成帧的常见情况下,PPP 帧格式被两个包含固定值 0x7E 的 1 字节标志字段包围。点对点链路两端的两个站使用这些字段来查找帧的开头和结尾。如果值 0x7E 本身出现在帧内,则会出现一个小问题。这可以通过两种方式之一进行处理,具体取决于 PPP 是在异步链路上运行还是在同步链路上运行。对于异步链路,PPP 使用字符填充(也称为字节填充)。如果标志字符出现在帧中的其他位置,则将其替换为 2 字节序列 0x7D5E(0x7D 称为“PPP 转义字符”)。如果转义字符本身出现在帧中,则将其替换为 2 字节序列 0x7D5D。因此,接收方在收到后将 0x7D5E 替换为 0x7E,将 0x7D5D 替换为 0x7D。在同步链路(例如,T1 线路、T3 线路)上,PPP 使用位填充。请注意,标志字符的位模式为 01111110(六个 1 位的连续序列),位填充会安排在除标志字符本身以外的位置出现的任何五个 1 位的连续字符串之后插入一个 0 位。这样做意味着字节可能会以超过 8 位的形式发送,但这通常是可以的,因为串行处理硬件的低层能够“解填充”比特流,将其恢复到预填充模式。