IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 16、可靠数据传输(rdt)的原理 -> 正文阅读

[网络协议]16、可靠数据传输(rdt)的原理

一、可靠的数据传输(rdt)
1、什么是可靠数据传输:不出错、不冲突、不失序、不丢失
2、如何实现可靠数据传输?
需要借助于下层提供的协议,但是如果下层提供服务不可靠呢?本层的协议机制,协议实体要靠什么机制的安排实现可靠的服务?
采用渐增式的开发可靠数据传输协议(rdt)的发送方和接收方
3、rdt
1、只考虑单向数据传输
2、双向的数据传输问题实际是两个单向数据传输问题的综合
3、使用有限状态机(FSM)来描述发送方和接收方
4、rdt在应用层、传输层和数据链路层都很重要,是网络TOP10问题之一
5、信道的不可靠性特点决定了可靠数据传输(rdt)的复杂性

二、Rdt1.0
1、使用场景:下层的信道是完全可靠的:没有比特差错,没有分组丢失
2、发送方和接收方的FSM:发送方将数据发送到下层信道,接收方从下层信道接收数据
所以rdt1.0做的工作就是封装和解封装

三、Rdt2.0:具有比特差错的信道
1、使用场景:下层信道可能出现差错:将分组中的比特翻转,0变为1,1变为0(用校验和来检测差错)
2、确认ACK:接收方显式的告诉发送方分组已经被接收
否定确认NAK:接收方显式地告诉发送方分组出现了差错(发送方接收到NAK后,会重传分组)
3、过程:发送方发送packet到下层信道,接收方接收,通过校验和发现数据有差错,返回NAK,发送方再次发送原packet;无差错返回ACK,发送方发送新的pactet
4、所以Rdt2.0新机制就是采用了差错控制编码进行差错检测
5、发送方和接受方的FSM:
(1)发送方状态:等待来自上层的调用、等待ACK / NAK
(2)接收方:等待来自下层的调用

最后细想一个问题,发送的packet可能会出现错误,但是返回的ACK / NAK是不是就一定是正确的呢?答案肯定是否定的,但是发送方应该怎么做呢?重传?可能会重复,不重传?可能会造成死锁或出错
所以引出了 Rdt2.1

四、Rdt2.1
1、为了处理上面所描述的问题,也就是在不知道发送的 ACK / NAK是否出现差错的情况下,Rdt2.1采用再次传输的方法,并且在传输的每个packet中都会加上序号,若没有错误,则根据序号将这个packet跑调,这样子就解决可能存在ACK / NAK出现错误,又能避免没有错误时的重复
2、因为每次只会发送一个分组然后等待确认,所以只需要两个序列号就够了(0和1),检测ACK / NAK是否出错同样使用EDC;原本只需要等待数据的发送,现在有了序号,状态也就变成了两倍,成了等待0与等待1
2、这种发送方只发送一个分组,然后等待接收方的应答的方式称为停止等待协议

五、Rdt2.2(无NAK协议)
1、功能与Rdt2.1相同,但是只用ACK(ACK需要编号)
2、接收方对最后正确接收的分组ACK,以代替NAK(接收方必须显式地包含被正确接收的分组的序号)
3、当收到重复的ACK时,发送方则重传当前分组

总结:其实就是在发送方发送一个packet,接收方若没有错,则返回ACK+序号,再次发送若出错了,则再次发送上次这个ACK+序号,没出错序号便是新的序号了。
问题:当第一个传输的分组就出错了,应该如何返回?
答案:事实上如果第一个就出现错误,前面没有ACK可返回,那发送方在一定时间内没有收到返回信息,便会重传(超时重传),这个就是Rdt3.0

六、Rdt3.0
1、当下层信道可能会丢失分组(数据或ACK):会死锁,也就是上面提到的发送方一直没有收到接收方的返回信息,这时候就引入超时重传(需要一个倒计时定时器)

问题:每次都是只能发送一个,当信道非常大的时候,传输的packet在信道中损耗的时间是非常多的,如何解决?
答案:采用流水线方式,提高链路的利用率

七、流水线协议
1、流水线:允许发送方在未得到对方确认的情况下一次发送多个分组
2、必须增加序号的范围:用多个bit表示分组的序号
3、在发送方/接收方要有缓冲区
(1)发送方缓冲:未得到确认,可能需要重传,需要将发送的分组放在缓冲区
(2)接收方缓存:上层用户取用数据的速率 != 接收到的数据从速率,接收到的速率可能会乱序,需要排序交付
4、流水线协议:回退N步(GBN)和选择重传(SR)

八、通用窗口协议(缓冲区协议):
1、发送缓冲区
(1)发送缓冲区
a.形式:内存中的一个区域,落入缓冲区的分组可以发送
b.功能:用于存放已发送,但是没有得到确认的分组
c.必要性:需要重发的时候可以用
(2)缓冲区大小:一次最多可以发送多少个未经确认的分组
a.停止等待协议=1
b.流水线协议>1,合理的值,不能很大,链路利用率不能超过100%
(3)发送缓冲区中的分组
a.未发送的:落入发送缓冲区的分组,可以连续发送出去
b.已经发送出去的,等待对方确认的分组;缓冲区中只有得到确认的分组才能删除
2、接收缓冲区
(1)接收窗口=接收缓冲区;传输的分组序号只有落在窗口范围内才允许内接收;若落在接收窗口范围外,则被丢弃
(2)接收窗口尺寸Wr=1,则只能顺序接收,成称为累计确认(GBK协议);Wr>1,则可以乱序接收,三号窗口确认了,但是前面2号窗口不一定就确认了,称为非累计确认(SR协议)。
3、窗口的滑动
(1)正常情况下窗口的滑动
a.发送窗口:有新的分组落入发送缓冲区范围,发送->前沿滑动;来了老的底序号分组的确认->后沿向前滑动->新的分组可以落入缓冲区的范围
b.接收窗口:收到分组,落入到接收窗口的范围内,接收;是底序号,发送确认给对方
(2)异常情况下GBK窗口的滑动
a.原因:传输过程中的分组可能丢失、出错;接收方给的确认没有达到发送方。
b.过程:接收方缓冲区大小为3情况下,在发送方发送分组的过程,2号分组丢失,1号分组确认收到后,接收方窗口不会向前滑动,因为2号分组的窗口是空的,而再接下来发送方在等待2号分组的确认信息是等不到的,所以最后触发超时重传
c.后果:超时重传时发送方会将已发送但是未确认的全部重传一遍。
(3)异常情况下SR窗口的滑动
a.因为SR协议下的接收方是可以乱序接收的,也就是发送方可以发送多个,接收方可以乱序接收,也就意味着在缓冲区的范围内,若某个分组丢失,缓冲区的其他分组是可以照常确认的,只不过缓冲区窗口前沿不会向前移动,在等待丢失的分组超时触发器触发时,会将分组重传。SR协议下发送方每发一个协议,就会设定一个超时触发器。
4、GBK协议和SR协议的异同
(1)相同之处:发送窗口>1,一次可以发送多个未经确认的分组
(2)不同之处:GBK接收窗口=1,所以只能顺序接收;SR接收窗口>1,可以乱序接收
5、总结
在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 11:59:22  更:2022-05-13 11:59:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:56:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码