计算机网络第九章——数据链路层《流量控制和可靠传输》

一、回顾概念

前面上一章讲了数据链路层的《差错控制》,那么回顾一下差错控制和可靠传输的区别:

  • 差错控制:发现一个帧里的【位错(比特错)
    • 检错(奇偶校验码、CRC循环冗余校验码):接收方发现错后丢帧或让发送方重传
    • 纠错(海明码):接收方发现错后自己改
  • 可靠传输:发现并解决【帧错】,帧错包括
    • 帧丢失:解决办法是设置 "超时计时器",当 "计时器超时" ,发送方就自动再发一次
    • 帧重复:解决办法是给帧设置编号(数据帧 和 确认帧 都要设置编号,后面会细讲)
    • 帧失序:也是给帧设置编号、还有3大滑动窗口机制(停止等待协议、GBN协议、SR协议)重要!!!

注意了!!根据【有线】和【无线】2种信道,数据链路层会分别向上提供【不可靠传输服务】和【可靠传输服务】

  • 因为有线的以太网(像IEEE802.3、CSMA/CD)通常误码率极低,就算有问题上层也可以自己搞定,不需要数据链路层提供可靠传输
  • 而无线网络(像IEEE802.11、CSMA/CA)容易受到干扰、误码率大,必须要数据链路层可靠传输

二、可靠传输机制基本解决方案

1、"一问一答"的确认机制

首先我们需要知道,数据链路层通信时我们需要用 "一问一答" 的形式通信,发送方发的信息接收方必须回复收到了!不能 "冷暴力" 发送方!

例子:

你要是敢不回你女朋友的信息就死定了,数据链路层同理,每发一句都要回复:"收到!"

所以数据链路层规定:

  • 发送方发过去的【数据】------【DATA】
  • 接收方返回【收到】------【ACK】
  • 如果接收方发现有问题,也得回复【有问题】------【NAK】(仅在SR协议中用到)

2、对于【帧丢失】问题

就是设置【超时计时器】,如果发送方发了信息等了很久还没收到接收方的回复ACK,超时了就再发一次上一个数据帧

(就像你女朋友问你一个事,结果网卡没发出去,看你半天不回复,她就再问你一遍)

3、对于【帧重复】和【帧失序】问题

各个帧的传输速度不一样,可能有的排在后面的帧会比前面的帧先到达接收方;由于网络故障接收方的ACK也可能超时回复,从而导致发送方在超时后重复发了一样的数据帧

要解决这些问题,最基本的方法就是【给帧编号】!!而且要求【发送方数据帧】和【接收方回复帧】都要编号!!!!

好理解的例子:(这里暂时忘了给发送方的数据帧编号,各位知道就行)

三、滑动窗口机制 (重点)

1、滑动窗口概念

【滑动窗口机制】是数据链路层控制**【可靠传输】和【流量控制】的流程和手段!!!**

简单概念,不是考试重点,但是要看明白是啥意思:

简单说就是:

  • 发送方只能发他的【发送方的窗口大小WT以内】的数据帧,如果发送方发的速度太快超出了窗口,那超出的帧不让发
  • 接收方只接收【接收方的窗口大小WR以内】的数据帧,发送方如果发得太快,超出的帧接收方可以不要丢掉

就像你的碗就那么大,但是你妈一直在给你夹菜,那你就得控制你妈了:你的碗盛满的时候还夹菜给你就丢掉;你妈也要限制在一个范围内给你夹菜,比如已经范围是3个鸡腿,已经夹了3个鸡腿之后就不准再给我夹第四个了!!

直到你把碗里的吃完,开始第二碗开干、你妈也开始夹下一轮的菜:第4个、第5个、第6个鸡腿

对于如何给帧编号

我们并不知道一个分组数据有多少帧?而且也不知道各个分组的帧一不一样?那么我们就规定了帧编号使用n位,这n位需要满足:WT + WR <= 2^n

回想计算机组成原理知识点,3bit能表示2^3=8进制(0~7)、4bit能表示2^4=16进制(0~15),所以nbit可以表示2^n个十进制数,一样的道理

2、滑动窗口3个协议

3、S-W停止等待协议

(1)记住两个重点:

  • 1、严格要求【一问一答】,发送窗口和接收窗口 固定死是1(帧)
  • 2、正因为是因为发送窗口和接收窗口 固定死是1(帧),所以帧的编号是需要【1bit】(0或1)

(2)具体流程和细节(了解即可)

之所以帧编号取1位的原因就是,发送窗口和接收窗口距离始终不超过1,发送窗口随着接收窗口往后移动才移动

当接收方收到错误的数帧,可以选择直接丢掉并不返回ACK,然后让发送方时钟超时重传正确的数据帧;

如果发送方的数据帧丢失,则接收方也不会返回ACK,直到时钟超时再传一次

而接收方的回复确认帧ACK如果丢失了,但是接收窗口确实收到了数据所以会往后移动,而发送方没收到ACK则不会往后移动,超时后重传这个重复数据帧,那么因为有【帧编号】,接收方会检查是否重复了,是的话就丢弃并返回ACK,这样发送方再正常往后移动

此时接收窗口在数据帧【编号0】处,但发送方却发【编号1】,说明【编号1】已经发过了重复了,不然接收窗口不可能自己到【编号0处】

(3)停止等待协议的信道利用率

如图所示:

去分析这个公式我们可以知道,要想让信道利用率大,那么分母要小、分子要大;反正则信道利用率小。

  • 那么分母大的情况通常是RTT影响,当两个主机距离贼远,那信道距离就变长了,从而往返时延就大!!
  • 而分子小的情况就是发送方的传输速率很高,从而导致传输时延小(传输时延 = 发送数据大小 / 传输速率)
  • 简单来说就是看一次信息发送完成里,【传输(发送)时延】占【总的时间(接收双方传输时延 和 往返传播实验)】的比重

记住这种通过【重传-确认】的自动化机制,通常叫【自动请求重传ARQ协议】

例题

4、GBN回退N帧协议

(1)概念理解

GBN全拼Go-Back-N,对应中文回退N帧

S-W停止等待协议里,发送方需要等待接收方的ACK回复,即便是网络极好的理想状态依旧太慢了,信道利用率低;所以GBN创造了"流水线"的协议,无需等待接收方ACK,发送方直接一直发数据,同时接收方也会返回ACK

(2)重点!

  • 1、3个机制的总体要求是 WT + WR <= 2^n,不过回退N帧协议只需要记住:发送窗口WT <= 2^n - 1**、**接收窗口WR固定死只有 1
  • 2、累计确认机制:只有GBN回退N帧有,就是只要发送方收到第N个ACK,那么自动默认前面第N个和他之前的数据帧接收方都已经接收到了!!!
  • 3、最理想状态可以实现【100%的信道率】

(3)流程细节

正常情况

发送方正常连贯往前发,收到第N-1个ACK之后,发送窗口就会往前移动到第N位;

注意这里发送窗口的每一帧都有一个计时器,分别计时这一帧的ACK返回是否超时

发送方丢失情况

当发送方的数据帧丢失了,接收窗口没收到就不会往前移动,也不会发ACK确认帧,同时发送方超出接收窗口的帧还在发,而接收方接收到超过接收窗口的帧,就会丢掉

然后再次返回接收窗口的上一个ACK确认帧,此时发送方就知道这个编号的ACK和他之前的帧都已顺利被接收,只需要把发送窗口移动到ACK帧编号的前一位

然后因为没有丢失帧的位置没有收到ACK确认,从而超时重传,这样就又达到了完整流畅的流水线

注意:【回退N帧】不是指滑动窗口回退,而是指【回退到第N位重新传数据帧!!!!】

确认帧ACK丢失

如果接收方的ACK确认帧丢失,接收窗口移动到下一位

而此时前面发送方的数据帧部分一直没收到ACK而超时重传,而当前在最前面的接收窗口没有收到对应自己编号的数据帧,就会知道这些都是非法的重复帧,直接丢弃,并再次发送自己接收窗口的前一个的ACK确认帧

发送方收到后就移动到这第N个ACK编号的后一位N+1,然后再重新开始传输,又恢复了正常的流水线

(4)为什么一定要发送窗口是WT <= 2^n - 1(了解即可)

看例子,假设先让WT = 2^n > 2^n-1

帧编号取3位,则滑动窗口是2^3 = 8位

假设所有的ACK确认帧都丢失

那么当前接收窗口往前移动一位之后,居然对应着下一组编号的编号0,然后前面的发送方的数据帧因为没收到ACK开始超时重传,第0位传过来刚好对应接收窗口编号0,那么就会这么误打误撞错着传下去


但如果发送窗口是2^3-1 = 8 - 1 = 7

那么第6位的接收窗口移动一位之后在第7位

发送方数据帧超时重传,但是和接收窗口编号不对应,那么接收窗口就会返回它的上一个ACK编号6

然后发送方就明白0~6都已经接收到了,直接移动到第7位开始传就行了

例题

5、SR选择重传机制

SR全拼:Selective Repeat

(1)重点:

  • 1、发送窗口和接收窗口都大于1,但是!发送窗口WT >= 接收窗口WR, 而且WT + WR <= 2^n(因为发送窗口是根据接收窗口而移动的,接收窗口只有接收了对应编号的数据帧才会动,那如果发送窗口比接收窗口小,那接收窗口右边永远获得不到发送方的数据帧,接收窗口也永远不会动,从而发送窗口也永远不动,死循环。。。)
  • 2、和GBN回退N帧不同的是,SR协议只能对应每一个数据帧都回复确认帧ACK
  • 3、发送方每个数据帧也都有计时器,哪个数据帧没收到确认帧ACK就超时重传(可以多个同时一起传),只要是在发送窗口和接收窗口之内,相当于每一对发送帧和确认帧完全是一对一关系,自己计时自己传

不满足,因为WT < WR

(2)细节流程

正常情况

通常情况都是WT == WR

然后每个编号数据帧对应确认帧,都有自己的计时器,发送窗口连贯着发过去数据帧、然后确认帧也连贯着返回,发送方可以不用等待ACK确认帧,但是每一个数据帧

数据帧丢失

数据帧丢失的情况,各个帧计时器会检测是哪几个帧没有返回ACK而导致超时

然后接收方和发送方都只能向后移动到【第一个没有返回ACK而超时的帧】

然后发送方重传,而移动完后只要在发送窗口内的数据帧都可以一起向接收方传

数据帧错误

SR可以主动地返回NAK,告诉发送方赶紧重传一个数据帧

这样就减少了计时器超时地这个时间,是SR地特点

同理,接收方和发送方只会向后移动到【第一个要重传的帧】的位置

最后移动到最后一个收到的确认帧ACK的位置的后一位,开启下一轮传数据

确认帧丢失

当确认帧丢失后,因为前面说了数据帧和确认帧是一对一关系,接收窗口会不管那么多直接移动到【最后一ACK确认帧的后一位】,因为他只会以为自己回复了

发送窗口会移动到【第一个没收到ACK】的数据帧位置

然后没收到ACK的数据帧位置超时重传,同时进加入到发送窗口的数据帧也可以开始发数据

接收方收到对应接收窗口编号的【最新的数据帧】只会,还是自顾自往后移动

而前面【超时重传的数据帧】因为不在接收窗口,会被认为是【重复数据帧】

那么直接返回【确认帧ACK】

发送方那些超时重传的数据帧收到ack确认帧之后,才算满意,这时候发送窗口移动到【最后一个ACK的后一位】

例题

相关推荐
西岭千秋雪_2 小时前
计算机网络学习笔记:应用层概述、动态主机配置协议DHCP
笔记·学习·计算机网络
懒惰的bit2 小时前
STM32F103C8T6 学习笔记摘要(二)
笔记·stm32·学习
weixin_448119942 小时前
Datawhale 网络爬虫技术入门第2次笔记
笔记·爬虫
IMPYLH8 小时前
Python 的内置函数 hasattr
笔记·python
moxiaoran57538 小时前
uni-app项目实战笔记17--获取系统信息getSystemInfo状态栏和胶囊按钮
笔记·uni-app
智者知已应修善业9 小时前
【51单片机2位数码管100毫秒的9.9秒表】2022-5-16
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
饕餮争锋9 小时前
设计模式笔记_创建型_单例模式
java·笔记·设计模式
teeeeeeemo9 小时前
Number.toFixed() 与 Math.round() 深度对比解析
开发语言·前端·javascript·笔记
懒惰的bit11 小时前
STM32F103C8T6 学习笔记摘要(三)
笔记·stm32·学习