以下是湖科大计算机网络公开课的笔记
1 . 数据链路层概述
1.1 一些概念
链路(Link)就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点
数据链路(Data Link) 是指实现通信协议的硬件和软件加到链路上,构成了数据链路
数据链路层以帧为单位传输和处理数据
1.2 三个重要问题
封装成帧、差错检测、可靠传输
(1)封装成帧
数据链路层给网络层协议数据单元添加一个数据链路层协议首部,简称为帧头,还要给其添加一个帧尾,这个操作过程叫封装成帧
这是为了在链路上以帧为单位来传送数据,如图1:
(2)差错检测——检错码和检错算法
发送方将封装好的帧通过物理层发送到传输媒体,帧在传输过程中遭遇干扰后可能出现误码,如比特0变成比特1(比特差错)。主机要如何判断传过来的数据是否发生了误码呢?
发送方在发送数据前,会基于待发送的数据和检错算法计算出检错码,将其封装在帧尾,比如上图以太网版本2的MAC帧的帧尾就是4字节的帧检验序列FCS字段,要写入该字段的内容就是检错码。
接收方主机收到帧之后,根据检错码和检错算法就能判断该帧在传输过程中是否出现了误码。
(3)可靠传输
接收方主机在收到有误码的帧后,会将其丢弃。如果数据链路层向其上层提供的是不可靠服务,那么丢了就丢了;如果对上层提供的是可靠服务,那么需要一些措施来确保接收方主机还可以重新收到被丢弃的这个帧的正确副本。
尽管误码是不能完全避免的,但若能实现发送方发送什么,接收方就能收到什么,就称为可靠传输。
当然,上面三个重要问题是针对点对点通信而言的,使用广播信道的数据链路层还有其他问题——如共享式局域网中,总线上的主机需要通过帧头的目的地址和源地址来知道这个帧是发给自己的还是别的主机的,还有一起发送数据的碰撞问题。——解决方案:CSMA/CD协议
不过目前共享式局域网已经被交换式局域网取代了,因为交换机技术的成熟。(交换式局域网——点对点链路+链路交换机)。所以实际中没有碰撞问题,不过该课程后面依然会讲这些。
还有就是WIFI这种无线局域网因为天然的广播特性,还是共享信道技术——这就类似于共享局域网,所以也会出现碰撞这些问题。——解决方案:CSMA/CA协议
接下来具体介绍封装成帧、差错检测、可靠传输
三个问题。
2. 封装成帧
2.1 帧的界定
封装成帧后还要通过物理层将构成帧的各比特转换成电信号发送到传输媒体。
接收方收到比特流如何提取出帧?
帧头和帧尾的作用之一是帧定界,比如PPP帧就在帧头帧尾分别有标志:
但是前面的以太网的MAC帧就没有帧定界标志,如下所示,帧头帧尾都没有包含帧定界标志:
以太网的数据链路层封装好MAC帧后,将其交付给物理层,物理层会在MAC帧前面添加8字节的前导码:
注意这个前导码是物理层加的,不是帧内就有的
(我觉得这也能说明为什么数据链路层和物理层应该放同一层)
前导码的前七个字节为前同步码,作用是使接收方的时钟同步,之后的1字节为帧开始定界符,表明其后面紧跟的就是MAC帧:
另外,以太网还规定了帧间间隔时间为96比特的发送时间,所以MAC帧并不需要帧结束定界符。
2.2 透明传输
透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
以PPP帧这种帧中有帧定界标志为例,因为定界标志激就是特殊字符,如果上层交付的协议数据单元中恰好也含有这个特定字符,那接收方那边就会把这个当做是帧的定界标识,在帧没有收完时就以为一个帧已经结束了。
这种情况就不能被称为透明传输,因为他不允许上层交付的数据单元有特定字符,否则就不能正常工作
所以数据链路层协议需要解决这个问题,来实现透明传输。
有些数据链路层协议会在发送数据前先扫描帧里面的数据部分(上层交付的数据),每出现一个帧定界符就在其后插入一个转义字符,接收方接收的时候就先收到转义字符,就能知道后面的是数据,然后先剔除转义字符再继续提取数据。转义字符就1个字节。
面向字节的物理链路用字节填充(或字符填充)的方法实现透明传输。
面向比特的物理链路使用比特填充方法实现透明传输。
因为帧的数据部分才是真正要传输的数据,所以为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大些。
不过,考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Unit)
3. 差错检测
在帧尾插入检错码,FCS字段,不同数据链路层协议都是FCS字段,字节数可能不一样
几种差错检验算法:
1.奇偶校验——最简单的校验方法
在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中的比特**“ 1 ”的个数**为奇数(奇校验)或偶数(偶校验)。
如双方约定采用奇校验,待发送数据为101101,那么发送方在数据后面(就是左边)添加一个1,就是1101101,此时1的个数为奇数,所以接收方查看“1”数量的奇性改变,即可检出错误。
如果是约定偶校验,那就加0,变成0101101。
那显然这种方法不太有用,在有两个(偶数个)误码时,接收方那边查到的奇偶性也不变,从而没发现传输过程中发生了误码。——漏检率高,一般不用这种方法。
2.循环冗余校验CRC (Cyclic Redundancy Check)——被广泛应用
检错能力很强,漏检率极低。
收发双方约定好一个生成多项式G(x);
发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输;
接收方通过生成多项式来计算收到的数据是否产生了误码
设生成多项式如G(x) = x^4 + x^2 + x +1
即 = 1 x^4 + 0 x^3 + 1 x^2 + 1 x^0
所以生成多项式各系数构成的比特串:10111
(常用的是x^16 + x^15 + x^2 +1)
上面这个比特串就是下图所示做除法时用到的除数,得到的余数就是冗余码,被加到待传输数据后面:
生成多项式最高次0就是4个0,即添加0000
补充:
检错码只能检测出帧在传输过程中出现了差错,但
并不能定位错误
,因此无法纠正错误;要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错,但纠错码的开销比较大;
循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于硬件实现,因此被广泛应用于数据链路层