3.1数据链路层的概述
概念
链路就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
数据链路是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路。
数据链路层以帧为单位传输和处理数据。
网络中的主机、路由器等都必须实现数据链路层

从层次上看数据的流动

从数据链路层观察帧的流动

数据链路层使用的信道
数据链路层属于计算机网路的低层。
数据链路层使用的信道主要有以下两种类型:
- 点对点信道
- 广播信道
局域网属于数据链路层
局域网虽然是个网络。但我们并不把局域网放在网络层中讨论。这是因为在网络层要讨论的是多个网络互连的问题,是讨论分组怎么从一个网络,通过路由器,转发到另一个网络。
而在同一个局域网中,分组怎么从一台主机传送到另一台主机,但并不经过路由器转发。从整个互联网来看,
局域网仍属于数据链路层的范围

数据链路层的三个重要问题(使用点对点信道的数据链路层举例)
- 封装成帧
两台主机通过一段链路互连。两台主机都会对所发送或接受的数据包进行五个层次的封装和解封。我们将数据链路层给网络层交付的协议数据单元添加帧头和帧尾的操作,称为封装成帧。
添加帧头和帧尾的目的都是为了在链路上以帧为单元来传送数据。

- 差错检测
在传输过程中,帧可能遭遇干扰会出现误码(例:比特0变成比特1。接收方可以通过检错码判断是否出现误码现象。发送放在发送数据之前基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾。
接收方根据帧尾中的检错码就能检测帧中是否有误码。
- 可靠传输
接收方主机收到有误码的帧后,不会接收改帧,将其丢弃。
如果数据链路层向其上层提供的是不可靠服务,直接丢弃。
如果数据链路层向其上层提供的是可靠服务, 需要确保接收方主机可以重新收到被丢弃的这个帧的正确副本。

使用广播信道的数据链路层(除了上述三个问题还有其他问题
1.如图所示,主机A,B,C,D,E通过一根总线进行互连,主机A要给主机C发送数据,代表帧的信号会通过总线传输到总线上的其他各主机,那么主机B,D,E如何知道所收到的帧不是发送给她们的,主机C如何知道发送的帧是发送给自己的。
可以将帧的目的地址添加在帧中一起传输。

2.当总线上多台主机同时使用总线来传输帧时,传输信号会产生碰撞,是不可避免的。
解决:例以太网的媒体接入控制协议CSMA/CD
随着技术的发展,交换技术的成熟,
在 有线(局域网)领域 使用点对点链路和链路层交换机的交换式局域网取代了共享式局域网
在无线局域网中仍然使用的是共享信道技术
3.2封装成帧
封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧。
- 帧头和帧尾中包含有重要的控制信息。
- 帧头和帧尾的作用之一就是帧定界。(但并不是每一种数据链路层协议的帧都包含有帧定界标志
- 前同步码:作用是使接收方的时钟同步
- 帧开始定界符:表明其后面紧跟着的就是MAC帧
(
另外以太网还规定了帧间间隔为96比特时间,因此,MAC帧不需要帧结束定界符

透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
- 帧界定标志也是个特定的数据值,如果在上层交付的协议数据单元中,恰好也包含这个特定数值,接收方就不能正确接收。
- 面向字节的物理链路使用字节填充(或称字符填充)的方法实现透明传输。
- 面向比特的物理链路使用比特填充(或称字符填充)的方法实现透明传输。
(在发送前采用零比特填充法,对数据部分进行扫描,每5个连续的比特1后面就插入1个比特0,这样就确保了帧定界在整个帧中的唯一性,)
数据链路层对上层交付的协议数据单元有限制,其内容不能包含帧定界符。
解决透明传输问题

- 解决办法:面向字节的物理链路使用字节填充或字符填充,面向比特的物理链路使用比特填充的方法实现透明传输
- 发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B)
- 接收端的数据链路层在将数据送往网络层之前删除插入的转移字符。
- 如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大些。帧的数据部分的长度应远大于帧头和帧尾的长度,这样才能提高帧的传输效率。
- 因为仅从数据链路层来看帧的数据部分才是真正要传输的数据,帧头和帧尾是为了实现数据链路层功能而额外添加的。
考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU。

总结

3.3差错检测
概念
- 实际的通信链路都不是理想的,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1.这称为比特差错。
- 在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER。
- 使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。

奇偶校验
- 在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中“1”的个数为奇数(奇校验)或偶数(偶校验)。
- 如果奇数个位发生误码,则奇偶性发生变化,可以检查出误码;
- 如果有偶数个位发生误码,则奇偶性不发生变化,不能检查出误码(漏检);
奇偶校验出现漏检概率比较高,因此数据链路层一般不采用这种方式

循环冗余校验CRC
- 收发双方约定好一个生成多项式G(x);
- 发送方基于待发送的数据和生成多项式计算出差错检错码(冗余码),将其添加到待传输数据的后面一起传输;
- 接收方通过生成多项式来计算收到的数据是否产生了误码;


例子

总结
- 检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。
- 要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用。
- 循环冗余校验CRC具有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。
- 在计算机网络中通常采用我们后续课程中将要讨论的检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。