字节填充与0比特填充以及数据链路的基本问题

简介: 字节填充与0比特填充以及数据链路的基本问题

首先介绍一下PPP的帧结构:


首部的第一个字段和尾部的第二个字段都是标志字段F(Flag),规定为0x7E (符号“0x”表示它后面的字符是用十六进制表示的。十六进制的 7E 的二进制表示是 01111110)。标志字段表示一个帧的开始或结束。因此标志字段就是 PPP 的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。


首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为0x03(即00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带 PPP帧的信息。


PPP首部的第四个字段是 2字节 的协议字段。当协议字段为 0x0021 时,PPP 的信息字段就是IP 数据报。若为 0xC021,则信息字段是 PPP 链路控制协议 LCP 的数据,而0x8021表示这是网络层的控制数据。

信息字段的长度是可变的,不超过 1500字节。


尾部中的第一个字段(2字节)是使用CRC的检验序列FCS。

字节填充:

当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。


PPP的异步传输中,转义字符为0x7D,规则如下:


(1)把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E)。


(2)若信息字段中出现一个 0x7D 的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D,0x5D)。


(3)若信息字段中出现 ASCII码的控制字符(即数值小于0x20 的字符),则在该字符前面要加入一个0x7D 字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列(0x7D,0x23)。

由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。


举个例子:


一个PPP帧的数据部分(用十六进制写出)是7D 5E FE 27 7D 5D 7D 5D 65 7D 5E。试问真正的数据是什么(用十六进制写出)( )


答案:7E FE 27 7D 7D 65 7E


比特填充:

PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP 协议采用零比特填充方法来实现透明传输。


零比特填充的具体做法是:在发送端,先扫描整个信息字段(通常用硬件实现,但也可用软件实现,只是会慢些)。只要发现有 5 个连续 1,则立即填入一个0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现 6个连续 1。接收端在收到一个帧时,先找到标志字段 F 以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现 5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流。这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。

举个例子:

PPP协议使用同步传输技术传送比特串0110111111111100。试问经过零比特填充后变成怎样的比特串?若接收端收到的PPP帧的数据部分是0001110111110111110110,问删除发送端加入的零比特后会变成怎样的比特串?


发送端的数据01101111111111(10个1)00经过零比特填充是


011011111(5个1)011111(5个1)000


接收端收到的000111011111(5个1)011111(5个1)0110删除零后是


0001110111111111111(12个1)0


注:这里可以类比到数据链路的透明传输的实现


数据链路有三个基本问题

封装成帧,透明传输,差错检测


1.封装成帧

封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识帧的开始和结束。我们知道,分组交换的一个重要概念就是:所有在互联网上传送的数据都以分组(即 IP 数据报)为传送单位,网络层的 IP 数据报传送到数据链路层就成为的数据部分。在帧的数据部分的前面和后分别添加上首部和尾部,构成了一个完整的帧。这样的帧就是数据链路层的数据传送单元。


一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。


例如:PPP在异步传输的标志字段(7E),在同步传输中的标志字段(F)以及以太网的标志字段10101011/AB


此外,首部和尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有明确的规定。显然,为了提高帧的传输效率,应当使帧的数据部分长度尽可能地大于首部和尾部的长度。但是,每一种链路层协议都规定了所能传送的帧的数据部分长度上限一最大传送单元MTU(Maximum Transfer Unit)。

当数据是由可打印的 ASCII 码组成的文本文件时,定界可以使用特殊的帧定界符。我们知道,ASCII

码是 7位编码,一共可组合成 128 个不同的 ASCII 码,其中可打印的有95 个,而不可打印的控制字符有 33个。控制字符 SOH(Start Of Header)放在一帧的最前面,表示的首部开始。另一个控制字符 EOT (End OfTransmission)表示帧的结束。请注意,SOH 和 EOT 都是控制字符的名称。它们的十六进制编码分别是 01(二进制是 00000001) 和 04(二进制是 00000100)。SOH(或EOT)并不是S,O,H(或EOT)三个字符。

当数据在传输中出现差错时,帧定界符的作用更加明显。假定发送端在尚未发送完一个帧时突然出

故障,中断了发送。但随后很快又恢复正常,于是重新从头开始发送刚才未发送完的帧。由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧(只有首部开始符 SOH 而没有传输结束符 EOT,必须丢弃。而后面收到的数据有明确的帧定界符(SOH和EOT),因此这是一个完整的帧,应当收下。


2.透明传输

由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何 8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。


当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像SOH或 EOT 这样的定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的顿中传输过去,因此这样的传输就是透明传输。

但当数据部分是非 ASCII 码的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某个字节的二进制代码恰好和 SOH 或 EOT 这种控制字符一样,数据链路层就会错误地“找到的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符 SOH)。

像图中所示的帧的传输显然就不是“透明传输”,因为当遇到数据中碰巧出现字符“EOT”时就传不过去了。数据中的“EOT”将被接收端错误地解释为“传输结束”的控制字符,而在其后面的数据因找不到“SOH”被接收端当作无效帧而丢弃。但实际上在数据中出现的字符“EOT”并非控制字符而仅仅是二进制数据00000100。

为了解决透明传输问题,就必须设法使数据中可能出现的控制字符“SOH”和“EOT”在接收端不被解释为控制字符。具体的方法是:


发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stufing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。

3.差错检测

差错检测就是在信息部分后面添加检错的冗余码,称为帧检测序列(FCS),我们在数据链路层广泛使用的是CRC循环冗余校验的方法,


注:


我们现在并没有要求数据链路层向网络层提供“可靠传输”的服务。


所谓“可靠传输”就是:数据链路层的发送端发送什么,在接收端就收到什么。传输差错可分为两大类:一类就是前面所说的最基本的比特差错,而另一类传输差错则更复杂些,这就是到的帧并没有出现比特差错,但却出现了帧丢失、帧重复或帧失序。例如,发送方连续传议三个帧:


[#1]-[#2]-[#3]。


假定接收端收到的每一个帧都没有比特差错,但却出现下面的几种情况:


帧丢失:收到[#1]-[#3](丢失[#2])。

帧重复:收到[#1]-[#2]-[#2]-[#3](收到两个[#2])。

帧失序:收到[#1]-[#3]-[#2](后发送的反而先到达了接收端,这与一般数据链路层的传输概念不一样)。


以上三种情况都属于“出现传输差错”,但都不是这些帧里有“比特差错”。“无比特差错”与“无传输差错”并不是同样的概念。在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。

我们知道,过去 OSI的观点是:必须让数据链路层向上提供可靠传输。因此在 CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法:

•对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,运输层的TCP协议)来完成。

•对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务。即ARQ机制:



目录
相关文章
|
8天前
计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
14 0
|
1月前
|
测试技术
填充‘?’01串(字节面试题)
填充‘?’01串(字节面试题)
|
1月前
|
关系型数据库 MySQL 数据库
宽字节注入讲解
宽字节注入讲解
25 1
|
1月前
|
数据库
22、宽字节注入
22、宽字节注入
15 0
|
1月前
|
关系型数据库 MySQL 数据库
宽字节注入
宽字节注入
10 1
|
10月前
|
SQL 安全 程序员
宽字节注入详解
宽字节注入详解
|
C++ iOS开发
【C++之标准类型数据的格式输出1】输入一批数值,要求保留3位小数,且上下行小数点对齐
【C++之标准类型数据的格式输出1】输入一批数值,要求保留3位小数,且上下行小数点对齐
16:计算线段长度
16:计算线段长度
121 0
|
存储
字符串按照固定长度分割并存储在数组
字符串按照固定长度分割并存储在数组
138 0
|
存储 缓存 编译器
windows编程 为什么要用宽字节
windows编程 为什么要用宽字节
289 0
windows编程 为什么要用宽字节

热门文章

最新文章