转载自:https://blog.csdn.net/qq_38505990/article/details/80603007
计网刚开始学的时候完全没听懂 查了好多博文 这篇写得最清楚 仅供学习参考

在计算机网络中,可靠的数据传输,是一个较为重要的问题,最近在看书(Computer Networking A Top-Down Approach),发现 rdt(Reliable Data Transfer) 大概经历了这样的变化。


上图是两个主机相应进程之间的通信过程,左边是发送端,右边是接收端


rdt 1.0

在 1.0 版本中,我们将数据的传输信道理想化,视为完全可靠,不丢包,不损失bit ,在这样的情况下,发送端发送数据,接收端直接接收,并不考虑丢包,超时这些问题,下图是对应FSM(状态图)

该协议中,都是直接发送,直接接收。


rdt2.0

果然,大家应该都意识到了,怎么可能这么理想化呢,要是传输通道完全可靠,我们讨论的意义何在呢?
在 rdt2.0 中,我们将传输通道视为有可能发生比特错误

有可能发生比特错误,这就是说,数据在传输中不会发生丢包的现象,但是会存在一部分比特错误的情况,于是我们引入:

差错检测:使用检验和,换句话讲,就是检验发过来的包有没有错误
接收方的反馈:接收方返回 NAK 或者 ACK ,分别对应数据错误和数据正确,这个也可以理解,总要告诉发送端,你发过来的是对还是错


上图中的corrupt ,在字典里面是 “腐烂,腐化” 的意思,在这里可以理解成包出错。

很容易理解,发送端发出数据,并等待接收端反馈,如果返回 NAK ,表示数据出错,重新发送数据,至于接收端怎么检验数据,不用说,当然是使用检验和啦。


rdt2.1

经过大家思考,终于发现了 rdt2.0 的致命缺陷,原来接收端返回的值也可能会出错啊,万一NAK出错变成ACK了呢

于是诞生了 rdt2.1 ,该协议在 2.0 基础上增加了一个序号值(在这里,该序号在当前协议中只使用 0 和1 ,交替排列),这样一来,发送端和接收端都有了两种序号状态, 0 和 1 。


我们来用自己的语言,组织一下上面的逻辑:
发送端在 0 序号时发送数据包,接收端此时期待 0 序号的数据包,如果数据发送时发生 bit 受损,此时接收端直接通过检验和发现错误,并返回 NAK ,发送端接到 NAK 的返回值,然后重新发送 0 序号数据包。(但是注意,这完全和 rdt2.0 没有任何分别,这是一种理想的状态!!!)

更错误的状况是,接收端成功接收,但是返回 ACK的时候发生了比特翻转,变成了 NCK ,这才是我们讨论的重点!!接下来,我需要画一张图,来理清楚当返回错误的时候,怎么通过序号来判断并重传数据。

这样就解决了 NAK , ACK 返回值有可能出错的问题。


rdt2.2

由于相关开发人员的吹毛求疵,他们觉得需要返回 NAK , ACK 两种状态可能太麻烦了,就将其全部改为ACK 只是返回的时候顺便返回序号。


可以看到,接收端收到包,不管正确与否,都返回 ACK ,同时附上序号,这个序号嘞,就是数据包发送过来时的序号。另外的参照上图,相信同学们都能有所收获。


rdt3.0

可以说,在处理数据出错方面,上面的协议都做得很好了,但是,我们忽略了一个很大的问题,万一数据不是出现错误,而是直接丢失了呢!!这就是我们俗称的丢包了,于是,我们的 rdt3.0 千呼万唤始出来了。

所以在这里,我们假设的是最贴近真实的情况,数据传输通道发送和返回的过程中不仅会出错,而且还会丢包!

因此,我们引入一个新的机制——超时重传。先不考虑数据出错与否,数据发送出去,会有两种丢包可能:1.发送出去的时候丢失,接收端并未收到 。2.接收端收到了,但是在反馈 ACK 的时候,数据包丢失。在这两种情况下,发送端都是什么反馈都没有收到!!,那问题就简单了,我们设置一个时间间隔,超过时间没有收到,重新发送数据即可。(事实上还有很多问题,比如时间间隔多少合适,这里暂且不管)

上图是 rdt3.0 发送方的 FSM 图,就拿右上角的状态举例,此时发送端等待接收方返回的带有“0”序号的 ACK ,它有三种行为:

  • 第一种,过程中未丢包,但是数据比特出错或者不符合序号,和我们讨论过的 rdt2.2 差不多,那么此时就没有任何动作,毫无作为就好了,等到时间间隔一到,当做超时处理,重发数据。
  • 第二种,是真正的丢包了,所以时间一到,重新发送。
  • 第三种最理想,啥事没有,一切正常,跳到下一个状态,等待发送下一个包。

上面我加粗了一个不符合序号,细心的读者可能发现了,的确,在这里又是大有文章。

这里的不符合序号,与期待的序号不符,有两种情况:

  1. 接收端反馈过程中,代表序号的那个 bit 错误,进行了翻转——这就和 rdt2.2 中一样
  2. 我们上面引入了超时机制,但是有一种情形,万一我发出去的数据包并没有丢失,只是它跑的太慢而已呢??那么时间一到,发送端误以为丢包,重新发了一遍咋办??这就造成,接收端才收到你晚来的数据 0 号,还给你个 0 ,这时候你重传的 0 号包接着又到了,接收端又给你一个0 ,作为发送端,我会先后收到两个 0 ,就注定后面一个 0 会被期待 1 号的状态捕捉,这时发送端启动第一种处理方式——不作为,啥都不做。


上面便是示意图。


到此为止, rdt 3.0 已经被认为是一个较为完美的可靠传输协议了,但是还有着种种的不足,比如:

  • 效率太慢,由于停等方式的存在,一个包没处理好,发送端会一直等着。
  • 超时机制的时间间隔怎么确定?长了不行,太慢,短了么,又会经常有重复发包的情况。
  • …….
  • …….

这些我将会在后续的博客上阐述,敬请期待吧~~

【学习】可靠数据传输协议 RDT相关推荐

  1. 可靠数据传输原理1(构造可靠数据传输协议)

    TCP向调用它的因特网应用所提供的服务模型(服务抽象) 数据可以通过一条可靠的信道进行传输.借助于可靠的信道,传输比特就不会受到损坏或丢失,而且所有数据都是按其发送顺序进行交付. 可靠传输协议 实现服 ...

  2. 构造可靠数据传输协议

    在本篇文章中我们将逐步了解开发发送方和接收方的可靠数据传输协议的过程,它们逐渐复杂,最后会得到一个无错.可靠的数据传输协议.在这个过程中仅考虑单向数据传输但控制信息双向流动. 我们用有限状态机(FSM ...

  3. 流水线可靠数据传输协议

    在构造可靠传输协议那一篇我们知道rdt3.0的利用率是非常低的,为了解决利用率问题我们用流水线技术解决. 流水线:发送方允许发送多个"在路上的",还没有确认的报文. 流水线技术对可 ...

  4. 基于C语言的可靠数据传输协议的设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/86799219 资源下载地址:https://download.csdn.net/downl ...

  5. UDT协议-基于UDP的可靠数据传输协议

    1.   介绍 随着网络带宽时延产品(BDP)的增加,通常的TCP协议开始变的低效.这是因为它的AIMD(additive increase multiplicative decrease)算法彻底减 ...

  6. Rdt协议(可靠运输协议)

    提示:文章写完后 文章目录 前言 一.可靠数据传输原理 二.Rdt协议 1.Rdt 1.0(可靠信道) 2.Rdt 2.0(ARQ重传) 3.Rdt 2.1(序列号) 4.Rdt 2.2(无NAK) ...

  7. 计算机网络(自顶向下方法)学习记录---3.4 可靠数据传输原理

    文章目录 前言 一.构造可靠传输协议 1.rdt1.0 2.rdt2.0 3.rdt2.1 4.rdt3.0 二.GBN 总结 前言 在学习3.5节TCP传输之前,我们需要先了解到可靠数据的传输原理, ...

  8. 我tcp可是铁齿金不换,诚实可靠小郎君——谈谈可靠数据传输服务

    附 rdt_send()函数:上层可以调用数据传输协议的发送方.其中 rdt 为 reliable data transmission. 它将要发送的数据交付给位于接收方的上层. rdt_rev() ...

  9. 计算机网络(九)——可靠传输协议

    文章目录 1. 可靠数据传输协议 1.1 经完全可靠信道的可靠数据传输:rdt1.0 1.2 经具有比特差错信道的可靠数据传输 1.3 经具有比特差错的丢包信道的可靠数据传输:rdt3.0 2. 流水 ...

  10. 可靠数据传输基本原理

    可靠数据传输是指:数据可以通过一条可靠信道来传输.传输的数据不会受到损失或者丢失,而且所有数据都是按照其发送顺序进行交付. 我们都知道IP层是不可靠传输的,而TCP是可靠传输的,但是TCP是传输层的协 ...

最新文章

  1. 为什么小批量会可以使模型获得更大的泛化
  2. 透视世界人工智能发展
  3. 免费Opengrok-代码阅读工具:Kernel,Optee,ATF,Uboot...
  4. Redis中的执行命令的过程
  5. RabbitMQ通配符模式以及与Routing模式的区别
  6. WatchOS系统开发大全(6)-WKInterfaceLabel
  7. 遗忘root用户的密码
  8. 交换机发生网络通信故障问题时该怎么办?
  9. Oracle-11g-R2 RAC 环境下 GPnP Profile 文件
  10. JME3中级手册一API特征映射1
  11. mfs1.6.x故障一例,血的经验教训 推荐
  12. 一个项目部署多个节点会导致锁失效么_一文看透 Redis 分布式锁进化史(解读 + 缺陷分析)...
  13. 【机器学习】逻辑回归原理及其实现
  14. 改变系统TCP默认 MSS
  15. 国产操作系统之优麒麟安装
  16. esp8266使用BME280实时上传温湿度气压
  17. reg、wire与logic的区别
  18. Vue中的$event详解
  19. Basic认证方式的配置
  20. 皮皮高清影视播放器2015官方版

热门文章

  1. 修改用友服务器ip地址,修改用友服务器ip地址
  2. 魔方cfop公式软件_魔方与群论(一)(不要被标题吓到,高中生就可以看)
  3. Chrome快捷键,电脑高手都这样用
  4. 贴片天线的特征模分析及其应用
  5. Java程序打包成jar文件
  6. MSP432 BSL流程(UART)
  7. 360 Replugin 插件化 支持 Androidx和Java8
  8. QtAndroid详解(6):集成信鸽推送
  9. 报错PyTorch is not compiled with NCCL support
  10. 你参加了无数 “打卡” 群,为什么收获甚微。。。