介绍
所谓封装成帧,就是指数据链路层给上层交付下来的协议数据单元添加帧头和帧尾,使之成为帧。
例如下图所示:
在帧头和帧尾中,包含有重要的控制信息,例如以太网版本2的MAC帧格式:
以及点对点协议PPP的帧格式 :
发送方的数据链路层将上层交付下来的协议数据单元封装成帧后,还要通过物理层将构成帧的各比特转换成电信号,发送到传输媒体 。
帧定界
PPP帧
那么接收方的数据链路层,如何从物理层交付的比特流中提取出一个个的帧呢?
实际上,帧头和帧尾的作用之一就是帧定界。例如这是PPP帧的格式:
在其帧头和帧尾中,各包含有一个长度为1字节的标志字段,其作用就是帧定界 。
假设发送方发送的是PPP帧,那么接收方的数据链路层就可以依据帧定界标志,从物理层交付的比特流中提取出一个个的帧。
需要说明的是,并不是每一种数据链路层协议的帧都包含有帧定界标志,例如在以太网版本2的MAC帧格式中,其帧头和帧尾中,并没有包含帧定界标志。
以太网帧
那么接收方又是如何从物理层交付的比特流中,提取出一个个的以太网帧呢?
实际上,以太网的数据链路层封装好MAC帧后,将其交付给物理层,物理层会在MAC帧前面添加8字节的前导码,然后再将比特流转换成电信号发送。
前导码中的前7个字节为前同步码,作用是使接收方的时钟同步,之后的1字节为帧开始定界符,表明其后面紧跟着的就是MAC帧。
另外以太网还规定了帧间间隔时间为96比特的发送时间,因此MAC帧并不需要帧结束定界符。
需要说明的是,帧间间隔还有其他作用,在后续文章中再进行介绍 。
透明传输
字节填充(字符填充)
接下来介绍透明传输的问题,
透明传输是指,数据链路层对上层交付的传输数据并没有任何限制,就好像数据链路层不存在一样。
我们来举例说明:
这是发送方数据链路层收到其上层交付的协议数据单元,给其添加帧头和帧尾,使其成为帧,为了简单起见,只画出了帧头和帧尾中的帧定界标志。
帧定界标志也就是一个特定数值,如果在上层交付的协议数据单元中恰好也包含了这个特定数值,接收方就不能正确接收该帧了。
如下图所示,接收方在收到第一个帧定界标志时,认为这是帧的开始,这并没有错误;当接收方再次接收到帧定界标志时,会误认为帧结束了,如果数据链路层不采取其他措施来避免接收方对帧是否结束的误判,就不能成为透明传输。
也就是说,数据链路层对上层交付的协议数据单元有限制,其内容不能包含帧定界符。很显然,这样的数据链路层没有什么使用价值。
实际上各种数据链路层协议一定会想办法来解决这个问题。例如在发送帧之前,对帧的数据部分进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符。
具体如下:
接收方数据链路层在物理层交付的比特流中提取帧遇到第一个帧定界符时,认为这是帧的开始,当遇到转义字符时,就知道其后面的1字节内容虽然与帧定界符相同,但它是数据而不是定界符。
请大家再来思考一下这种情况:在上层交付给数据链路层的协议数据单元中,既包含了帧定界符,又包含了转义字符,应该怎么处理呢?
方法仍然是在发送帧之前,对帧的数据部分进行扫描,每出现一个帧定界符或转义字符,就在其前面插入一个转义字符。
需要说明的是,转义字符是一种特殊的控制字符,其长度为1个字节,十进制值为27,而并不是E、S以及C这三个字符。
比特填充
我们刚刚介绍的是,面向字节的物理链路使用字节填充(或称字符填充)的方法来实现透明传输。
对于面向比特的电路,应该使用比特填充的方法来实现透明传输。
例如这是某个点对点协议的帧:
为了简单起见,在帧首部和尾部中仅给出了帧定界标志,而未给出其他控制字段。
而帧的数据部分出现了两个帧定界标志,但它们实际上是数据而不是帧定界:
在发送前可以采用0比特填充法对数据部分进行扫描,每五个连续的比特1后面就插入一个比特0。这样就确保了帧定界在整个帧中的唯一性,也就可以实现透明传输 。
接触方的数据链路层从物理层交付的比特流中提取帧时,将帧的数据部分中的每五个连续的比特1后面的那个比特0剔除即可。
比特填充习题
接下来我们来做一个有关0比特填充的练习题,这是计算机专业考研全国统考计算机网络部分2013年的题37:
题目中所给的高级数据链路控制协议HDLC,采用帧头和帧尾中的标志字段作为帧定界,其值为01111110,HDLC为了实现透明传输,采用0比特填充法。
也就是每5个连续一后面插入一个比特0,因此选项A正确。
MTU
最后还要注意一点,为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大一些。
如图所示:
帧的数据部分的长度应远大于帧头和帧尾的长度,这样才能提高帧的传输效率。
因为仅从数据链路层来看,帧的数据部分才是真正要传输的数据,帧头和帧尾是为了实现数据链路层功能而额外添加的。
当然,考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,称为最大传送单元MTU(Maximum Transfer Unit)。
END