HDLC协议中接收端如何识别比特填充及序列真实类型?
HDLC比特填充识别与序列区分方法
一、HDLC比特填充的基本识别逻辑
HDLC用零比特填充解决数据字段与帧标志01111110(8位,含连续6个1)的混淆问题,规则很直接:
- 发送端:在数据里每碰到连续5个
1,就插一个0,确保数据里不会出现连续6个1,避免被误判为帧边界。帧标志本身是帧的起止标识,不属于数据,不用填充。 - 接收端:盯着比特流找连续的
1:- 碰到连续5个
1后,看紧接的下一个比特:如果是0,直接删掉(这是发送端插的填充位);如果是1,再看后面的比特——要是0,那就是帧标志;要是1,直接判定传输错误(合法序列里不会有连续7个1)。
- 碰到连续5个
二、针对011111010序列的两种情况区分
你收到的011111010(9位比特),要么是真实数据,要么是原始数据01111110经填充后的结果,区分方法看接收端处理后的上下文:
情况1:这是未经过填充的真实数据
意思是发送端发的原始数据就是011111010,连续5个1后面的0是数据本身的一部分,不是填充位。
- 接收端的判断过程:
检测到前5个1(第2到第6位)后,下一个比特是0(第7位)。按规则先删掉这个0,得到01111110。这时候看后续比特:如果01111110后面跟着10(也就是原序列的第8、9位),而且这个序列处于数据字段内部(前后都是正常数据,不是帧边界的上下文),那说明删掉的0不是填充位——因为如果是填充位,删完后得到的01111110是原始数据,而如果是真实数据,删完后会出现类似帧标志的序列,但上下文不支持它是帧边界,所以接收端会回退,把那个0加回去,整个序列当作真实数据处理。
情况2:这是原始数据01111110经填充后的结果
发送端的原始数据里有01111110,这个序列如果直接发会被误判为帧标志,所以发送端在连续5个1后插了一个0,把01111110变成了011111010。
- 接收端的判断过程:
同样先删掉0得到01111110,此时如果这个序列是数据字段的内容(比如上下文显示它在帧的数据部分,不是帧边界),或者结合帧长度、校验和等信息验证后符合原始数据的逻辑,就判定这个0是填充位,删掉后的01111110就是还原后的原始数据。
核心区分要点
两种情况的关键在于删除0后的序列是否符合帧结构的上下文逻辑:
- 要是删完得到的
01111110不符合帧边界的场景(比如在数据中间,前后都是正常数据),那这个0是真实数据的一部分,必须保留; - 要是删完后的序列作为原始数据合理(比如在数据字段内,且校验、长度都对),那就是填充后的结果,删除
0是正确操作。
另外,接收端还会用帧的校验和、预设长度等信息辅助判断,如果删除0后导致校验失败或长度异常,也会立刻回退,判定那是真实数据里的0。
内容的提问来源于stack exchange,提问作者mgiordi
相关产品推荐
相关产品推荐

