PP协议中的字节填充(Byte Stuffing)
1. 为什么需要字节填充?
- PPP协议以帧(Frame)为单位传输数据,使用特定的标志字节(Flag)
0x7E
(二进制01111110
)作为帧的开始和结束。 - 如果数据部分中恰好包含
0x7E
,接收方会误认为帧提前结束,导致解析错误。类似地,控制字符(如0x7D
)也可能干扰传输。 - 字节填充的目的是透明传输,确保数据中的特殊字符不会被误解释。
2. 填充规则
- 特殊字符处理:
- 当数据中出现
0x7E
(标志字节)时,替换为0x7D 0x5E
(0x7D
是转义字符,0x5E
是0x7E
的异或结果)。 - 当数据中出现
0x7D
(转义字符本身)时,替换为0x7D 0x5D
。 - 若数据中的ASCII控制字符(如
< 0x20
)需要转义,则替换为0x7D
后跟原字符异或0x20
(例如0x01
→0x7D 0x21
)。
- 当数据中出现
- 填充示例:
- 原始数据:
A
0x7E
B
0x7D
C
- 填充后:
A
0x7D
0x5E
B
0x7D
0x5D
C
- 原始数据:
3. 接收方的解填充
- 接收方检测到
0x7D
时,将其后的字节与0x20
异或(或直接替换为0x7E
/0x7D
),恢复原始数据。 - 例如:
- 收到
0x7D 0x5E
→ 替换为0x7E
。 - 收到
0x7D 0x5D
→ 替换为0x7D
。
- 收到
4. 总结
- 转义字符:
0x7D
(用于标记填充)。 - 关键替换:原始字节替换后字节
0x7E
0x7D 0x5E
0x7D
0x7D 0x5D
<0x20
0x7D (byte ^ 0x20)
5. 示例流程
- 发送方:
- 数据:
[0x30, 0x7E, 0x40]
- 填充后:
[0x30, 0x7D, 0x5E, 0x40]
- 加头尾标志:
[0x7E, 0x30, 0x7D, 0x5E, 0x40, 0x7E]
- 数据:
- 接收方:
- 去掉头尾
0x7E
,检测到0x7D 0x5E
→ 还原为0x7E
。 - 最终数据:
[0x30, 0x7E, 0x40]
- 去掉头尾
字节填充确保了PPP帧的透明传输,避免数据中的特殊字符干扰帧边界识别。