封装成帧的学习
在HDLC协议中,比特填充(Bit Stuffing)是防止数据部分与帧的标志(01111110
)发生冲突的一种方法。具体来说,如果在数据中出现五个连续的1
,为了避免这个模式与帧的开始和结束标志冲突,就会在后面自动插入一个0
,这就是所谓的“每5个连续的1后面加一个0”。
比特填充的具体规则
-
在数据传输过程中,每当出现五个连续的
1
时,自动在其后面插入一个0
。 -
接收端在接收到数据时会检查是否有连续的五个
1
,并将其后的0
去除,恢复原始数据。
举个例子
假设原始数据是:1111101111011
-
在这段数据中,第一次出现五个连续的
1
,位于111110
。按照比特填充规则,在其后加一个0
,变为1111100
。 -
继续检查后面的数据:
1111011
。第二次出现五个连续的1
,在其后加一个0
,变为11110101
。
因此,经过比特填充后的数据为:1111100111101011
。
接收端处理
接收端收到数据后,会对比特流进行处理,检查是否存在五个连续的1
并去除其后的0
。对于上面的数据,接收端会:
-
发现
1111100
,去掉后面的0
,恢复为111110
。 -
发现
11110101
,去掉后面的0
,恢复为1111011
。
最终恢复的原始数据为:1111101111011
。
字节填充(Byte Stuffing)是一种类似于比特填充的技术,用于确保数据在传输过程中不会误被当作帧的边界。与比特填充不同,字节填充是以字节为单位来进行数据的透明处理,常见于协议中如PPP(点对点协议)或HDLC(高层数据链路控制协议)中。
字节填充的规则
字节填充的主要目的是避免数据中出现与控制字节(例如帧的起始标志或结束标志)相同的字节模式。假设在HDLC协议中,使用特定的字节(如0x7E
)作为帧的起始标志和结束标志。如果在数据部分中出现了0x7E
这个字节,就需要使用字节填充来避免数据和控制信息发生冲突。
具体规则如下:
-
特殊字节替换:
-
当数据中出现特殊字节(例如HDLC的帧标志
0x7E
或转义字节0x7D
)时,这些字节会被替换成一个转义字节和一个特定的字节组合。 -
比如,如果数据中出现了
0x7E
,它会被替换为两个字节:0x7D 0x5E
。而如果数据中出现了0x7D
,它会被替换为0x7D 0x5D
。
-
-
接收端恢复:
-
接收端收到字节填充后的数据后,会检查是否有
0x7D
字节。如果有,它会将下一个字节与0x7D
一起解析,并还原成原始的特殊字节(0x7E
或0x7D
)。
-
举个例子
假设传输的数据是:
0x7E 0x12 0x34 0x7D 0x56 0x7E
在字节填充过程中:
-
第一个
0x7E
会被替换成0x7D 0x5E
。 -
0x7D
会被替换成0x7D 0x5D
。 -
第二个
0x7E
会被替换成0x7D 0x5E
。
因此,经过字节填充后的数据变为:
0x7D 0x5E 0x12 0x34 0x7D 0x5D 0x56 0x7D 0x5E
接收端的处理
接收端收到填充后的数据:
0x7D 0x5E 0x12 0x34 0x7D 0x5D 0x56 0x7D 0x5E
接收端会检查0x7D
字节并进行还原:
-
0x7D 0x5E
被还原为0x7E
。 -
0x7D 0x5D
被还原为0x7D
。 -
0x7D 0x5E
被还原为0x7E
。
最终恢复的原始数据为:
0x7E 0x12 0x34 0x7D 0x56 0x7E