一、基本概述
数据链路层的主要工作有三个:封装成帧、差错检测、可靠传输
封装成帧:对网络层交予数据链路层的数据单元添加帧头和帧尾。 差错检测:帧在传输过程中可能出现误码,接收方可以通过检错码和检错算法发现。 可靠传输:数据链路层会为网络层提供可靠传输或不可靠传输,不可靠传输会将误码的帧直接丢弃,可靠传输会要求重新发送。发送方发送什么,接收方就能接收到什么就是可靠传输。
二、封装成帧
封装的帧头和帧尾中有大量控制信息,不同协议的帧头帧尾格式不同。
透明传输:数据链路层对上层交付的传输数据没有限制(来者不拒都能正确传)。例如上层给的数据中有和帧定界符相同的内容,如果直接传输会导致接收方的帧提前结束。对于这一问题,有字节填充和比特填充两种方法。
对于面向字节的物理链路: 在帧中的帧定界符前加上转义字符(ESC,一字节长,十进制27),帧中的转义字符同理,这样就可以区分了。
对于面向比特的物理链路: 可以采用零比特填充法。在面向比特的链路中,标志字段F(01111110)是帧的边界,为了防止在帧的数据中出现和F相同的内容,对每五个连续1后面就添加一个0,从而避免F的出现。
为了尽量提高帧的传输效率, 应当使帧的数据部分占比尽可能大,但是同时考虑到差错控制等因为,每种协议都1规定了数据部分的长度上限(最大传送单元MTU)。
三、差错检测
比特差错(误码):简单说就是1变0或者0变1。误码率BER=传输错误比特数 / 传输比特总数。 出现差错时就需要通过差错检验码 进行检测
1、奇偶校验法: 在待发送数据后面加一个奇偶校验位,使整个数据中1的个数为偶数(偶校验)或奇数(奇校验)。 该方法只是简单检验,比如有一个误码,数据中1的个数由偶变奇(或者奇变偶)就能检测出,但是如果有两个误码,奇偶性不变就无法检测出。
2、循环冗余校验CRC 发送方: 接收方:
该方法漏错率极低,这里的“除法”是指异或运算。差错检测只能判断差错而不能定位,具体的纠错需要到网络层,是否纠错还要看数据链路层向上提供的是可靠传输还是不可靠传输。
三、可靠传输
一般有线链路的误码率较低,为了减小开销,不要求数据链路层向上提供可靠传输,差错由上层解决;无线链路易受干扰,所以一般需要可靠传输。注意出现差错的原因有很多,并不只局限于数据链路层。接下来是几种可靠传输的实现机制(不局限于数据链路层)
停止-等待协议SW
- 发送方给接收方发送数据分组,接收方接收后进行差错检验。
- 若没有误码则发送确认分组ACK给发送方,发送方接收到ACK后才能发送下一个数据分组;若有误码则丢弃该分组并给发送方发送否认分组NAK,发送方接受到NAK则立刻重传。
- 发送方发送完一个数据分组并不能立刻将数据从缓存中删除,要等接收到确认分组后才能删除。
- 针对发送方数据丢失的问题,使用
超时重传机制 :一般重传时间略大于“从发送发到接收方的平均往返时间” - 对于接收方确认信息(ACK)丢失的问题(会导致同一个数据分组接收方收到了两次),给每个数据分组加上
序号 。当接收方接收到了和已有分组序号相同的分组就将其丢弃并向发送方发送ACK(因为显然是接收方没有收到ACK才会重复发送,所以这里还要发ACK)。同理确认分组也要添加序号从而避免重复确认。由于SW的停等特性,只需要一个bit编号。 数据链路层一般不会出现ACK迟到所以不需要对ACK编号。
SW的信道利用率:(这里
T
A
T_{A}
TA?一般远小于
T
D
T_{D}
TD?可以忽略) 可以看出当RTT远大于发送时延
T
D
T_{D}
TD?时信道利用率会非常低,如果出现差错重传,对有用数据而言利用率会更低。
后退N帧协议GBN
GBN和后面的SR都可以理解为用滑动窗口改进SW。具体内容如下: 优点:当信道相对稳定时提高了信道利用率。 缺点:当信道不稳定时,频繁重传成功发送的分组会导致效率低。
选择重传协议SR
简单来说就是接收窗口大小>1的GBN。增大接收窗口就可以先收下落在接收窗口内正确到达但失序的分组,只重传有差错的分组,等接接收窗口的分组到齐后在向上传递。
显然这里为了让发送法案给
|