中科大计网学习记录笔记(十五):可靠数据传输的原理

前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是什么再去看 RDT 是如何解决它的会很有帮助;在 RDT 之后又引入了流水线协议去解决 RDT 利用效率问题,这部分同样需要先搞清楚提出了什么问题。

前言:

学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程
该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信息量过大,有太多无法理解的地方,在我第一次点开的时候也有相同的感受,但经过了一段时间项目的学习,对计网有了更多的了解,所以我准备在这次学习的时候做一些记录并且加入一些我的理解,希望能够帮助到大家。
往期笔记可以看专栏中的内容😊😊😊

文章目录

      • 3.4 可靠数据传输的原理
        • 3.4.1 实现 RDT 通信需要解决哪些问题?
        • 3.4.2 RDT 1.0 - 可靠信道上传输数据
        • 3.4.3 RDT 2.0 - 在具有比特差错的信道传输数据
          • 3.4.3.1 RDT 2.1
          • 3.4.3.2 RDT 2.2 - NAK FREE
        • 3.4.4 RDT 3.0 - 在具有比特差错和分组丢失的信道上传输
        • 3.4.5 流水线协议
          • 3.4.5.1 案例
          • 3.4.5.2 滑动窗口
        • 3.4.6 GBN 协议
        • 3.4.7 SR 协议

3.4 可靠数据传输的原理

💡 RDT(Reliable Data Transfer,可靠数据传输)是一种通信协议,旨在通过各种技术手段确保数据在通信网络中可靠地传输。RDT的实现方式可以基于不同的传输层协议,如TCP或UDP。

3.4.1 实现 RDT 通信需要解决哪些问题?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果说是在传输层来实现可靠数据传输的话需要从上层收取数据,将其进行封装然后交给下层,但如果下层是 unreliable 的话,就需要通过本层实现来解决下层不可靠的问题。

整个可靠数据传输需要解决如下的问题:

  1. 完整性(Integrity):数据在传输过程中没有被篡改或损坏。接收方能够准确地接收到发送方发送的数据。
  2. 顺序性(Ordering):数据包按照发送的顺序被接收方接收。即使在传输过程中发生了拥塞或丢包,接收方也能够按照正确的顺序重组数据。
  3. 可靠性(Reliability):数据包能够在不丢失的情况下被接收方接收到。如果数据包丢失或损坏,可靠的传输机制会重新发送数据,直到接收方正确地接收到为止。
  4. 及时性(Timeliness):数据包能够在合理的时间内被接收方接收到,避免过长的延迟或等待时间。

但如果网络层实现了其中的一部分,那传输层只需要解决 剩余的部分 即可。

所以采用一种渐进的方式来讲述 RDT 的实现,先假设一个可靠的传输信道,再逐步减少其能实现的功能,同时逐步是通过上层的协议来解决这些问题。

💡 使用有限状态机(FSM)来描述发送方和接收方

  • 是一种抽象的计算模型,用于描述系统在不同状态之间的转换以及状态转换所触发的行为。有限状态机由一组状态、一组输入和一组状态转换规则组成。
  • 使用圆来表示一种状态,使用连线来表示从一个状态到另一个状态的变迁,连线上的标注:分子表示引起状态变迁的事件,分母表示状态变迁的时候要进行的动作。
  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
3.4.2 RDT 1.0 - 可靠信道上传输数据

💡 此时下层的信道是完全可靠的

  • 没有比特出错
  • 没有分组丢失

此时的传输层就不需要做任何的操作,只需要接收上层的数据并且封装,接着将数据交给网络层即可。

此时发送方和接收方的 FSM:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

💡 看懂这个图需要记住上面说的分子和分母的含义

  • 发送方等待上层的数据,上层使用 rdt_send(data) 发送数据
  • 此时发送方将数据封装并且调用下层的 udt_send() 来进行发送
  • 接收方同理,接收到数据然后解封装向上层传递
3.4.3 RDT 2.0 - 在具有比特差错的信道传输数据

💡 此时下层的信道就稍微不可靠一点了,会使得发送的分组中的比特翻转过来。

此时发送方和接收方就需要通过一定的手段来找出数据中是否存在问题和解决了。

比如使用 校验和 的方式:

  • 校验和是一种简单的错误检测方法,通常用于确认数据在传输过程中是否发生了错误。

  • 它通过对数据中的每个字节进行加和运算得到一个校验值,并将该校验值附加到数据中 一起传输

  • 接收端 在接收到数据后也计算校验和,然后与发送端附加的校验和进行比较,如果两者相等,则说明数据在传输过程中没有发生错误;如果不相等,则说明数据可能已经损坏,需要进行重传。

  • 校验和虽然能够检测一部分错误,但并 不是完美的错误检测方法,因为存在一些情况下校验和并不能准确地检测出错误。

💡 这篇博客里有关于 UDP 校验和形成的描述,感兴趣的朋友可以去看看:中科大计网学习记录笔记(十四):多路复用与解复用 | 无连接传输:UDP

此时校验如果出错,那解决方法就只能是通过 重传,所以需要 将检测结果反馈给发送端 来决定是否重传,当数据没有错误的时候向发送端发送 确认(ACK),反之发送 否定确认(NAK)

  • 发送方需要等待接收方的确认消息才能决定是否重传分组或者继续发送其他分组
  • 发送端接收到 NAK 的时候就重传分组

此时发送方就有了等待上层交付数据和等待接收方返回数据两种状态

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4.3.1 RDT 2.1

💡 RDT 2.0 存在一个致命的缺陷:既然发送的数据可能损坏,那发送的 ACK 或者 NAK 是否也有可能损坏呢?

此时就需要一种解决方法:

发送方接收到一个无法理解的消息,这个消息有两种可能:ACK 或者 NAKNAK 直接重传就可以了,但是得有一种方法能让接收方重传这个 ACK

  • 此时就采用和 NAK 同样的处理方式,直接重新发送上次的分组过去。
  • 此时如果接收方发送的是 NAK 那就直接结束了,但如果发送方发送的是 ACK 但是接收到了相同的分组,也就知道是发送的 ACK 在传输中出现了问题,直接重发 ACK 即可。
  • 为了让接收方和发送方都能认识分组,所以采用编号的方式,快速的判断是否是重传。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4.3.2 RDT 2.2 - NAK FREE

💡 发送数据不一定一次就只发送一条数据,但如果发送多条数据的其中一条出错,仍然使用单调的NAK 解释的话,就无法知道要重发哪一条。

  • 停等协议(Stop-and-Wait)
  • 流水线协议(Pipelining Protocol)

同时上面又引入了编号,那就有了一种新的确认错误的方式:发送的编号和返回的编号是否相同,比如说发送的是数据 0 但是接收方传输过来的是 ACK(1) 这时候同样可以达到标识错误。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种改动其实对单个数据发送没有太大影响,而对后续改编成连续数据的发送则有很大的帮助。

3.4.4 RDT 3.0 - 在具有比特差错和分组丢失的信道上传输

💡 此时下层的信道可能会丢失分组,比如数据会丢失,或者 ACK 也可能会丢失

这样就带来了一些问题:发送方不知道接收方接收到了没有,因为发送的数据和发送方的 ACK 都有可能会丢失。

此时的解决方式就是采用超时重传机制:发送方等待 ACK 一段时间,如果没有收到就说明出现了问题,此时直接重传:

  • 如果此时是数据丢失的情况,重传后双方同步
  • 如果是 ACK 丢失的情况,接收方接收到了重复的数据,同样发送 ACK 回去,此时也能同步

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

👉 这个超时重传的时间设定要合理,当时间设置的过长会导致错误处理不及时,过低则会导致使用效率的降低:

  • 当 ACK 还没来得及过来的时候发送方就重发了信息,此时接收方收到了重发,再次发送一个 ACK 过去,这样就会导致每次发送都是两次甚至多次的发送:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4.5 流水线协议

💡 此时通过 RDT 协议已经解决了网络层可能出现的所有问题,但是发送一条后等待确认再发送下一条的特质使得其对信道的利用效率极低。

3.4.5.1 案例

💡 使用发送速率为 1 Gbps 的链路进行通信,端到端的传播延时为 15 ms,一个分组的大小为 1kB,评判一下数据传输的效率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传输延时为 8 / 109 = 8 us

总延时:15ms ✖ 2 + 8us

此时的利用率也就是总延时除以发送延时,达到了 0.00027,也就是说只有 0.027% 的时间在发送数据,其他时间都在等待 ACK。

这样的效率显然是不尽如人意的,所以在等待的时间中可以通过再次发送其他数据来增大利用率。

3.4.5.2 滑动窗口

💡 在学习具体的流水线协议之前要先了解滑动窗口,这是实现该协议的一种机制。

比如说此时有五个分组等待发送

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

肯定无法直接将这五个分组全部打出去,因为接收方的接受能力是有限的,而且下方的网络层提供的是不可靠的传输,需要对错误的信息进行重传等操作。

所以需要设置一个固定大小的 缓冲区,将每次只处理缓冲区域内的数据,等到缓冲区域中的一部分数据处理完成,通过移动缓冲区,又可以处理新的数据。

假设缓冲区的大小为 3,就将这三个数据全部打出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时进入等待,等到数据 0 的 ACK 收到的时候,就可以移动窗口了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样逐次进行操作,直到处理完所有需要发送的分组。

以上就是滑动窗口的基本思想,同样的,在接收方也可以顺序的去接收一个分组或同时可接收多个分组,对于这两种情况发送方又有不同的策略。

3.4.6 GBN 协议

💡 GBN(Go-Back-N):当接收方一次只能接收一个分组的时候就需要使用该协议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时发送方只能接收分组 0,当接收到分组 0 的时候,将可接受的内容后移一位来接收 1,同时向发送方发送 ASK。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发送方接收到 ASK 之后可以移动窗口继续发送其他分组。

这是最好的情况,比如说此时通信处于如下的情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接收方等待接收分组 2,但是如果出现了某些情况导致分组 2 没有到达,而是分组 3 和 分组 4 到达,那这时候接收方就会 拒收 这些分组。

那这样之后,分组 2 包括其以后的分组都没有收到,必须通知发送方来重传;最好的方式就是给分组设置定时器,如果发送的分组没有收到 ASK 的话,就进行重传的操作。

所以当接收方收到分组 3 的时候,会返回 分组 1 的 ASK,那自然分组 2 之后的所有分组在分组定时器到期后就会进行重传操作,解决了分组丢失的问题。

所以当分组 2 丢失了之后就需要跳回到数个位置之前去重传,所以称之为 Go Back N。

但显然因为一个分组的丢失去重传多个分组是可以优化的,可以让 接收方同时可以接收多个分组 来实现,这也就是接下来要说的 SR 协议。

3.4.7 SR 协议

💡 SR(Selective Repeat):即选择重传协议,通过让接收方接收多个分组,可以实现选择性的重传分组,而不需要重传 N 个分组。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时比如说接收到了分组 2,就将分组 2 先保留下来,同时发送 ASK2 给发送方,发送方此时给分组 2 一个标识,然后只需要发送其他的未接受到 ASK 的分组即可。

这个重发操作同样是通过 定时器 来实现。

对比一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 当出错率低的时候使用 GBN,因为即使是 Go Back N 带来的损失依旧很小,没必要去使用复杂的 SR 协议。
  • 当链路容量很大的时候建议使用 SR,因为容量大代表同时可发送的内容较多,为了充分利用就会同时发送很多的分组,此时如果出现错误,代价会比较大。

平衡这两点考虑就可以选择出适合的协议方式。

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

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

相关文章

python自动化管理和zabbix监控网络设备(有线网络配置部分)

目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name huawei revision-level 1 instance…

学习python的第7天,她不再开放她的听歌榜单

我下午登录上小号,打开聊天消息看到了她的回复,我很开心兴奋,可是她不再开放她的听歌榜单了,我感觉得到,我要失恋了。 “因为当年电视上看没有王菲版本的” “行”。 “那你以后还会开放听歌榜单吗?”我…

Python入门必学:reverse()和reversed()的区别

Python入门必学:reverse()和reversed()的区别 📅2024年02月25日 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

支付功能、支付平台、支持渠道如何测试?

作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 作为产品,我自己办了十几张银行卡方便测试,但QA和开…

openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore

文章目录 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore229.1 设计原理229.2 核心优势229.3 使用指导 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore Ustore存储引擎,又名In-place Update存储引擎(原地更新&#xff09…

【前端素材】推荐优质医院后台管理系统I-Health平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作,用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心,管理员可以通过后台系统进行各种管理和配置操…

数据结构(算法竞赛、蓝桥杯)--线段树+懒标记

1、B站视频链接:C02【模板】线段树懒标记 Luogu P3372 线段树 1_哔哩哔哩_bilibili 题目链接:P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) void build(int p,int l,int r){tr[p]{l,r,w[l],0};if(lr)return;//叶子节点返回int…

SpringBoot -【BeanFactory】基础使用及应用场景

1.介绍 在 Spring 框架中,BeanFactory 是 Spring IoC 容器的核心接口,负责管理 bean 的创建、配置和装配。它是 Spring IoC 容器的基础。BeanFactory 接口定义了一系列方法,用于管理和访问容器中的 bean 对象。 BeanFactoryAware 用于在 Sp…

matlab悬臂梁有限元分析

1、内容简介 略 47-可以交流、咨询、答疑 2、内容说明 略 建模说明 设计一个长方体的悬臂梁,长宽高分别为100m、10m和15m,材料特性为杨氏模量2e5,泊松比0.3, Matlab有限元分析(截图) 上图为悬臂梁的扰度…

Autosar 开篇

背景 AUTOSAR(Automotive Open System Architecture)是一个跨汽车行业的标准化软件架构,旨在促进汽车电子系统的开发和部署。下面是AUTOSAR发展的一些关键点: 起源和背景: AUTOSAR最初于2003年由汽车制造商宝马、戴姆…

从私人客户转变为教练会员网站

教练和顾问可以做出的最令人兴奋的转变之一就是通过教练会员网站扩大业务规模。 一对多优惠的类型有很多种,但与任何其他选择相比,教练和顾问的会员资格拥有最多的机会和灵活性,可以与你和你的客户一起发展。 世界正在转向更容易获得和更…

Peter算法小课堂—动态规划

Peter来啦,好久没有更新了呢 今天,我们来讨论讨论提高组的动态规划。 动态规划 动态规划有好多经典的题,有什么背包问题、正整数拆分、杨辉三角……但是,如果考到陌生的题,怎么办呢?比如说2000年提高组的…

AD24-Gerber生产文件输出及整理

一、Gerber生产文件输出 1、先进行规则检查 2、Gerber Files输出 3、钻孔文件 4、IPC网表 5、坐标文件 二、Gerber Flies文件整理 1、CAM 2、SMT 3、ASM 4、PRJ 5、DXF

ubuntu安装gptsovits

我看到社区有人需要,刚好我自己也要安装个ubuntu的用在自己的4090服务器上玩一玩。 于是就写一篇这样的教程。但是我只需要他的api推理,用于测试4090合成速度。所以这里只执行Python api.py 环境 1.首先下载整合包,里面有个nltk_data,拿出来…

Jmeter之单接口的性能测试

前言: 服务端的整体性能测试是一个非常复杂的概念,包含生成虚拟用户,模拟并发,分析性能结果等各种技术,期间可能还要解决设计场景、缓存影响、第三方接口mock、IP限制等问题。如何用有限的测试机器,在测试环…

Mysql 连接最近经常报超时

原因 怀疑是某个服务频繁调用mysql操作,导致linux buff/cache 过大 # 通过下列命令查看 free -h解决方案 临时解决方案: 可以通过写入 /proc/sys/vm/drop_caches 来释放缓存。这是一个临时的操作,内核会在需要时再次填充缓存 # 释放缓存 sync; echo 3 > /proc/…

【C语言】详解计算机二级c语言程序题

文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …

leetcode:491.递增子序列

1.误区:不能直接对数组排序再求解子集,因为那样就改变了原有数组的顺序 2.树形结构:一个一个取数,然后保证是递增序列,且不能重复。(数层上不可以重复取,树枝上可以重复取)收集的结…

[设计模式Java实现附plantuml源码~行为型]对象间的联动~观察者模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

【大模型 数据增强】IEPILE:基于模式的指令生成解法,提高大模型在信息抽取任务上的性能

IEPILE:基于模式的指令生成解法,提高大模型在信息抽取任务上的性能 提出背景基于模式的指令生成解法效果 提出背景 论文:https://arxiv.org/pdf/2402.14710.pdf 代码:https://github.com/zjunlp/IEPile 2024年02月发布了一个大…