组帧

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

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

帧(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”编码为“低 - 高”电平对,而“高 - 高”电平对和“低 - 低”电平对是没有被使用的,所以可以用这两个电平进行帧定界。

编码方式详见 编码和调制