- 数据链路层的任务是:解决分组在一个网络(或一段链路)上传输的问题。
3.1 数据链路层概述
数据链路
如下图所示是主机 H1 向主机 H2 发送数据的数据流动全过程:

但是在这一章我们关注的是数据链路层,所以我们可以假定数据包只在数据链路层从左向右沿水平方向传送,于是上图中的数据传输过程就可以看成是在 4 段不同的链路上的通信组成的,如下图所示:

所谓链路,就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
数据链路:把实现通信协议的硬件和软件加到链路上,就构成了数据链路。
数据链路层以帧为单位传输和处理数据。
数据链路层的三个重要问题
封装成帧
封装成帧:将网络层交付给数据链路层的协议数据单元 PDU 添加帧头和帧尾的操作。

差错检测
源主机在向目的主机 “发送帧” 的过程中,可能会出现误码,出现的误码可以通过帧尾的检测码和编写的检测算法来检测,即检测帧在传输的过程中是否出现误码。

可靠传输
尽管误码是不能完全避免的,但若能实现发送方发送什么,接收方就收到什么,就称为可靠传输。

注意:以上所述的三个问题是用点对点信道的数据链路层来举例的,而对使用广播信道的数据链路层(共享式局域网)来说,还有以下问题:
- 对连接在同一条总线上的主机,需要对它们进行编址以确定发送一个帧的源主机以及将该帧发送到的目的主机(帧头中含有源地址和目的地址);
- 需要处理总线使用的 “碰撞问题” (以太网的媒体接入 CSMA/CD 控制协议)。
如今,使用的是点对点链路和链路层交换机的交换式局域网。

★3.2 封装成帧
封装成帧
封装成帧:数据链路层给网络层交付的协议数据单元 PDU 添加帧头和帧尾使之成为帧的操作。

帧头和帧尾中包含有重要的控制信息,帧头和帧尾的作用之一就是帧定界:目的主机从接收到的比特流中提取出一个个帧来。
但这是 PPP 帧的格式,对以太网 V2 的 MAC 帧来说,并不是用帧头和帧尾来让目的主机从接收到的比特流中提取出一个个帧的,而是会在物理层会给数据链路层传过来的帧添加一个前导码,目的主机是通过这个前导码来实现提取出 MAC 帧的。

透明传输
透明传输:数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。

为了实现数据链路层的透明传输,则对网络层协议数据单元中和帧头帧尾的标识符相同的部分来说,需要进行填充的方法,如上图中提到的字节填充和比特填充。


3.3 差错检测
差错
比特差错:实际的通信链路都不是理想的,比特在传输的过程中可能会产生差错,1 可能会变成 0,0 也可能会变成 1。
在一段时间内,传输错误的比特占所传输比特的总数的比率称为误码率 BER(Bit Error Rate)。
我们可以使用差错检测码来检测数据在传输过程中是否出现了比特差错,如下图所示,以太网 V2 的帧尾中的 FCS 和 PPP 帧的帧尾中的 FCS 就是帧检验序列。(FCS:Frame Check Sequence,帧校验序列)

差错检测
奇偶校验
在待发送的数据后面添加 1 位奇偶校验位,使整个数据(包括所添加的校验位在内)中 “1” 的个数为奇数(奇校验)或偶数(偶校验)。
对奇偶校验法,如果有奇数个位发生误码,则奇偶性发生变化,可以检查出误码;如果有偶数个位发生误码,则奇偶性不发生变化,不能检查出误码(漏检)。
★循环冗余校验


- 发送方:

- 接收方:

注意:检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。如果想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错,但纠错码的开销比较大,在计算机网络中较少使用。

附:二进制模2除法
- 二进制模2除法的运算规则:
- 被除数为1则商为1,被除数为0则商为0;
- 余数去掉首位为新的被除数;
- 新的被除数以0开头,则除数变为全0,以1开头则除数不变;