组帧
1. 字符计数法 (Character Count Method)
示例: 假设有四个帧,长度分别为 5、5、8、8(包含计数字段本身)。
- 发送数据:
[5] A B C D[5] E F G H[8] I J K L M N O(注:括号内的数字代表计数字段)
简单但是脆弱
2. 字符填充法 (Character Stuffing / Byte Stuffing)
原理:
这种方法使用特定的控制字符来作为帧的起始和结束定界符(例如使用 SOH 表示帧首,EOT 表示帧尾)。
为了防止数据载荷中恰好出现了与定界符相同的字符(导致接收方误判为帧结束),发送方会在数据段中出现的特定控制字符前,插入一个 转义字符(ESC) 。接收方在遇到 ESC 时,会将其删除,并把紧随其后的字符视为普通数据。
填充规则:
- 数据中出现定界符(如
EOT) 替换为ESC EOT - 数据中出现转义字符本身(
ESC) 替换为ESC ESC
示例:
- 原始数据:
ABESCCEOTD - 填充后发送的帧:
SOHABESC ESCCESC EOTDEOT
比较好,但是如果是二进制代码处理起来效率较低
3. 零比特填充法 (Zero-Bit Stuffing / Bit Stuffing)
原理:
这是目前最流行、也是最安全的组帧方法之一(广泛应用于 HDLC 和 PPP 协议中)。它不再以“字节”为单位,而是以“比特(Bit)”为单位进行操作。
它使用一个特定的位模式 01111110 (即 )作为帧的起始和结束标志。
填充规则(“遇5个1填0”):
- 发送方: 扫描整个数据载荷(不包括首尾标志),只要发现有 5个连续的
1,就立即在其后自动插入一个0。这样可以保证数据部分绝对不会出现01111110这个标志。 - 接收方: 在收到数据时,先找到帧定界符。然后在数据载荷中,每当发现 5个连续的
1时,就自动将其后紧跟的0删除,从而恢复出原始数据。
示例:
- 原始数据比特流:
011011111100011111010 - 发送方填充后:
01101111101000111110010 - 最终传输的帧:
01111110(标志) +01101111101000111110010+01111110(标志)
打破ASCILL编码限制,实现二进制传输