文章目录
[1. 基本概念](#1. 基本概念)
[2. 数据链路层的三个主要问题](#2. 数据链路层的三个主要问题)
[1. 概念](#1. 概念)
[2. 帧头、帧尾的作用](#2. 帧头、帧尾的作用)
[3. 透明传输](#3. 透明传输)
[4. 提高效率](#4. 提高效率)
[1. 概念](#1. 概念)
[2. 奇偶校验](#2. 奇偶校验)
[3. 循环冗余校验CRC](#3. 循环冗余校验CRC)
[1. 步骤](#1. 步骤)
[2. 生成多项式](#2. 生成多项式)
[3. 例题](#3. 例题)
[4. 总结](#4. 总结)
[1. 基本概念:](#1. 基本概念:)
[2. 可靠传输的实现机制](#2. 可靠传输的实现机制)
[1. 停止等待协议 SW](#1. 停止等待协议 SW)
[2. 回退N帧协议GBN](#2. 回退N帧协议GBN)
[3. 选择重传协议SR](#3. 选择重传协议SR)
前言
上篇文章中,对于计算机网络的物理层相关内容进行了整理和总结,今天开始数据链路层的学习,还请多多支持!
一、概述
1. 基本概念
链路(Link):从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点
数据链路(Data Link):把实现通信协议的硬件和软件加到链路上,就构成了数据链路
数据链路层以帧为单位传输和处理数据
2. 数据链路层的三个主要问题
封装成帧:数据链路层给网络层交付的协议数据单元添加帧头和帧尾
差错检测:接收方主机收到帧后通过检错码和检错算法判断帧在传输过程中是否产生误码
可靠传输:可以简单理解为发送方发送什么,接收方就接收到什么
二、封装成帧
1. 概念
数据链路层对上层交付的协议数据单元添加帧头和帧尾使之成为一个帧
2. 帧头、帧尾的作用
- 包含重要的控制信息
- 帧定界
PPP帧:帧头、帧尾各有一字节的标志字段
接收方主机的数据链路层依据帧定界标志,从物理层交付的比特流中提取出一个个帧
BUT!并不是每一个数据链路层协议的帧中都有帧定界标志!
例如:以太网V2的MAC帧中:帧头和帧尾中并没有帧定界标志
接收方如何提取出以太网帧呢???
发送方数据链路层封装好以太网帧后交付给物理层,物理层收到后,会在以太网帧前添加8字节的前导码
前导码:
前7个字节为前同步码 ------ 作用:是接受方的时钟同步
最后一个字节为帧开始定界符 ------ 表名其后面紧跟的为以太网MAC帧
以太网还规定了帧间间隔为96比特时间 ------> MAC帧不需要帧结束定界符
3. 透明传输
数据链路层对上层交付的传输数据没有限制,就好像数据链路层不存在一样
帧定界标志也是一个特殊的数值
如果上层交付的协议数据单元中,也包括这个数值
接收方还能正确接收这个帧么?答案明显是错误的,接收方会对帧是否结束产生误判,这种情况下就不能称为透明传输!
数据链路层的处理办法:
在发送帧之前,对帧的数据部分进行扫描,每发现一个帧定界符,就在前面插入一个转义字符
接收方识别到转义字符时,就可以识别之后的一个字符为数据,从而剔除转义字符后提取数据
转义字符ESC:特殊的控制字符,长度为一字节,十进制数值为27
同样!!转义字符也是特殊的数值,如果数据中也存在转义字符的数值呢???
处理方法同上,在发送帧之前,对帧的数据部分进行扫描,每发现一个帧定界符和转义字符,就在前面插入一个转义字符
对于面向比特的物理链路 ------> 比特填充法
------> 零比特填充法:在发送帧之前,对帧的数据部分进行扫描,每5个连续的1后插入一个0
------> 接收方接收时剔除0即可
4. 提高效率
为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大一些
最大传输单元MTU (M aximum T ransfer Unit):考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧数据部分的长度上限
三、差错检测
1. 概念
- 比特差错:比特在传输过程中可能产生产错(0变为1,1变为0)
- 误码率BER(Bit Error Rate):在一段时间内,传输错误的比特占传输的比特总数的比率,BER = 错误的比特 / 总的比特
- 差错检测:使用差错检测码来检测数据在传输过程中是否产生了比特差错
- 差错检测码:
其中FCS字段就是帧检验序列,让接收方的数据链路层检查帧在传输过程中是否产生了差错
2. 奇偶校验
在待发送的数据后添加一位奇偶校验位,使整个数据(包括添加的校验位)中1的个数为奇数(奇校验)或偶数(偶校验)
缺点:如果传输过程中比特1的奇偶性没有发生变化,就检测不出是否发生差错
3. 循环冗余校验CRC
循环冗余校验CRC ------ Cyclic Redundancy Check
1. 步骤
- 收发双方约定好一个生成多项式G(x)
- 发送方基于待发送的数据和生成多项式计算出差错检测吗(冗余码),将其添加到待传输数据的后面一起传输
- 接收方通过生成多项式来计算是否产生了误码
2. 生成多项式
常用的生成多项式:
生成多项式必须包含最低次项1
3. 例题
发送方:
接收方:
4. 总结
- 检错码只能检测帧在传输过程中是否出现差错,但不能定位错误,因此无法纠错;
- 可以使用冗余信息更多的纠错码进行前向纠错,但纠错码的开销比较大,在计算机网络中很少使用;
- 循环冗余校验CRC有很好的检错能力,虽然计算比较复杂,但易于硬件实现,因此被广泛适用于数据链路层;
- 计算机网络中通常使用检错重传的方式来纠正传输中的错误,或者丢掉检测到差错的帧,这取决于数据链路层向其上层提供的是否是可靠传输。
四、可靠传输
1. 基本概念:
对于检测到差错的数据:
不可靠传输:丢弃产生差错的帧
可靠传输:想办法实现发送方发送什么,接收方就收到什么
传输差错:
分组丢失
分组失序
分组重复
2. 可靠传输的实现机制
1. 停止等待协议 SW
SW ------ S top-and-Wait
(1)否定分组NAK
接收方接收到数据之后,会对数据进行差错检测:
- 如果检测没有产生误码,则返回确认分组ACK
- 如果检测到存在误码,则丢弃该分组,并返回否定分组NAK
发送方接收到否定分组NAK之后,会重新发送一份数据分组,直至接收到确认分组ACK,之后才会将数据从缓存中删除
(2)超时重传
如果发送方发送数据后,数据在传播过程中丢失,接收方接收不到数据,就不会给发送方返回ACK或者NAK,发送方就会一直阻塞等待;
超时重传:发送方中存在一个重传计时器,重传计时器中设置有一个重传时间,发送方发送数据后,如果在规定的重传时间内没有收到ACK,就会重传上一份数据。
如果接收方接收到数据之后,检测到存在误码:
可以不立即返回NAK,而是等待发送方的超时重传;
但对于误码率较高的点对点链路,为了使对方尽快重传,也可选择发送NAK
(3)分组重复
接收方正确接收数据后,返回ACK确认分组,ACK在传播过程中丢失,触发了发送方的超时重传机制,此时就会导致接收方接收到两份一样的数据,而接受方无法判断是否是重复分组
为避免分组重复问题,就需要给每个数据分组添加序号,对于停止等待协议,每次发送一个数据分组后就会停止等待,所以只需要保证每次发送的数据序号和上一次发送的数据序号不同即可,因此只需要一个比特位来编号即可
(4)确认迟到
接收方正确接受数据之后,返回ACK,但ACK在传输过程中因某些原因,未能及时到达发送方,从而触发了发送方的超时重传,重传0号数据分组,之后才接收到ACK,此时就会立即发送1号数据分组
接收方再次收到0号数据分组之后,发现是重复的数据分组,就会丢弃并返回一个ACK,于是发送方就收到了对0号分组的重复确认,发送方无法正确辨别ACK
此时需要才取的措施就是,对确认分组ACK也进行编号,只需要保证每次的ACK序号和上一次发送的ACK序号不同即可,因此也只需要一个比特位来编号即可
发送方在接收到重复的确认分组ACK0时,会直接忽略该确认分组,等待正确的确认分组
(5)SW协议的信道利用率
信道利用率U计算公式:
由此可见,我们可以得出
当往返时延RTT远大于数据的发送时延时(例如卫星链路),信道的利用率就会非常低
如果出现重传,信道的利用率还会进一步降低
于是为了解决停止等待协议信道利用率低的问题,就出现了回退N帧协议和选择重传协议
2. 回退N帧协议GBN
GBN ------ G o-B ack-N
对于停止等待协议,每次发送一个数据分组后就会停止等待,所以每发送一个数据分组就至少需要等待一个收发双方的往返时间,信道利用率很低
此时如果采用流水线传输:
回退N帧协议:在流水线传输的基础 上,通过发送窗口来限制发送方可连续发送的数据分组个数
发送窗口尺寸:(n为数据分组的比特位)
当发送窗口=1时,就是停止等待协议
(1)无差错情况
发送方的发送窗口序号落在0~4号分组,一次发送给接收方
接收方依次进行接收,每接收一个数据分组,接收窗口向后滑动一个位置,并返回一个对应的ACK分组
发送方每接收一个ACK分组,发送窗口就向后滑动一个位置
发送方就可将收到确认的数据分组就可以从缓存中删除了
(2)累积确认
接收方没必要对接收到的数据分组逐个发送确认分组,接收方在接收到一批数据分组后,可以对按序到达的最后一个数据分组发送确认
表示:序号n之前的所有数据分组都已经正确接收
此时,就算ACK1丢失了,发送方只接受到了ACK4,就会知道0~4号分组被正确接收
(3)有差错情况
5号数据分组检测到存在误码,丢弃该数据分组
前四个数据分组也不会被接受,也会被丢弃,此时,每丢弃一个数据分组,就会返回一个上一批接收到的最后一个数据分组对应的确认分组
发送方接收到重复的确认分组,就知道之前发送的数据分组存在差错,就可以立即重传这批数据,至于收到几个重复的就会立即重传和具体实现有关
如果不足以立即重传,就会在重传计时器超时时,对发送窗口内的数据全部重传
此时,可以看出,在第一次发送中,就算6,7,0,1号数据分组没有产生差错,也会受到牵连不会被接收,发送方依旧需要重传这些数据
所以,当网络质量不好时,回退N帧协议并不一定比停止等待协议高
(4)发送窗口尺寸超过上限
接收方正确按序接收后,给发送方返回累计确认ACK7
此时,如果ACK7在返回过程中丢失......发送方就会接收不到确认分组,于是在重传计时器超时后,就会重传之前的全部分组
重传的0~7到达接收方,接收方无法分辨新旧分组,会再次接收,于是就会发生分组重复的现象
(5)总结
回退N帧协议是在流水线传输的基础 上,通过发送窗口 来限制发送方可连续发送的数据分组个数,是一种连续的ARQ协议 ,在协议工作的过程中,发送窗口和接收窗口不断向后滑动,于是这类协议又被称作滑动窗口协议。
3. 选择重传协议SR
SR ------ S elective-Request
为了进一步提高性能,可以设法只对产生误码到的数据分组进行重传。因此,接收方的接收窗口不应只为1,以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后一并提交上层。
此时!为了使发送方仅重传出现差错的分组,接收方不能再使用累积确认的方式,而需要对每个正确接受的数据分组进行逐一确认
发送窗口:
接收窗口: =
(1)SR协议工作过程
假设:发送方对落在发送窗口的数据分组进行发送:
传播过程中,2号数据分组丢失,接收方接收到0、1号数据时,接收窗口向后滑动,并返回对应的ACK分组;接收3号数据时,窗口不向后移动,但返回对应ACK分组(3号不是按序到达的分组);并将0、1号数据交给上层
接收方接收到0、1号ACK分组,窗口向后滑动,发送方可以将0、1号数据从缓存中删除;此时4、5号数据分组出现在发送窗口中,发送方对其进行发送;接收到ACK3,发送窗口不向后滑动,因为不是按序到达的ACK分组,同时记录已经收到ACK3,确保不会超时重传3号数据分组;
发送方接收4、5号数据,并返回对应ACK分组,但是窗口不向后滑动;发送方接收到4、5号ACK分组,记录已经收到4、5号数据
等重传计时器超时,对2号数据分组进行重传
接收方正确接收2号数据分组,返回对应ACK,接收窗口向后滑动
发送方接收到ACK2,发送窗口也向后滑动
(2)SR协议的窗口尺寸
(3)窗口尺寸超出上限
假设:将和都设置为5
发送方将发送窗口的数据进行发送
接收方正确接收数据,并返回对应ACK分组,接收窗口向后滑动
假设确认分组返回过程中,ACK0丢失
发送方接收到1-4号ACK分组,并记录已经接收,过一段时间,重传计时器超时,就会重传0号数据分组
接收方无法分辨新旧数据分组,就会接收这个0号数据分组,就会出现分组重复的差错