热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

列举rdt3.0所采用的可靠数据传输机制及其作用,可靠的数据传输服务模型rdt1.0

可靠数据传输对于应用层、传输层、链路层都很重要由于网络层提供的尽力而为服务是不可靠的所以在传输层就要有可靠数据传输协议来确保可靠什么是可靠?1.传输的数据包没有错误2.传输的

可靠数据传输对于应用层、传输层、链路层都很重要 由于网络层提供的尽力而为服务是不可靠的
所以在传输层就要有可靠数据传输协议来确保可靠

什么是可靠?

1.传输的数据包没有错误
2.传输的数据包不丢失
3.传输的数据包顺序要正确

一 停等协议(SW):

发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

数据在传送过程中会发生哪些损坏?

1.比特差错:数据包的部分比特从0变成了1或者从1变成了0。
2.分组丢失:分组到达一个中转的路由器时,路由器的输入队列已经满了,此时分组就会溢出,即被丢弃。
3.分组乱序:分组没有按照发送的顺序到达接收方。

第一种情况rdt1.0:底层信道完全可信

现在假设底层信道完全可信,即上面笔者所说的三种分组损坏情况都不会发生,那么分组只要直接从发送方通过底层信道送往接收方
接收方也不需要给发送方回应,因为分组准确地到达并且不会发生任何差错

第二种情况rdt2.0:底层信道中分组可能出现比特差错

传输中出现比特差错是非常常见的 因此,发送方需要接收方的确认信息来告诉发送方传送的分组数据是否有差错。当数据无误的时,接收方
发送一个ACK(肯定确认)的回应表示数据没有问题,如果数据错误,则发送一个NAK(否定确认)回应表示数据有问题需要重传。
如何判断数据是否有错:
发送方在发送分组的时候需要为分组计算一个检验和,当分组到达以后,接收方用同样的计算方法对分组进行计算。
将得到的检验和与发送方的检验和进行核对以检验分组数据是否传输出错。

流程如下:

上层通知发送方发送分组数据,发送方将分组数据计算以后得到检验和并放置在头部之中,在发送完分组以后,发送方处于等待接受方回应的状态中。
接收方收到了分组(注意,在该种情况下已经假设分组不会中途丢失,因此接收方一定会接收到分组),检验数据以后:
数据正确则返回ACK。
数据错误则返回NAK。
发送方收到了接收方的反馈信息,此时有两种情况:
接收到了NAK,表明数据有错,因此发送方重传该数据,并处于等待接收方回应的状态中。
接收到了ACK,表明数据正确,发送方继续等待上层的下一次调用通知。

在发送方与接收方的交互中,可以看到使用了差错检测,接收方反馈,重传这三个功能,基于这三个功能以及还有超时功能的可靠数据传输协议被称为ARQ协议

rdt2.1:发送方应对接收方发送的ACK或者NAK出现比特差错

我们看rdt2.0有什么问题,我们知道确认信号也需要通过信道传播,那么如果ACK/NAK的信号发生了错误呢?发送方应该怎么处理?
显然发生了错误,我们就应该重传
但是这里又有一个问题,接收方怎么知道发送方这次传过来的是新的报文段还是因为ack出错而重传的报文段呢?
显然我们需要区分,上一个报文段和当前的报文段,我们给报文段编写好序号就可以了,而且只需要0,1两个序号
一个表示上次的报文段,一个表示新接受的。这样接收方如果收到0,就知道这次不是新的报文段,可能是上次ack出错了
发送方无法确认,就重传了上次的报文段,所以接收方需要丢掉这个报文段,然后再次传一次ack确认信号
如果收到的是序号为1的报文段,则接收方直接接受就可以了。
对比2.0要多做的工作
发送方:
1.为每个分组增加了序列号
2.两个序列号(0, 1)就够用,为什么?
3.需校验ACK/NAK消息是否发生错误
4.状态数量翻倍
5.状态必须“记住”“当前”的分组序列号
接收方:
1.需判断分组是否是重复
2.当前所处状态提供了期望收到分组的序列号
3.注意:接收方无法知道ACK/NAK是否被发送方正确收到

rdt2.2:无NAK消息协议

我们考虑一下我们真的需要两个确认信号ack和nck么?
与rdt 2.1功能相同,但是只使用ACK如何实现?
1.接收方通过ACK告知最后一个被正确接收的分组
2.在ACK消息中显式地加入被确认分组的序列号
3.发送方收到重复ACK之后,采取与收到NAK消息相同的动作重传当前分组

第三种情况rdt3.0:底层信道中出现分组丢失

假设分组有可能被发送方与接收方之间的中转路由器丢弃了,而此时发送方与接收方根本不知道分组被丢弃了,导致双方都陷入了一个死循坏的等待中。
因此,一个简单的解决方法是,发送方需要设置一个定时器,当发送分组的时候开始计时,如果在一定时间内(传播时延+接收方处理分组时间)
没有收到接收方的回馈分组,则重传当前分组。
需要注意的是,由于发送方使用了计时器,所以当发送方收到了当前分组的上一个分组的ACK的时候(即当前分组传输损坏)或者回馈分组损坏的时候
(这两个操作都不会重置计时器),并不会立即发送当前分组,而是等到计时器超时才重新发送当前分组。

二 流水线可靠数据传输协议

在解决了上面三种分组数据损坏的问题后,得到的的确是一个可靠的数据传输协议,但是,上述的可靠数据传输协议采用的是停等协议
这必然造成了效率的低下,不能对链路带宽充分的利用。因此,有没有方法使发送方不断的发送分组,而无需等待发送分组的确认呢?

实现流水线发送分组而无需确认分组,需要做到:

1.增加分组的序号范围,不能简单的使用0和1来作为分组的序号(顺便一提在TCP中分组序号是按照数据的字节顺序给的,并非按照分组排序)。 2.发送方与接收方都需要有缓存用来存储分组。 3.提供当分组数据出错,超时,重传的处理方法:选择重传(SR)协议以及回退N步(pgddpw)协议。 1.回退N步协议(pgddpw)

假设在序号空间内,划分一个长度为N的子区间,这个区间内包含了已经被发送但未收到确认的分组的序号以及可以被立即发送的分组的序号
这个区间的长度就被称为窗口长度。(随着发送wsdds对ACK的接收,窗口不断的向前移动,并且窗口的大小是可变的,因此pgddpw协议也被称为滑动窗口协议

当上层调用发生时,发送方根据窗口情况变化:
1.如果窗口内已经被发送但未收到确认的分组数目已经达到了窗口长度(此时就没有可以被立即发送的分组的序号了),发送方可以把上层的数据缓存起来或者告诉上层隔一段时间以后再来调用。
2.如果窗口内还有可以分配的立即被发送的分组序号,则为上层的数据分配分组序号并立即发送,更新可以被立即发送的分组序号。

那么,为什么要限制窗口长度为N,而不直接设置窗口长度为整个发送方的缓存长度呢?这是为了给TCP协议提供流量控制的功能(注意,流量控制与差错控制要区分)。

pgddpw协议还采取了累积确认,当发送方收到一个对分组n的ACK的时候,即表明接收方对于分组n以及分组n之前的分组全部都收到了。

对于超时的触发,pgddpw协议会将当前所有已发送但未被确认的分组重传,换句话说,如果当前窗口内都是已发送但未被确认的分组
一旦定时器发现窗口内的第一个分组超时,则窗口内所有分组都要被重传。每次当发送方收到一个ACK的时候,定时器都会被重置。

pgddpw协议对于接收方则相对比较简单,接收方只需要按序接收分组,对于比当前分组序号还要大的分组则直接丢弃。假设接收方正在等待接收分组n,而分组n+1却已经到达了,于是,分组n+1被直接丢弃,正是因为这种处理,所以发送方并不会出现在连续发送分组n,分组n+1之后,而分组n+1的ACK却比分组n的ACK更早到达发送方的情况。
那么,pgddpw协议对超前到达的分组直接丢弃的做法会不会有点过于浪费呢?大家可以注意一下pgddpw的超时机制,即使分组n+1已经预先到达了接收方,但只要分组n没有到达接收方,则很有可能导致发送方的定时器超时,而一旦定时器超时,则所有已发送但未被确认的分组都会被重传,其中就包括了分组n+1,因此,接收方只要简单的丢弃提前到达的分组n+1就可以了。

2.选择重传协议(SR)

在了解了pgddpw协议之后,或许有人对pgddpw的超时重传机制感到困惑,有必要因为一个分组的超时而重传所有的已发送而未被确认的分组么?
SR协议允许接收方对于超前分组的到达返回ACK,则发送方就会出现在收到分组n的ACK之前接收到分组n+1的ACK的情况。

对于SR协议来说,发送方需要做到:

1.为每一个已发送但未被确认的分组都需要设置一个定时器,当定时器超时的时候只发送它对应的分组。2.当发送方收到ACK的时候,如果是窗口内的第一个分组,则窗口需要一直移动到已发送但未未确认的分组序号。

接收方需要做到:

1.维护一个接收窗口(注意,在之前的协议之中,接收方都只需要维护当前分组的序号即可)。2.当分组序号在接收窗口之内的时候,返回该分组的ACK并视情况移动接收窗口,而如果分组序号在分组之前(冗余分组),返回该分组的ACK。

需要注意的是,接收窗口内不能出现两个分组的相同序号,否则接收方无法辨认需要对一个冗余分组的ACK还是对一个新的分组的ACK,
因此,接受窗口长度必须小于或者等于序号空间的一半。


推荐阅读
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 显卡驱动对游戏的影响及其提升效果的研究
    本文研究了显卡驱动对游戏体验的提升效果,通过比较新旧驱动加持下的RTX 2080Ti显卡在游戏体验上的差异。测试平台选择了i9-9900K处理器和索泰RTX 2080Ti玩家力量至尊显卡,以保证数据的准确性。研究结果表明,显卡驱动的更新确实能够带来近乎50%的性能提升,对于提升游戏体验具有重要意义。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文讨论了读书的目的以及学习算法的重要性,并介绍了两个算法:除法速算和约瑟夫环的数学算法。同时,通过具体的例子和推理,解释了为什么x=x+k序列中的第一个人的位置为k,以及序列2和序列3的关系。通过学习算法,可以提高思维能力和解决问题的能力。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
author-avatar
零度水163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有