基本数据链路层协议(第n次学数据链路层,这次一定要理清!——数据链路层最全面有条理的解析(六))

2023-05-16

基本数据链路层协议

  • 有关底层通信模型的基本假设
  • 三个单工协议
    • 乌托邦式单工协议
    • 无错信道上的单工停-等协议
    • 有错信道上的单工停-等协议
  • 滑动窗口协议(全双工)
    • 1位滑动窗口协议
    • 回退N协议
    • 选择重传协议

有关底层通信模型的基本假设

  • 假设物理层、数据链路层和网络层都是独立的进程,他们通过来回传递消息进行通信。
  • 主机A希望用一个可靠的面向连接的服务向主机B发送一个长数据流,假设A的数据链路层请求数据时,网络层总能立即满足数据链路层的需求。
  • 假设主机不会崩溃。

三个单工协议

乌托邦式单工协议

  1. 不考虑任何出错情况
  2. 数据只能单向传输。
  3. 接收方缓冲区无限大。

协议由两个单独的过程组成:运行在源主机上的发送过程,运行在目的主机上的接受过程。
发送过程是一个无限的while循环,尽可能快地把数据放在线路上。
接收过程是在等待唯一可能的事件,即到达了一个未损坏的帧发生。
整个处理过程接近于无确认的无连接服务,差错控制和流量控制就要依赖上层解决了。(当然,即使无确认的无连接服务也要做一些差错检测的工作。)

无错信道上的单工停-等协议

  1. 不考虑通信信道出错。
  2. 数据只能从发送方传到接收方,但帧可以在两个方向上传送。
  3. 考虑了接收方接收速率和发送方发送速率不匹配的问题,即进行流量控制

此问题的一种解决方案显然是建立足够强大的接收器,但这对硬件要求极高,且只是把发送方太快这个问题转移到了网络层考虑。
更一般的解决方案是:接收方从帧中取出数据包并传递给网络层后,给发送方返回一个哑帧,允许其发送下一帧。这种双向传送是交替关系,可使用半双工的物理信道。

有错信道上的单工停-等协议

  1. 考虑通信信道出错,若一帧在传输过程中被损坏,接收方可以检测出来,即进行差错控制
  2. 数据只能从发送方传到接收方,但帧可以在两个方向上传送。
  3. 考虑了接收速率和发送速率不匹配的问题。

如果只是简单的在发送方设置定时器,超时重传,那么当确认帧丢失时,就会造成帧重复,因此要让发送方在每个帧的头部加入序号,接收方检查序号判断是否为重复帧。
当m号帧发出,代表m-1号帧必定已经被确认,则此时的问题就与m-1号帧完全无关了,因此,序号关系可仅限于后两者,即m和m+1之间,换言之,只需要,一位序号就足够了,即0和1。
发送方发出一帧后启动计时器,若

  1. 收到完好确认帧:从网络层获取下一个数据包放入缓冲区覆盖之前的。
  2. 收到受损确认帧或计时器超时:不改变缓冲区内容和序号,重传上一帧。

接收方收到有效帧后,检查其序号,若

  1. 不是重复帧,去封装传递给网络层。
  2. 为重复帧,重新向发送方发送这一帧的确认。

滑动窗口协议(全双工)

☛上面的三个协议均为单工协议,一种实现全双工数据传输的方法是设立两条独立的传输方向相反的单工链路。
☛更好的方法是用一条链路来同时传输两个方向上的数据。如A和B相互传送数据,当然也相互发送确认,接收方只要检查帧头部的类型字段就可区分出是数据帧还是确认帧。
☛该方法仍可继续改进。当收到一个数据帧,接收方并不立即发送单独的确认帧,而是等待本主机的网络层给它传递下一个要发送的数据包,然后将确认信息附加在数据帧上发送出去。这种方式叫做稍待确认,更好地利用的信道的可用带宽。
☛而为了防止接收方长期无数据发送导致一直不返回确认从而导致发送方计时器超时的现象出现,数据链路层需要采用某种自组织方式:等待一个固定时间,如果时间内没有网络层的数据包到来,则发送一个单独的确认帧。
☛滑动窗口协议的本质:在任何时刻,发送方总是维持着一组序号,分别对应于允许它发送的帧,或者是已经发送但还没被确认的帧。同时,接收方也维持着一组序号,对应于一组允许它接受的帧。对于发送方,当网络层的一个数据包到来时,它被赋予窗口中下一个最高序号,且窗口上边界前移一格,收到一个确认时,窗口的下边界也前移一格。
序号的最小值是0,最大值是2n-1,即序号所占的字段是n位。

1位滑动窗口协议

发送方和接收方窗口大小均为1,即停-等式滑动窗口。n=1,序号为0-1。
正常情况: A的数据链路层先开始发送第一帧。
异常情况:A和B同时试图将各自的0号帧发向对方。B收到A的A0包后,发现携带的不是对B0的确认,因此重发B0,而,由于收到的来自B的第一个B0包携带的不是对A0的确认,就又进行重发A0操作,且携带对B0的确认,B收到后发出B1,并携带对A0的二次确认,而在A收到B的二次确认之前,收到了B对A0的第一次确认,于是发出A1,并携带对B0的二次确认,B收到A1后,发现并非B1的确认,于是重发B1,同时携带对A1的确认,然后,A收到了B所发的携带对A0的第二次确认的B1包,于是重发A1,同时携带对B1的确认,B收到这个携带对B1确认的A1后,发出携带对A1确认的B2……这样的情况同样发生在过早超时的情况下(即使有一方明显地首先开始传输)。每一帧都会被发送多次,严重浪费带宽

1位滑窗

回退N协议

以上的所有协议,都忽略了传播时延。但如果使用卫星信道,会出现这种情况:
带宽50kb/s,传播往返时延500ms,若利用1位滑窗发送1000bit帧长的帧,t=0时发送第一帧,发送时延为20ms,则t=520ms时,确认帧才回到发送方。即信道利用率是20/520=3.8%。可见,从效率角度来看,长传播时延,高带宽,短帧三者的组合是一种灾难。
如果放松“发送一帧前必须有前一帧确认”这一限制,即当面对很长的传播时延时,同时发送w个帧,而不是只发一个,可以获得更高的带宽利用率。如果w选得足够大,发送方就可以连续发送帧,因为在待发送的帧发送之前,前面帧的确认就返回了,发送窗口一直富余。
那么,如何选取合适的w呢?
想象发送窗口大小为w,即一共有w个序号可用,发送完0号,开始发送1号时,0号开始在信道上传播,那么当1号~(w-1)号都发送完成后,如果恰好0号的确认回到了发送端,那么就可以立刻重新使用序号0,以实现不间断的发送帧。即w-1个帧的总发送时延应当等于0号帧的传播时延。这个过程可表示为下式:
设信道带宽为B,帧长L,单向传播时延为D。则

(w-1)× L/B = 2D
w = 2DB/L + 1

DBP称作延时带宽积,表示链路上最大可容纳的已发送但未被确认的比特数。
当同时传送多帧时,如果这个数据流中某一帧被损坏或丢失,但在发送方发现问题之前,其之后的大量帧已被发出,并即将到达接收方,而损坏帧必将被丢弃,但又要保证按顺序接收,那么接收方该如何处理那些大量的后续帧呢?
有两种方法处理:

  1. 接收窗口大小为1,直接丢弃失序的帧
    在图(a)中,发送窗口大小为7,接收窗口大小为1。首先发送方连续发出0-6号,收到Ack0后发7号,收到Ack1后发8号,但2号帧出错,因此直到发送方2号帧计时器超时也没有收到Ack2,接收方丢弃2-8号帧,发送方从2号帧开始依次重传2、3、4、5、6、7、8……
    1位接收窗口
    任何时候可同时发送帧的最大个数,即发送窗口的大小,都不能等于可用序号的个数。
    回退N协议中可以使w=MAX_SEQ
    我们利用一个场景来解释这个限制存在的原因:
    若MAX_SEQ=7,而发送方一次性发送0-7共8个帧,当7号帧的确认返回到发送方后,发送0-7的另外8个帧,然后第二个7号帧的确认也返回了。那么是第二批的8个帧全部正确接收了呢,还是由于这8个帧全都接收失败了,所以又发送了一次第一个7号帧的确认呢?就无法分辨了。因此发送窗口的大小不能超过MAX_SEQ,在本例中即不能超过7。
  2. 接收窗口大小不是1,选择重传
    在图(b)中,发送窗口大小为7,接收窗口大小不为1,接收方接收到2号帧出错后,还可继续接受3、4、5、6、7、8,并被数据链路层缓存起来,暂时不交给网络层,但返回给发送方的确认一直是最后一个正确接受的1号帧的Ack1,。发送方的2号帧计时器超时后,重传2号帧,接收方收到后,返回最后一个正确接收的8号帧的Ack8,同时将2、3、4、5、6、7、8按照顺序传递给网络层,然后发送方继续发送9、10、11……
    这里采用了累计确认机制,对所收到的最后一个正确的帧进行确认。
    在这里插入图片描述
    这种策略常常和否定策略结合使用,即当接收方检测到某帧错误时,发送一个否定确认NAK给发送方,立刻触发该帧的重传操作,不必等到相应的计时器超时,可提高协议性能。

数据链路层可以根据帧的确认情况控制是否接收网络层下发的数据,以实现流量控制,限制发送窗口大小。

选择重传协议

上述选择重传这样的非顺序接收容易引发特殊的问题,下面用一个例子来说明:
假设我们使用3位序号,那么发送窗口最大为7,接收窗口也为7。现在发送方发出0-6号帧,接收方正确接收并依次递交给网络层,并发出确认帧,并且向前移动接收窗口到7-5号。然而此时,突发意外,这些所有的确认帧都被摧毁,发送方会以为0号帧发送失败了,因此重发0号帧,而此时,接收窗口恰好包含0号,因此接收方会以为,这个被重发的0号帧就是第二批数据中的新的0号帧,然后将其接收至缓冲区。由于此时0(第一个)、1、2、3、4、5、6号帧都被接受,接收方同样返回最大序号的6号确认。这时,发送方才认为,自己第一批发的0-6号帧全都被正确接收了,于是向前移动窗口,发送7-5号帧。发出7号帧后,接收方正确接收,且由于比它序号小的帧都已收到,所以直接被递交给网络层。接下来,接收方找到刚才接收到的第二个0号帧,作为新一批的0号帧递交给网络层,于是,网络层得到了一个不正确的数据包,协议失败!
解决这个问题的方法是确保接收方在向前移动窗口之后,新老窗口序号没有重叠。即窗口的最大尺寸应该不超过序号个数的一半w=(MAX_SEQ+1)/2
如图(c)、(d)所示,若仍使用3位序号,发送窗口、接收窗口大小均为4,若接收方已正确接收0-3号帧,并向前移动窗口,此时确认全部被摧毁,发送方重发0号帧,接收方发现0并不在接收窗口内,因此重新发3号确认帧,发送方就会意识到0-3号已被正确接收,并继续发送4-7号帧。
接收方所需要的缓冲区个数应当等于窗口的大小。发送方所需的计时器数量等同于缓冲区个数。
由于上述的确认帧都是稍待确认,因此如果逆向数据很少时,接收方需要一个辅助的Ack计时器在发送方计时器超时之前返回单独的确认帧。
选择重传

下一节,我们将聊聊这些基本协议与MAC子层的关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本数据链路层协议(第n次学数据链路层,这次一定要理清!——数据链路层最全面有条理的解析(六)) 的相关文章

  • 实习日记之SNMPV3不难

    SNMPv3 的连接 snmpwalk v 3 u a a MD5 A Qaz1234567 x AES X Qaz1234567 l authPriv 10 0 31 132 1 3 6 1 2 1 6 前面 v 3 xff0c 意思是在
  • 一些控制算法学习

    pid LQR xff08 LQG xff09 xff0c 鲁棒控制 xff08 H无穷 xff09 xff0c 自适应控制 xff08 包含滑膜 xff0c 反步法 xff0c mrac模型参考 xff0c L1自适应 xff09 xff
  • Qt和其它GUI库的对比

    Windows 下的 GUI 库 Windows 下的 GUI 解决方案比较多 xff1a 基于 C 43 43 的有 Qt MFC WTL wxWidgets DirectUI Htmlayout xff1b 基于 C 的有 WinFor
  • stm32初学 Keil debug断点调试的步骤

    网上没搜到 xff0c 自己简单写一个 xff0c 希望对大家有用 1 在debug模式下 xff0c 将需要观察的变量选中 xff0c 右键Add to添加到 Watch 1中 原本Watch应该位置在右下角见图二 xff0c 是我拖到了
  • 关于a++和++a

    作者 xff1a Huya天涯过客 写此博文的初衷是想将自己的心得体会与Java初学者进行分享 xff0c 已在该领域纵横多年的技术大佬请自行跳过 刚学到数据类型以及变量赋值的同学们肯定会接触到自增运算符这个知识点 xff0c 绝对有很多人
  • Nuttx学习笔记(一)——Nuttx系统开发环境搭建

    最近刚开始接触Nuttx xff0c 在配置环境的时候踩了一些坑 xff0c 写下这篇博客记录一下 本人搭建开发环境的时候 xff0c 参考了官方文档和YouTube上的一个大佬的视频 xff0c 链接如下 xff1a 官方文档 http
  • Linux驱动_驱动设计的思想(面向对象、设备树)

    一 Linux驱动 驱动设计的思想 xff08 面向对象 分层 分离 xff09 总则 xff1a Linux驱动 61 驱动框架 43 硬件操作 61 驱动框架 43 单片机 1 面向对象就是用结构体表示某个对象 2 分层 3 分离 事实
  • 2惠普暗影精灵恢复出厂设置

    因为之前把电脑送去惠普售后店维修了 xff08 寻找惠普官方售后店的方法 xff1a 关注微信公众号惠普服务 xff09 xff0c 拿回来的时候系统被店里的人重装了 xff0c 不但C盘只剩下十几G的空间 xff0c 而且多了阴魂不散的3
  • Ubuntu18.04屏幕自动旋转解决方法

    Ubuntu屏幕突然自己旋转 xff0c 大概率是因为开了重力感应 xff0c 电脑倾角变动后 xff0c 屏幕跟随旋转 首先先把屏幕转回来 终端输入 xrandr span class token operator span q 查看连接
  • 傅里叶与图像特征简介

    傅里叶变换在图像处理中有着广泛的应用 xff0c 主要应用方向有 xff1a 图像增强与去噪 边缘检测 特征提取 图像压缩等 其核心思想是使用傅里叶变换将图像由空间域转换至频率域 xff0c 通过对频率域进行不同的运算操作 xff0c 实现
  • openCPU开发demo详解包括线程调度、队列等的使用

    OpenCPU开发例程的详细解释 xff0c 包括各种功能的测试 xff0c 如线程 队列等 源代码为osi demo c 初步学习 xff0c 可能有误 xff0c 仅供参考 demo详解 代码部分系统函数fibo textTrace 输
  • 如何在ros上编写一个简单的node并进行通信

    如何在ros上编写一个简单的node并进行通信 这里采用ros教程的例子 xff0c 稍作修改 与C 43 43 不同的是 xff0c python不需要在package中加入message runtime以及message generat
  • ros编写自己的msg(Python)

    这里 xff0c 假设我们的包名叫做test py 我们写自己的msg文件在该包的msg文件夹下 test msg float32 data 然后 xff0c 我们编写自己的talker py文件如下 usr bin env python
  • docker(2)——docker仓库之Registry、harbor仓库

    一 什么是仓库 Docker 仓库是用来包含镜像的位置 xff0c Docker提供一个注册服务器 xff08 Register xff09 来保存多个仓库 xff0c 每个仓库又可以包含多个具备不同tag的镜像 Docker运行中使用的默
  • 物联网平台设备数据同步到RDS & MySQL数据库(保姆级教学)

    物联网平台设备数据同步到RDS amp MySQL数据库 xff08 保姆级教学 xff09 目标实现 xff1a 阿里云物联网平台某设备实时数据 xff08 MQTT协议上云 xff09 同步存储到RDS MySQL数据库 实现步骤 xf
  • 重头开始

    总感觉 生活中缺点什么 今天开始更新我正在学的FPGA和ESP8266的一些教程和心得 xff1b
  • ESP8266与FPGA初识

    ESP8266 今天其实就了解了一下ESP8266的一些相关 我们主要使用由SDK来编写代码来控制ESP8266以往我们用8266通常都是用AT指令用单片机串口控制的 这样的优点是简单 但是效率不是很高 xff0c 我们知道ESP8266本
  • 大创训练:基于图像处理的智能安防系统(序)

    基本完成目标 xff1a 利用OPENCV进行图像人脸识别进行操作 后期 xff1a 实际应该用到各个平台 QQ xff1a 754331516 欢迎交流 两周一更
  • 研究中常用的数据归一化方法(附Matlab程序)

    在数据处理中 我们往往需要对计算得到的结果数据 xff08 如fMRI中计算得到功能连接等指标 xff09 进行归一化 xff08 Normalization xff09 处理 其实不止在脑科学领域 xff0c 在其他领域也常常需要对结果数
  • INA219与INA216测试总结

    最近需要用到测电压的芯片 xff0c 主要看了一下有TI芯片的INA219系列和INA226系列 xff0c 索性回来都测试了一下 xff0c INA216的话我测试的时候没有图片 INA219我用的是这一款 xff0c 这一款我测试的时候

随机推荐

  • 基于ACFLY无人机调试笔记(一)

    调试心得 最近调试有空了来调试无人机 xff0c 飞控是用的ACFLY EDU的开源飞控 xff0c 因为ACFLY的教程比较少 xff0c 比较偏向商业化 xff0c 所以我开始记录一下使用 记录些项目进行二次开发过程中的细节ACFLY的
  • 入门信号完整性(1)

    最近在学习信号完整性 记录一下学习的过程 好久没回来写了 总觉得脑子是不够用的 这一回打算在博客上写关于信号完整性的知识 xff0c 但是信号完整性的知识非常的抽象 xff0c 所以我们也不能只是学习理论啦 xff0c 还需要仿真软件 xf
  • 二极管仿真模式在同步BUCK里面的应用

    效化和小型化 xff0c 一直都是功率电源发展的两个方向 同步BUCK在这两个方面的卓越表现 xff0c 也是在越来越多的场合得到了运用 xff0c 像锂电池充电 二次砖块电源等等 如图1所示 xff0c 同步BUCK相较传统BUCK最主要
  • 树莓派初体验之安装及SSH远程连接

    树莓派初体验之安装及SSH远程连接 安装远程通信 等了好久终于把树莓派等来了 xff0c 想法是通过pix4飞控和树莓派通信 xff0c 进行飞控的开发 xff0c 毫无经验 xff0c 一点一点来吧 xff0c 也希望有人一起来愉快的学习
  • 树莓派4B与Pixhawk4飞控之状态读取

    树莓派4B与Pixhawk4飞控之状态监控读取 飞控配置树莓派配置程序代码总结 先看看装备 xff0c 上节就说了 xff0c 这树莓派的壳子我喜欢 历经九九八十一难 xff0c 终于把树莓派和Pixhawk4飞控接通了 xff0c 中间尝
  • Ros机器人之(五)订阅subscriber消息

    Ros机器人之 xff08 五 xff09 订阅subscriber消息 这个讲的是订阅节点消息 learning topic里src下创建一个cpp文件 touch pos subscriber 内容如下 xff1a span class
  • Ardupilot之Mavros实现Ros节点控制(一)

    Ardupilot之Mavros实现Ros节点控制 Mavros安装修改Mavros运行Mavros 这部分ros发布的命令话题参考的是PX4固件最基本的Offboard node节点 xff0c 命令发布后 xff0c 能够连接并解锁 x
  • Ardupilot之Mavros实现Ros节点控制(二)

    Ardupilot之Mavros实现Ros节点控制 xff08 二 xff09 offboard建立仿真运行 未完成mavros安装及相关设置的参考上一篇文章 Ardupilot之Mavros实现Ros节点控制 xff08 一 xff09
  • Dronekit代码学习(一)连接及基础状态设置

    Dronekit代码学习 xff08 一 xff09 连接及基础状态设置 目前Dronekit可自行设置的内容较少 xff0c 但能满足基本使用要求 后面还是需要对Mavlink相关指令进行学习 连接 地址根据实际情况修改 xff0c 官网
  • PX4之Gazebo多机仿真尝试

    PX4之Gazebo多机仿真尝试 运行多机前 xff0c 确保你的单机运行没有问题 Px4源码中已经包含了二机的仿真 xff0c 运行以下命令 xff1a roslaunch px4 multi uav mavros sitl span c
  • windows10+nvidia驱动+cuda10.1+cudnn安装教程

    一 显卡驱动 提前安装好nvidia驱动 xff0c windows一般都自动安装了nvidia驱动了 没有安装驱动可以去官网下载驱动 https www geforce cn drivers 选择自己对应的显卡驱动 xff0c 默认安装就
  • GAAS学习(一)Offboard基本控制

    GAAS学习 xff08 一 xff09 Offboard基本控制 开源项目GAAS xff1a https github com generalized intelligence GAAS 一 确保环境安装配置完成 ROS Firmwar
  • Dronekit代码学习(五)基于Gps下的自动跟随

    Dronekit代码学习 xff08 五 xff09 基于Gps下的自动跟随 参考Dronkit python xff1a https github com dronekit dronekit python 实时更新PC端GPS位置 xff
  • GAAS学习(三)简单全局目标追踪

    GAAS学习 xff08 三 xff09 简单全局目标追踪 基于KCF简单目标追踪 xff0c 方法如下 xff1a 编译KCF相关库 git clone https span class token punctuation span sp
  • MATLAB车牌识别(含GUI,语音播报)

    GUI框架源码 xff1a https download csdn net download weixin 44748303 12682333 一 设计原理及设计方案 1 系统简述 一个完整的车牌识别系统闭应包括车辆检测 图像采集 图像预处
  • 一个程序员的成长之路

    一个程序员的成长之路 接下来就是你要学的东西 xff0c 从简入难 xff0c 由浅入深 xff0c 以下的东西 xff0c 通通都要学会 静态网页 43 HTML 43 Css 43 JavaScript 43 JQuery 43 Boo
  • Jetson TX2 重装系统(刷机)+后续设置(安装Fcitx、解决拼音候选词不显示、换国内源、局域网实现VNC远程桌面)

    xff08 珍爱生命 xff0c 远离TX2 xff01 xff01 xff01 xff09 一 Jetson tx2刷机过程及注意事项 二 安装Fcitx 43 Googlepinyin 三 解决拼音模式下不显示候选词bug 四 Ubun
  • 链队为什么要有两个结构体和链队的几个基本功能

    链队 链队为什么有俩个结构体 xff1f 其实链队不是必须有两个结构体的 span class token keyword typedef span span class token keyword struct span qnode sp
  • VIO系统常用初始化方法总结(3)

    本文总结基于优化迭代的初始化方法 参考文献 1 VI ORB 首先利用单目视觉里程计进行初始化 得到了三维空间中一系列相机位姿和地图点 同时 通过不断对惯性测量单元的测量数据进行预积分 得到每两个关键帧之间的预积分量 与视觉方法计算出的位姿
  • 基本数据链路层协议(第n次学数据链路层,这次一定要理清!——数据链路层最全面有条理的解析(六))

    基本数据链路层协议 有关底层通信模型的基本假设三个单工协议乌托邦式单工协议无错信道上的单工停 等协议有错信道上的单工停 等协议 滑动窗口协议 xff08 全双工 xff09 1位滑动窗口协议回退N协议选择重传协议 有关底层通信模型的基本假设