两台主机通过一段链路互连。两台主机都会对所发送或接收的数据包,进行五个层次的封装或解封
- 主机将数据由上往下逐层封装,在各层中都添加上自己的协议首部,使之成为自己的协议数据单元
“封装成帧”
- 概念:数据链路层给上层交付的协议数据单元(即网络层协议数据单元),添加一个数据链路层协议首部(简称为帧头),再添加一个帧尾,此操作成为“封装成帧”
- 目的:帧头和帧尾中包含有重要的控制信息,添加帧头、帧尾的目的,都是为了在链路上,以帧尾单元来传送数据,也就是为了实现数据链路层本身的功能
从比特流中区分出帧
帧最后交付给物理层,将构成帧的各比特转换成电信号,发送到传输媒体。接收方的数据链路层如何从物理层交付的比特流中提取出一个个的帧呢?
帧定界标志
帧头和帧尾的作用之一就是帧定界
例如,PPP帧
- PPP帧的帧头和帧尾,各包含有一个长度为1字节的标志字段,其作用就是帧定界
- 比特流中红色部分是帧定界标志,接收方的数据链路层,就可以依据帧定界标志,从物理层交付的比特流中提取出一个个帧
物理层前导码
但并不是每一种数据链路层协议的帧都包含有帧定界标志。例如,以太网版本2的MAC帧
在其帧头和帧尾中并没有包含帧定界标志,那它的接收方是怎么区分帧的呢?
- 以太网的数据链路层封装好MAC帧之后,将其交付给物理层
- 物理层会在MAC帧前面,添加8字节的前导码;然后再将比特流转换成电信号发送
- 前导码中的前7个字节为前同步码,作用是使接收方的时钟同步
- 之后的1字节为帧开始定界符,表明其后面紧跟着的就是MAC帧
- 另外,以太网还规定了帧间间隔的时间为96比特的发送时间
因此,MAC帧并不需要帧结束定界符
透明传输的问题
透明传输:数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样
- 面向字节的物理链路,使用字节填充(或字符填充)的方法来实现透明传输
- 面向比特的物理链路,使用比特填充的方法来实现透明传输
例如,在使用帧定界标志(记为flag)的场景下
- 对上层所给的数据前后加上flag之后。在接收方发现,其收到的帧如下图所示。那么,接收方就不能正确接收该帧了。只会取到右侧的黄色块
- 如果数据链路层不采取其他措施,来避免接收方对帧是否结束的误判,就不能称之为透明传输。也就是说,数据链路层对上层交付的协议数据单元有限制(即其内部不能出现帧定界标志)。很显然,这样的数据链路层没有什么使用价值
实际上,各种数据链路层协议一定会想办法解决这个问题(透明传输的问题)
例如,面向字节的物理链路,会采用转移字符来解决
- 在发送帧之前,对帧的数据部分进行扫描,如果出现一个帧定界符(flag),就在其前面插一个转移字符
- 如果上层交付的数据单元中已经有了转移字符呢?那就再插一个转移字符
- 需要说明的是,转移字符是一种特殊的控制字符,其长度为1个字节,十进制值为27,而并不是图中的“ESC”
例如,面向比特的物理链路,采用比特填充来解决
- 这是某个点对点协议的帧。帧的数据部分,出现了两个帧定界标志,但它们实际上是数据,而不是帧定界。如果不做特殊处理,接收方也会接收错误,导致非透明传输
- 可以采用零比特填充法:对数据进行扫描,每5个连续的比特1后面就插入1个比特0。这样就确保了帧定界在整个帧中的唯一性。也就可以实现透明传输,接收层的数据链路层只需要将0剔除即可
帧数据部分的长度
为了提高帧的传输效率,应该使帧数据部分的长度尽可能大一些(即上层交给数据链路层的数据块要尽可能大)
- 因此仅从数据链路层来看,帧的数据部分才是真正要传输的数据
- 帧头和帧尾是为了实现数据链路层的功能而额外添加的
具体范围:
- 远大于帧头、帧尾长度
- 考虑到差错控制等多种因素,每一种数据链路层的协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Unit)