组帧

掌握几种组帧方法,重点掌握首位定界字符法、零比特填充法,可能在选择题中考察。

数据链路层的主要功能就是组帧

帧(frame)代表数据链路层的数据发送单位,在接收到来自于网络层的报文(packet)时如何为其添加帧头和帧尾,并且以何种方式进行帧定界(接收方区别连续不同的帧)。

组帧的关键就在于帧定界,也就是对于接收方来说,它能够以某种方式区分连续收到的不同帧。 从这个角度出发,组帧方式可以被分为以下几种:

字符计数法

字符计数法在帧首部使用计数字段来表明帧内字符数量。

当接收方读取帧时,根据读取帧开头的一部分内容,即可得知当前帧的长度是多少,这样就

5
6
7
8
9
8
0
1
2
3
4
5
6
5
4
5
6
7
5
1
2
3
4
字符计数法
Frame 1
5 Characters
Frame 2
5 Characters
Frame 3
8 Characters
Frame 4
5 Characters
字符数量

首位定界字符法

首位定界字符法即 使用特殊控制字符标志帧的开始和结束

但是使用这种方式可能出现如下问题:就是 首位定界字符 可能会在帧内部出现,这个时候就会造成歧义。

所以当特殊字符出现在帧的数据部分时,需要用转义字符ESC来对特殊字符进行转义,同样,ESC出现在数据部分同样需要转义。

Payload Field
Trailer
FLAG
FLAG
Header
A
FLAG
B
A
FLAG
B
ESC
A
ESC
B
A
ESC
B
ESC
A
ESC
B
FLAG
A
ESC
B
ESC
FLAG
ESC
首尾定界字符法
定界字符
帧的格式
定界字符
帧的原始数据
经过转义之后的数据

以上图为例,假设我们使用 FLAG 作为首位定界字符的话(注意这里 FLAG 只是字符名称,不是表示字符是 FLAG),那么当 FLAG 出现在数据部分时,我们需要对 FLAG 进行转义,需要注意的是,因为我们使用 ESC 作为转义字符,所以当数据中出现 ESC 时,我们也需要对转义字符自己进行转义。

零比特填充法

零比特填充法(Bit Stuffing)与首位定界字符法思路类似。

01111110 作为一个新的数据帧的开头,这里的关键在于要对数据帧内容中与 01111110 相同的部分进行转义,转义的方式是如果碰到11111,就在后边添加一个0,接收方在处理接收到的数据时,需要进行反向处理,如果在数据部分碰到111110时,就要删除这个0。

在传送的比特流中可以传送任意比特组合,而不会引起对帧边界的判断错误。零比特填充法很容易由硬件来实现,性能优于字符填充法。

对于零比特填充法,需要记住 01111110 这种开头的比特填充方式 以及 具体如何进行转义。

Frame
0111 1110
Frame
0111 1110
0111101111110001
01111011111010001
零比特填充法
Frame 1
Frame 2
帧的原始数据
转义后数据
发送方在连续5个1之后填充一个0
接收方进行反向处理,得到原始数据

违规编码法

违规编码法(Physcial Layer Coding Violations)使用特殊电平进行定界。比如,曼彻斯特编码将数据比特“1”编码为“高-低”电平,将比特“0”编码为“低-高”电平对,而“高-高”电平对和“低-低”电平对是没有被使用的,所以可以用这两个电平进行帧定界。

编码方式详见 编码和调制