计算机网络:数据链路层 —— 可靠传输服务

news2024/11/25 19:31:08

文章目录

    • 可靠传输
      • 停止-等待 (SW) 协议
        • 超时重传机制
        • 分组编号机制
          • ACK 丢失问题
          • ACK 延迟问题
        • 注意事项
        • 信道利用率
      • 回退 N 帧 (GBN) 协议
        • 滑动窗口
        • 信道利用率
          • 无传输差错
          • 超时重传、回退N帧
        • 累计确认
      • 选择重传 (SR) 协议
        • 滑动窗口

可靠传输

若数据链路层向其上层提供的服务类型为可靠传输服务,若出现了误码的情况,可靠传输服务会通过某种机制实现发送方发送什么,接收方最终就能收到什么。

一般情况下,有线链路的误码率比较低。为了减小开销,并不要求数据链路层向其上层提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理。而无线链路易受干扰,误码率比较高,因此要求数据链路层必须向其上层提供可靠传输服务

可靠传输服务并不局限于数据链路层,其他各层均可选择实现可靠传输。可靠传输的实现比较复杂,开销比较大,是否使用可靠传输取决于应用需求

![[Pasted image 20240406203859.png]]

停止-等待 (SW) 协议

停止等待协议(Stop-and-Wait Protocol)是一种简单的数据链路层协议,用于在两个节点之间进行可靠的数据传输。其基本思想是发送方发送一个数据分组后,等待接收方进行差错检测后发送确认(ACK)分组,只有在收到确认之后,才发送下一个数据分组。若发送的分组出现误码,接收方进行差错检测后将数据分组丢弃,并发送否认(NAK)分组。

![[SW Protocol.png]]

超时重传机制

若发送方发送的数据分组在传输过程中丢失,接收方收不到数据分组,就不会发送相应的 ACKNAK。如果不采取措施,发送方就会一直处于等待接收方 ACK 或 NAK 的状态。

为解决上述问题,发送方可在每发送完一个数据分组时就启动一个超时计时器(Timeout Timer)若到了超时计时器所设置的超时重传时间(Retransmission Time-Out,RTO),发送方仍未收到接收方的 ACKNAK,就重传之前已发送过的数据分组

分组编号机制
ACK 丢失问题

若接收方收到数据分组并完成差错检测后,向发送方发送的 ACK,超过超时重传时间 RTO 后,发送方会向接收方重传数据分组,而接收方无法识别两次收到的数据分组是否重复,因此会出现分组重复问题。

为了避免分组重复这种传输错误,必须给每个分组带上序号。对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其序号与上次发送的数据分组的序号不同就可以了,因此用一个比特来编号就够了,序号有 0 和 1 两种。接收方连续收到两个序号相同的数据分组时,就可以识别出分组重复这种传输差错,接收方会丢弃重复的数据分组,完成差错检测无误码情况后,再发送一个确认分组 ACK

发送方收到 ACK 后,可给接收方发送下一个数据分组,其序号与上一个数据分组的不同。

ACK 延迟问题

若接收方收到发送方的 数据分组0 之后,ACK 发送到发送方时超过RTO,此时发送方重新发送了 数据分组0,而之后 ACK 到达了发送方,发送方误以为这是重新发送的 数据分组0 的 ACK,因此又发送了 数据分组1,而接收方收到重复的 数据分组0 后,发送了 ACK,发送方误认为此 ACK 是对 数据分组1 的 ACK

为避免以上问题,需要给确认分组 ACK 也编上序号,与数据分组对应,发送方就可识别出是对 数据分组0 的重复确认

注意事项
  • 使用超时重传机制后,就可以不使用否认机制了,这样可使协议实现起来更加简单。但是,如果点对点链路的误码率较高使用否认机制可以使发送方在超时计时器超时前就尽快重传

  • 数据链路层确认分组编号一般不会出现确认分组迟到的情况,因此在数据链路层实现停止-等待协议可以不用给

  • 给超时计时器设置的超时重传时间 RTO 应当仔细选择,一般将RTO设置为略大于收发双方的平均往返时间RTT

    • 在数据链路层,点对点的往返时间 RTT 比较固定RTO 就比较好设定。
    • 在运输层,由于端到端的往返时间非常不确定,设置合适的超时重传时间 RTO 有时并不方便
  • 停止-等待协议属于自动请求重传(AutomaticRepeatreQuest,ARQ)协议。即重传的请求是发送方自动进行的,而不是接收方请求发送方重传某个误码的数据分组

信道利用率

不考虑超时重传

![[SW protocol channel utilization.png]]

  • T D T_D TD:数据分组发送时延
  • R T T RTT RTT:往返传播时延
  • T A T_A TA:ACK发送时延

若出现超时重传,对于传送有用的数据信息来说,信道利用率还要降低。

在往返时间 RTT 相对较大的情况下,为了提高信道利用率,收发双方不适合采用停止-等待协议,而可以选择使用 回退 N帧 (GBN) 协议选择重传 (SR) 协议

回退 N 帧 (GBN) 协议

![[GBN Protocol.png]]

在使用流水线传输方式时,发送方不能无限制地连续发送数据分组,否则可能会导致网络中的路由器或接收方来不及处理这些数据分组,进而导致数据分组的丢失,这实际上是对网络资源的浪费。因此,必须采取措施来限制发送方连续发送数据分组的数量。

回退 N 帧协议采用流水线传输方式,并且利用发送窗口来限制发送方连续发送数据分组的数量,这属于连续 ARQ 协议

滑动窗口

滑动窗口,即发送方的发送窗口接收方的接收窗口,采用 n 个比特给分组编序号,序号范围是 0 0 0 ~ 2 n − 1 2^n-1 2n1,当序号增加到 2 n − 1 2^n-1 2n1时,下一个序号又从0开始。

停止-等待协议的发送窗口与接收窗口的窗口尺寸均为1

发送方需要维护一个发送窗口 W T W_T WT,在未收到接收方确认分组的情况下,发送方可将序号落入 W T W_T WT 内的所有数据分组连续发送出去。采用n个比特给分组编序号,则 W T W_T WT 的取值范围是 1 < W T ≤ ( 2 n − 1 ) 1<W_T≤(2^n-1) 1<WT(2n1)。若 W T W_T WT 取值为1,则是停止-等待协议;若 W T W_T WT 取值超过取值范围的上限,当确认分组丢失时,由于接收方无法辨别新旧的数据分组,会出现分组重复的传输差错。

![[GBN WT.png]]

接收方需要维护一个接收窗口 W R W_R WR,只有正确到达接收方(无误码)且序号落入 W R W_R WR 内的数据分组才被接收方接收。 W R W_R WR 的取值只能是 1,这一点与停止等待协议是相同的。

![[GBN WR.png]]

在回退 N 帧协议的工作过程中,发送方的发送窗口和接收方的接收窗口按规则不断向前滑动。因此,这类协议又称为滑动窗口协议

信道利用率
无传输差错

在的情况下,回退N帧协议的信道利用率比停止-等待协议的信道利
用率有显著提高。提高的程度取决于发送窗口的大小。

  • 接收方每正确收到一个序号落入接收窗口的数据分组,就将接收窗口向前滑动一个位置,这样就有一个新的序号落入接收窗口。与此同时,接收方还要给发送方发送针对该数据分组的确认分组

  • 发送方每收到一个按序确认的确认分组,就将发送窗口向前滑动一个位置,这样就有一个新的序号落入发送窗口,序号落入发送窗口内的数据分组可继续被发送,收到确认的数据分组可从发送缓存中删除。

超时重传、回退N帧

超时重传、回退N帧的情况:若数据传输过程中 数据分组2 出现误码,出现误码前的 数据分组0 和 数据分组1 正常处理,数据分组2 进行丢弃,其后的数据分组由于序号未落入接收窗口,接收方将其丢弃,接收窗口无法向前滑动,并向发送方发送最近已按序接收的数据分组的重复 确认分组 ACK1

发送方接收到按序确认的确认分组 ACK0 ACK1,将发送窗口滑动向前对应的位置,将新加入发送窗口的 数据分组5 和 数据分组6 发送出去,收到重复确认分组 ACK1,接收方收到新的 数据分组5 和 数据分组6,由于不能按序将其加入接收窗口,仍会将其丢弃并向发送方发送最近已按序接收的重复确认分组 ACK1

接收方收到多个重复确认分组 ACK1 后,可识别出接收方并未按序正确接收出现差错的数据分组2,发送方可 数据分组2 重传计时器超时之前重新按序发送 数据分组2。发送方可在收到 n 个重复确认分组后立即开始重传,可由具体实现决定。

在 数据分组2 超时之后,发送方就将超时的数据分组以及其后序号落入发送窗口内的数据分组全部重传,尽管 数据分组2 之后的数据分组并非发生误码情况,接收方只能接收序号落入接收窗口的数据分组,因此 数据分组2之后的数据分组全部都要重传,即一旦出错,就需要退回重传已发送过去的 N 个数据分组

一个数据分组的差错就可能引起大量数据分组的重传。在信道质量较差(容易出现误码)的情况下,回退N帧协议 的信道利用率并不比 停止-等待协议 的信道利用率高。

累计确认

回退N帧协议的接收方采用累积确认方式,接收方不必对收到的每一个数据分组都发送一个确认分组,而是可以在收到几个序号连续的数据分组后,对按序到达的最后一个数据分组发送确认分组。接收方何时发送累积确认分组,由具体实现决定。确认分组 A C K n ACK_n ACKn 表明序号为 n 及之前的所有数据分组都已正确接收

优点:减少向网络中注入确认分组的数量。即使确认分组丢失,也可能不必重传数据分组。

缺点:不能向发送方及时准确地反映出接收方已正确接收的所有数据分组的数量。

选择重传 (SR) 协议

选择重传(SR)协议是一种基于滑动窗口的可靠数据传输协议,它允许发送方在接收到确认之前发送多个数据帧,并且只对丢失或损坏的帧进行重传,而不是整个窗口。为了使发送方仅重传出现差错的数据分组,接收方不再采用累积确认,而需要对每一个正确接收的数据分组进行逐一确认

滑动窗口

用 n(n>1) 个比特给分组编号

窗口尺寸: 1 < W R ≤ W T 1 < W_R ≤ W_T 1<WRWT W R W_R WR 超过 W T W_T WT 没有意义

W R + W T ≤ 2 n W_R+ W_T ≤ 2^n WR+WT2n,确保接收窗口向前滑动后,落入接收窗口内的新序号与之前的旧序号没有重叠,避免无法分辨新旧数据分组。

接收窗口 1 < W R ≤ 2 n − 1 1 < W_R ≤ 2^{n-1} 1<WR2n1,当 W R W_R WR 取最大值 2 n − 1 2^{n-1} 2n1 时, W T W_T WT 能取到的最大值也为 2 n − 1 2^{n-1} 2n1

发送窗口:若 W T W_T WT 取值超过取值范围的上限 2 n − 1 2^{n-1} 2n1,当确认分组丢失时,由于接收方无法辨别新旧的数据分组,会出现分组重复的传输差错。

发送方的数据分组出现误码时,接收方会将出现误码的数据分组进行丢弃,将失序但仍正确到达接收方且序号落入接收窗口的数据分组进行缓存,并发送相应的确认分组,接收方不能向前滑动窗口

发送方收到确认分组后,也不能向前滑动窗口,但会记录正确接收的数据分组的确认分组,此时出现差错的数据分组会被超时重传。接收方正确接收重传的数据分组后,发送正确分组并向前滑动接收窗口,确认分组正确到达发送方后,将发送窗口向前滑动。此时发送方将已正确发送的数据分组从缓存中移除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Screen的使用:新建、退出、再登陆

Linux screen 命令详解与使用指南 在Linux系统中&#xff0c;screen 是允许用户在单个终端会话中运行多个进程&#xff0c;并能在会话之间切换。 适用情况&#xff1a;screen 特别适用于远程登录&#xff08;如通过SSH&#xff09;时&#xff0c;确保即使网络连接断开&#x…

2017年-2021年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 2017年1.c语言程序设计部分2.数据结构程序设计部分 2018年1.c语言程序设计部分2.数据结构程序设计部分 2019年1.c语言程序设计部分2.数据结构程序设计部分 2020年1.C语言程序设计部分2.数据结构程序设计部分 2021年1.C语言程序设计部分2.数据结构程序设计部分 2017年 …

《RabbitMQ篇》消息应答和发布确认

消息应答 消息应答机制&#xff1a;消费者接收信息并处理完之后&#xff0c;告诉rabbitmq该信息已经处理&#xff0c;rabbitmq可以把该信息删除了. 消息自动重新入队&#xff1a;如果处理某个消息的消费者异常关闭了&#xff0c;没有发送ACK确认&#xff0c;rabbitmq会将其重…

GEE 高阶应用:eeExtra包(Python、R、julia和JavaScript API)

目录 简介 功能 它是如何工作的? 安装 功能 缩放和偏移 光谱指数 STAC features JavaScript API模型 简介 Google Earth Engine (GEE) 是一个基于云的服务,用于矢量和栅格数据的地理空间处理。Earth Engine 平台具有 JavaScript 和 Python API,提供不同的方法来处…

STM32学习--5-2 旋转编码器计次

接线图 按键按下&#xff0c;旋转编码器输出低电平 Encoder.c #include "stm32f10x.h" // Device headerint16_t Encoder_Count; void Encoder_init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 开启APB2Periph外设GPIOB时钟…

Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)

0x01 产品简介 Palo Alto Networks Expedition 是一款强大的工具,帮助用户有效地迁移和优化网络安全策略,提升安全管理的效率和效果。它的自动化功能、策略分析和可视化报告使其在网络安全领域中成为一个重要的解决方案。 0x02 漏洞概述 Palo Alto Networks Expedition中存…

一键生成证件照_HivisionIDPhotosv1.2.8整合包

HivisionIDPhoto&#xff1a;智能证件照制作 HivisionIDPhoto 专注于开发一套实用且系统化的智能证件照制作算法&#xff0c;旨在为用户提供快速、准确的证件照生成服务。通过完整的 AI 模型流程&#xff0c;HivisionIDPhoto 能够识别多种拍照场景&#xff0c;精准抠图&#x…

牛客SQL练习详解 06:综合练习

牛客SQL练习详解 06&#xff1a;综合练习 SQL34 统计复旦用户8月练题情况SQL35 浙大不同难度题目的正确率SQL39 21年8月份练题总数 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; SQL34 统…

手撕数据结构 —— 带头双向循环链表(C语言讲解)

目录 0.前言 1.什么是带头双向循环链表 理解带头 ​编辑 理解双向 理解循环 2.带头双向循环链表的实现 List.h文件中接口总览 具体实现 结点的定义 申请结点 初始化 打印链表 尾插 尾删 头插 头删 ​编辑​编辑 获取大小 查找 在指定位置前插入 ​编辑…

初知C++:AVL树

文章目录 初知C&#xff1a;AVL树1.AVL树的概念2.AVL树的是实现2.1.AVL树的结构2.2.AVL树的插入2.3.旋转2.4.AVL树的查找2.5.AVL树平衡检测 初知C&#xff1a;AVL树 1.AVL树的概念 • AVL树是最先发明的自平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性…

中国剩余定理 C++

题目 解题思路 原链接&#xff1a;https://www.acwing.com/solution/content/3539/ 大致步骤&#xff1a; 将第2,3,4…n个方程不断与第一个方程合并&#xff0c;得到方程a1k1a2k2m2-m1;用扩展欧几里得算法解出a1k1a2k2gcd(a1, a2)的结果&#xff0c;再将结果扩大(m2-m1)/d倍即…

2-laravel-路由配置

文章目录 定义控制器设计控制器设置路由启动服务 基本路由视图路由建立视图路由建立视图文件 控制器视图路由创建视图二级目录控制器 定义控制器 打开laravel 工程 建立一个 Demo 名字的控制器去集成 模板控制器 安装两个插件 设计控制器 <?phpnamespace App\Http\…

关于电动自行车新增的通信功能要求如下

1、 电动自行车应具有采用TLS加密的4G或5G公网通信模块&#xff0c;或类似功能的地面通信模块。 注:根据我国无线电管理有关规定&#xff0c;可能需要对无线电发射模块或整车进行无线电发射设备型号核准。 2、通信模块具备向电动自行车管理平台发送以下动态安全监测信息的功能&…

SpringBoot项目升级JDK版本(1.8 => 17)

项目&#xff1a;这里使用gitee上一个开源项目做测试《SpringBoot 流媒体项目》 工具&#xff1a;Intellij IDEA 一、下载项目&#xff08;git clone …&#xff09; 1、打开 pom.xml 看一下 2、启动项目&#xff0c;记住它最原本的样子先。成功启动后控制台后面是会输出地址…

怎么进行智能配音?一文告诉你

如何给文字智能配音呢&#xff1f;将文字转化为生动的语音&#xff0c;是提升内容吸引力的有效方式。 无论是制作视频、音频课程还是电子读物&#xff0c;合适的配音都能让信息传递更加高效。 如果你正寻找简单易用的方法来给文字添加配音&#xff0c;这里有几款智能配音软件…

0基础能不能转行做网络安全?

0基础能不能转行做网络安全&#xff1f;网络安全人才发展路线 最近有同学在后台留言&#xff0c;0基础怎么学网络安全&#xff1f;0基础可以转行做网络安全吗&#xff1f;以前也碰到过类似的问题&#xff0c;想了想&#xff0c;今天简单写一下。 我的回答是先了解&#xff0c…

Java对接ModbusRTU协议案例测试(相关代码及调试工具使用)

目的 在无设备的情况下&#xff0c;电脑搭建虚拟环境&#xff0c;进行代码编写以及测试 准备工作 一.测试工具 1.模拟虚拟串口工具&#xff0c;modbus RTU使用一问一答模式进行数据交互。 本文内容&#xff1a;模拟主站从站发送读取数据 2.个人设置&#xff1a;COM10为主站&am…

simulink分段函数

两段函数 20<v<60为真时&#xff0c;输出0.8 20<v<60为假时&#xff0c;即v<20或v>60时&#xff0c;输出0v>20时&#xff0c;输出0.8 v<20时&#xff0c;输出0 n段函数 n-1个switch模块

d3dcompiler_43.dll 文件的缺失常见方法分析,一键修复d3dcompiler_43.dll

在使用电脑的过程中&#xff0c;d3dcompiler_43.dll 文件的缺失是一个常见的技术挑战&#xff0c;这一问题通常会影响到基于Direct3D技术的应用程序的正常运行&#xff0c;可能导致程序启动失败或运行错误。d3dcompiler_43.dll 是DirectX组件的一部分&#xff0c;专责于编译用于…

CLIP图文多模态模型onnxruntime和tensorrt推理

首先下载github项目&#xff1a;https://github.com/Lednik7/CLIP-ONNX 修改clip_onnx/utils.py第61行opset_version12为opset_version15 , 运行测试脚本&#xff1a; import clip from PIL import Image import numpy as np# ONNX不支持CUDA model, preprocess clip.load(&q…