理解字节填充和零比特填充

https://juejin.im/post/6844904084525301773

点对点协议

PPP(Point to Point Protocol)即点对点协议,运行在数据链路层,为在点对点连接上传输多协议数据包提供了一个标准方法。PPP将IP数据报封装成帧并以帧为单位串行传输。

考虑这种情况:

发送方向接收方传递了两个帧,但我们知道,实际上传递过去的是比特——即一堆1和0,作为接收方要怎么知道这堆1和0到底是一个还是两个或者三个甚至四个帧呢?

使用定界符

为了解决这个情况,我们需要在帧与帧之间使用定界符以区分不同的帧,PPP使用0x7E(01111110)作为这个定界符,即路由器检测到某个字节为0x7E就说明上个帧传输结束,开始下个帧的传输。但如果就这样的话似乎又会引起新的问题呢?

考虑这种情况:

我们的数据中存在0x7E,路由器就会把它误认为定界符,那岂不是会导致帧传输出现错误吗?

字节填充和零比特填充

要解决这个问题,最容易想到的方法就是对传输的数据进行“转义”——传输时发送方按规则对数据(如0x7E)进行修改,接收方反规则将数据恢复原样并交给网络层。而针对异步传输和同步传输,我们分别使用字节填充和零比特填充来修改数据。不过异步传输和同步传输又是什么呢?

异步传输和同步传输

异步传输将帧分成小组(如一个字节作为一个小组),以小组为单位进行传输,在小组与小组之间可以传递其他数据。同步传输则一口气将整个帧发送过去。

字节填充

当PPP使用异步传输时,我们使用0x7D(01111101)作为转义符,转义的规则如下:

  • 把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)。
  • 若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把转义字符0x7D转变为2字节序列(0x7D,0x5D)。
  • 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列的(0x7D,0x31)。

其中一二点很好理解,分别对定界符和转义符进行修改(如果不理解第二点,考虑数据中出现0x7D,0x5E的情况),但为什么要对ASCII码中的控制字符也进行修改呢?

这是因为异步链路中,有些串行接口驱动程序或MODEM需要使用ASCII码中的控制字符,所以需要对这些字符进行转义处理。

不过大多数情况下并不是这个范围内的所有字符都作为控制字符,因此可以通过LCP(Link Control Protocol)与对端协商,本端将哪些字符作为控制字符处理,请对端将这些字符转义后发送。

LCP —— Link Control Protocol,一个用来建立、配置和测试数据链路链接的链路控制协议,非本篇介绍重点,详情请参阅书籍。

零比特填充

当PPP使用同步传输时(这种情况在SONET/SDH链路上使用PPP时出现),使用零比特填充来实现透明传输。

零比特填充相较字节填充要简单得多,0x7E的二进制表示是01111110,因此只要在每出现5个1时插入一个0就可以避免在数据中出现0x7E.

参考文献
  • 27
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值