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)。
- 当数据中出现
- 填充示例:
- 原始数据:
A0x7EB0x7DC - 填充后:
A0x7D0x5EB0x7D0x5DC
- 原始数据:
3. 接收方的解填充
- 接收方检测到
0x7D时,将其后的字节与0x20异或(或直接替换为0x7E/0x7D),恢复原始数据。 - 例如:
- 收到
0x7D 0x5E→ 替换为0x7E。 - 收到
0x7D 0x5D→ 替换为0x7D。
- 收到
4. 总结
- 转义字符:
0x7D(用于标记填充)。 - 关键替换:原始字节替换后字节
0x7E0x7D 0x5E0x7D0x7D 0x5D<0x200x7D (byte ^ 0x20)
5. 示例流程
- 发送方:
- 数据:
[0x30, 0x7E, 0x40] - 填充后:
[0x30, 0x7D, 0x5E, 0x40] - 加头尾标志:
[0x7E, 0x30, 0x7D, 0x5E, 0x40, 0x7E]
- 数据:
- 接收方:
- 去掉头尾
0x7E,检测到0x7D 0x5E→ 还原为0x7E。 - 最终数据:
[0x30, 0x7E, 0x40]
- 去掉头尾
字节填充确保了PPP帧的透明传输,避免数据中的特殊字符干扰帧边界识别。