PP协议中的字节填充(Byte Stuffing)

1. 为什么需要字节填充?

  • PPP协议以帧(Frame)为单位传输数据,使用特定的标志字节(Flag)0x7E(二进制01111110)作为帧的开始和结束。
  • 如果数据部分中恰好包含0x7E,接收方会误认为帧提前结束,导致解析错误。类似地,控制字符(如0x7D)也可能干扰传输。
  • 字节填充的目的是透明传输,确保数据中的特殊字符不会被误解释。

2. 填充规则

  • 特殊字符处理:
    • 当数据中出现0x7E(标志字节)时,替换为0x7D 0x5E0x7D是转义字符,0x5E0x7E的异或结果)。
    • 当数据中出现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(用于标记填充)。
  • 关键替换:原始字节替换后字节0x7E0x7D 0x5E0x7D0x7D 0x5D<0x200x7D (byte ^ 0x20)

5. 示例流程

  • 发送方:
    1. 数据:[0x30, 0x7E, 0x40]
    2. 填充后:[0x30, 0x7D, 0x5E, 0x40]
    3. 加头尾标志:[0x7E, 0x30, 0x7D, 0x5E, 0x40, 0x7E]
  • 接收方:
    1. 去掉头尾0x7E,检测到0x7D 0x5E → 还原为0x7E
    2. 最终数据:[0x30, 0x7E, 0x40]

字节填充确保了PPP帧的透明传输,避免数据中的特殊字符干扰帧边界识别。