理解字节填充和零比特填充「终于解决」

理解字节填充和零比特填充「终于解决」https://juejin.im/post/6844904084525301773点对点协议PPP(PointtoPointProtocol)即点对点协议,运行在数据链路层,为在点对点连接上传输多协议数据包提供了一个标准方法。PPP将IP数据报封装成帧并以帧为单位串行传输。考虑这种情况:发送方向接收方传递了两个帧,但我们知道,实际上传递过去的是比特——即一堆1和0,作为接收方要怎么知道这堆1和0到底是一个还是两个或者三个甚至四个帧呢?使用定界符为了解决这个情况,我们需要在帧与帧之间使.

大家好,欢迎来到IT知识分享网。

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.

参考文献

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25166.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信