计算机网络:可靠数据传输(rdt)、流水协议、窗口滑动协议

文章目录

  • 前言
  • 一、Rdt
    • 1.Rdt1.0
    • 2.Rdt2.0
    • 3.Rdt2.1
    • 4.Rdt2.2
    • 5.Rdt3.0
  • 二、流水线协议
    • 1.滑动窗口(slide window)协议
      • 发送窗口
      • 接收窗口
        • 正常情况下的2个窗口互动
        • 异常情况下GBN的2个窗口互动
        • 异常情况下SR的2窗口互动
        • GBN协议和SR协议的异同
    • 2.小结
  • 总结


前言

Rdt1.0、Rdt2.0、Rdt2.1、Rdt2.2、Rdt3.0、流水线协议、滑动窗口协议。


一、Rdt

  • rdt在应用层、传输层和数据链路层都很重要,是网络Top10问题之一。
  • 信道的不可靠特点决定了可靠数据传输协议(rdt)的复杂性

在这里插入图片描述

下面我们只考虑单向数据传输(但是控制信息是双向流动的),双向数据传输实际上就是两个单向数据传输问题的综合,所以我们只考虑单向。下面将会用有限状态机(FSM)来描述发送方和接收方。

1.Rdt1.0

在可靠信道上的可靠数据传输

  • 下层的信道是完全可靠的
    • 没有比特出错
    • 没有分组丢失
  • 发送方和接收方的FSM
    • 发送方将数据发送到下层信道
    • 接收方从下层信道接收数据

在这里插入图片描述

2.Rdt2.0

具有比特差错的信道

  • 下层信道可能会出错:将分组中的比特翻转
    • 用校验和来检测比特差错
  • 问题:怎样从差错中恢复
    • 确认(ACK):接收方显式地告诉发送方分组已被正确接收
    • 否定确认(NAK):接收方显式地告诉发送方分组发生了差错
      • 发送方收到NAK后,发送方重传分组
  • rdt2.0中的新机制:采用差错控制编码进行差错检测
    • 发送方差错控制编码、缓存
    • 接收方使用编码检错
    • 接收方的反馈:控制报文(ACK,NAK):接收方→发送方
    • 发送方收到反馈相应的动作

FSM描述

在这里插入图片描述

  • 根据上图,可以看到:发送方一直等待上层调用,接收方一直在等待下层调用;当上层调用发送方时,发送方将packet(将发送数据封装,带有差错检测信息的数据包(data,checksum))调用函数发送(udt_send),发送后进入等待ACK或NAK确认的状态,并且此状态一直在检测信息NACK还是ACK,如果是NACK就重新调用函数发送packet,如果是ACK就转为等待上层调用的状态。而接收方,如果有差错时(corrupt),调用函数(udt_send)发送NAK信息,没有差错就调用函数发送ACK信息。
  • 接收方差错检测是通过比较发送方带来的checksum(校验和)和自己的校验和结果,一样说明未出错,不一样则为出错。
checksum           //校验和rdt_rcv(rcvpkt)    //对于sender是确认信息//对于receiver是分组isACK(rcvpkt)      //确认信息为ACK
isNAK(rcvpkt)      //确认信息为NAKcorrupt(rcvpkt)    //根据校验和发现有差错
notcorrupt(rcvpkt) //根据校验和发现没有差错

思考:

  • 如果ACK/NAK出错?(发送方接收的不是ACK也不是NAK)
    • 发送方不知道接收方发生了什么事情!
    • 发送方如何做?
    • 重传?可能重复
    • 不重传?可能死锁(或出错)
    • 需要引入新的机制
      • 序号
  • 处理重复:
    • 发送方在每个分组中加入序号
    • 如果ACK/NAK出错,发送方重传当前分组
    • 接收方丢弃(不发给上层)重复分组

等停协议发送方发送一个分组,然后等待接收方的应答

3.Rdt2.1

发送方处理出错的ACK/NAK

发送方:
在这里插入图片描述

接收方:
在这里插入图片描述

  • 发送方:
    • 在分组中加入序列号
    • 两个序列号(0,1)就足够了
      • 一次只发送一个未经确认的分组
    • 必须检测ACK/NAK是否出错(需要EDC)
    • 状态数变成了两倍
      • 必须记住当前分组的序列号为0还是1
  • 接收方:
    • 必须检测接收到的分组是否是重复的
      • 状态会指示希望接收到的分组的序号为0还是1
    • 注意:接收方并不知道发送方是否正确收到了其ACK/NAK
      • 没有安排确认的确认
      • 具体解释见下面

在这里插入图片描述

4.Rdt2.2

无NAK的协议

  • 功能同rdt2.l,但只使用ACK(ack要编号)
  • 接收方对最后正确接收的分组发ACK,以替代NAK
    • 接收方必须显式地包含被正确接收分组的序号
  • 当收到重复的ACK(如:再次收到ack0)时,发送方与收到NAK采取相同的动作:重传当前分组
  • 为后面的一次发送多个数据单位做一个准备
    • 一次能够发送多个
    • 每一个的应答都有:ACK,NACK;麻烦
    • 使用对前一个数据单位的ACK,代替本数据单位的nako确认信息减少一半,协议处理简单

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.Rdt3.0

具有比特差错和分组丢失的信道

  • 新的假设:下层信道可能会丢失分组(数据或ACK)
    • 会死锁
  • 机制还不够处理这种状况:
    • 检验和
    • 序列号
    • ACK
    • 重传
  • 方法:发送方等待ACK一段合理的时间
    • 发送端超时重传:如果到时没有收到ACK-→重传
    • 问题:如果分组(或ACK)只是被延迟了:
      • 重传将会导致数据重复,但利用序列号已经可以处理这个问题
      • 接收方必须指明被正确接收的序列号
    • 需要一个倒计数定时器

链路层的timeout时间确定的传输层timeout时间是适应式的;
链路层的超时时间确定的传输层超时时间是适应式的。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Rdt3.0性能
在这里插入图片描述

Rdt3.0停等操作:
在这里插入图片描述

二、流水线协议

提高链路利用率,提高Rdt3.0性能瓶颈

在这里插入图片描述

  • 流水线:允许发送方在未得到对方确认的情况下一次发送多个分组
    • 必须增加序号的范围:用多个bit表示分组的序号
    • 在发送方/接收方要有缓冲区
      • 发送方缓冲:未得到确认,可能需要重传;
      • 接收方缓存:上层用户取用数据的速率 ≠ 接收到的数据速率;接收到的数据可能乱序,排序交付(可靠)
  • 两种通用的流水线协议:回退N步(GBN)和选择重传(SR)
sending window = 1,receving window = 1   -->  S-W 停等协议流水线协议:
sending window > 1,receving window = 1   -->  GBN
sending window > 1,receving window > 1   -->  SR

1.滑动窗口(slide window)协议

发送窗口

  • 发送缓冲区
    • 形式:内存中的一个区域,落入缓冲区的分组可以发送
    • 功能:用于存放已发送,但是没有得到确认的分组
    • 必要性:需要重发时可用
  • 发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
    • 停止等待协议 = 1
    • 流水线协议 > 1,合理的值,不能很大,链路利用率不能够超100%
  • 发送缓冲区中的分组
    • 未发送的:落入发送缓冲区的分组,可以连续发送出去;
    • 已经发送出去的、等待对方确认的分组:发送缓冲区的分组只有得到确认才能删除
  • 发送窗口:发送缓冲区内容的一个范围
    • 那些已发送但是未经确认分组的序号构成的空间
  • 发送窗口的最大值<=发送缓冲区的值
  • 一开始:没有发送任何一个分组
    • 后沿=前沿
    • 之间为发送窗口的尺寸 = 0
  • 每发送一个分组,前沿前移一个单位

在这里插入图片描述

  • 发送窗口前沿移动的极限:不能够超过发送缓冲区

在这里插入图片描述

在这里插入图片描述

  • 发送窗口后沿移动
    • 条件:收到老分组的确认
    • 结果:发送缓冲区罩住新的分组,来了分组可以发送
    • 移动的极限:不能够超过前沿

在这里插入图片描述
在这里插入图片描述

发送窗口滑动过程——相对表示法

  • 采用相对移动方式表示,分组不动
  • 可缓冲范围移动,代表一段可以发送的权力

绿色是滑动窗口,粉红色表示已发送未得到确认,浅蓝色表示得到确认

在这里插入图片描述

接收窗口

  • 接收窗口(receiving window)=接收缓冲区
    • 接收窗口用于控制哪些分组可以接收;
      • 只有收到的分组序号落入接收窗口内才允许接收
      • 若序号在接收窗口之外,则丢弃;
    • 接收窗口尺寸Wr = l,则只能顺序接收;
    • 接收窗口尺寸Wr > l,则可以乱序接收
      • 但提交给上层的分组,要按序
    • 例子: Wr=l,在0的位置;只有0号分组可以接收;向前滑动一个,罩在1的位置,如果来了第2号分组,则丢弃;
  • 接收窗口的滑动和发送确认
    • 滑动:
      • 低序号的分组到来,接收窗口移动;
      • 高序号分组乱序到,缓存但不交付(因为要实现rdt,不允许失序)),不滑动
    • 发送确认:
      • 接收窗口尺寸=1 ;发送连续收到的最大的分组确认(累计确认,GBN)
      • 接收窗口尺寸>1;收到分组,发送那个分组的确认(非累计确认,SR)

在这里插入图片描述

正常情况下的2个窗口互动
  • 发送窗口
    • 1.有新的分组落入发送缓冲区范围,发送->前沿滑动
    • 4.来了老的低序号分组的确认->后沿向前滑劫->新的分组可以落入发送缓冲区的范围
  • 接收窗口
    • 2.收到分组,落入到接收窗口范围内,接收
    • 3.是低序号,发送确认给对方
  • 发送端上面来了分组->发送窗口滑动->接收窗口滑动->发确认
异常情况下GBN的2个窗口互动
  • 发送窗口
    • 1.新分组落入发送缓冲区范围,发送->前沿滑动
    • 5.超时重发机制让发送端将发送窗口中的所有分组发送出去
    • 4.来了老分组的重复确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
  • 接收窗口
    • 2.收到乱序分组,没有落入到接收窗口范界内,抛弃
    • 3.(重复)发送老分组的确认,累计确认;
异常情况下SR的2窗口互动
  • 发送窗口
    • 1.新分组落入发送缓冲区范围,发送->前沿滑动
    • 5.超时重发机制让发送端将超时的分组重新发送出去
    • 4.来了乱序分组的确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
  • 接收窗口
    • 2.收到乱序分组,落入到接收窗口范围内,接收
    • 3.发送该分组的确认,单独确认;

每发送一个分组,发送方就会启动一个超时计时器

GBN协议和SR协议的异同
  • 相同之处
    • 发送窗口>1
    • 一次能够可发送多个未经确认的分组
  • 不同之处
    • GBN:接收窗口尺寸 = 1
      • 接收端:只能顺序接收
      • 发送端:从表现来看,一旦一个分组没有发成功,如:0,1,2,3,4;假如1未成功,234都发送出去了,要返回1再重新发送(234也重发)
    • SR:接收窗口尺寸 > 1
      • 接收端:可以乱序接收
      • 发送端:发送0,1,2,3,4,一旦1未成功,2,3,4,已发送,无需重发,选择性发送1

2.小结

Go-back-N:

  • 客户端最多再流水线中有N个未确认的分组
  • 接收端只是发送累计已确认cumulative ack
    • 接收端如果发现gap,不确认新到来的分组
  • 发送端拥有对最老的未确认的定时器
    • 只需设置一个定时器
    • 当定时器到时时,重传所有未确认分组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Selective repea:

  • 发送端最多在流水线中有N个未确认的分组
  • 接收方对每个到来的分组确认individual ack(非累计确认)
  • 发送方为每个未确认的分组保持一个定时器
    • 当超时定时器到时,只是重发到时的未确认分组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对比GBN和SR
在这里插入图片描述

适用范围:

  • 出错率低:比较适合GBN,出错非常罕见,没有必要用复杂的SR,为罕见的事件做日常的准备和复杂处理
  • 链路容量大(延迟大、带宽大):比较适合SR而不是GBN,一点出错代价太大

窗口最大尺寸
在这里插入图片描述

总结

以上就是Rdt和流水协议(窗口滑动)的详细讲解

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

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

相关文章

宝塔上安装mysql遇到的问题

宝塔上安装mysql遇到的问题 文章目录 宝塔上安装mysql遇到的问题一、下载mysql二、启动报错三、设置密码四、解决报错bash未找到命令mysql五、继续修改root密码五、宝塔中设置端口六、使用连接工具连接数据库 一、下载mysql 宝塔软件商店里下载mysql&#xff0c;然后点击启动。…

ELasticsearch:什么是语义搜索?

语义搜索定义 语义搜索是一种解释单词和短语含义的搜索引擎技术。 语义搜索的结果将返回与查询含义匹配的内容&#xff0c;而不是与查询中的单词字面匹配的内容。 语义搜索是一组搜索引擎功能&#xff0c;其中包括根据搜索者的意图及其搜索上下文理解单词。 此类搜索旨在通过…

python自动化操作:批量处理照片尺寸并输出到word文档中【第14篇—python-照片尺寸批量处理输出】

文章目录 一.背景二.需求三.实现源码3.1 项目结构3.2 源码3.3 核心调节照片大小 四.代码解释五.实现效果六.心得总结 一.背景 在当今数字化时代&#xff0c;照片处理和文档编辑是许多领域中不可或缺的任务。从个人创作到企业文档&#xff0c;人们经常需要快速而有效地处理大量…

Linux IO多路转接之epoll

文章目录 一、epoll初识 二、epoll的相关系统调用 1.epoll_create 2.epoll_ctl 3.epoll_wait 三、epoll工作原理 四、epoll的工作方式 本文主要介绍了epoll内部工作机制&#xff0c;如何达到高性能的多路转接。技术有限&#xff0c;如有错误请指正。参考文献&#xff1a;…

【Redis】Redis 的学习教程(十三)Redis 各场景

由于Redis 支持比较丰富的数据结构&#xff0c;因此他能实现的功能并不仅限于缓存&#xff0c;而是可以运用到各种业务场景中&#xff0c;开发出既简洁、又高效的系统 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

第三节:提供者、消费者、Eureka

一、 提供者 消费者&#xff08;就是个说法、定义&#xff0c;以防别人叭叭时听不懂&#xff09; 服务提供者&#xff1a;业务中被其他微服务调用的服务。&#xff08;提供接口给其他服务调用&#xff09;服务消费者&#xff1a;业务中调用其他微服务的服务。&#xff08;调用…

QThread之moveToThread用法

简介 使用moveToThread函数的流程如下&#xff1a; 1、创建一个类继承自QObject类或其子类&#xff0c;并在其中定义所要执行的多个任务&#xff0c;执行多个任务就要定义相应的信号。 2、任务通过moveToThread指定所要执行的线程。 3、线程通过start启动 4、通过信号与槽机制…

【AI绘画】万字长文——(超详细)ControlNet的详细介绍使用Stable Diffusion的艺术二维码完全生成攻略

目录 前言一、名词解释1-1、Stable Diffusion介绍1-2、ControlNet介绍1-2-1、ControlNet介绍&工作原理1-2-2、ControlNet控制方法介绍 1-3、案例分析1-3-1、室内装修设计1-3-2、品牌创意海报 1-4、stable-diffusion-webui 的参数解释 二、生成方法2-1、图像到图像2-1-1、二…

Python使用netmiko配置华为交换机

一、netmiko介绍 1.更适合网络设备的自动化运维模块。 二、场景 1、批量查询 2、批量配置变更、备份 三、项目地址 GitHub - ktbyers/netmiko: Multi-vendor library to simplify Paramiko SSH connections to network devices 三、使用步骤 1.安装netmiko pip install ne…

D6208单片双向马达驱动电路国产芯片,工作电源电压范围宽(4.5V~15.0V),内设保护二极管采用SOP8封装

D6208 是一块单片双向马达驱动电路&#xff0c;它使用TTL电平的逻辑信号就能控制卡式录音机和其它电子设备中的双向马达。该电路由一个逻辑部分和一个功率输出部分组成。逻辑部分控制马达正、反转向及制动&#xff0c;功率输出部分根据逻辑控制能提供100mA&#xff08;典型值&a…

腾讯地图系列(二):微信小程序添加插件(三种方法)以及插件AppId获取

目录 第一章 前言 第二章 添加插件 2.1 微信小程序添加插件方法一&#xff08;微信公众平台添加插件&#xff09; 2.2 微信小程序添加插件方法二&#xff08;通过项目配置添加插件&#xff09; 2.3 微信小程序添加插件方法三&#xff08;微信公众平台服务市场添加插件&…

spring mvc理解

spring mvc M&#xff1a;model 模型 V&#xff1a;view 视图 C&#xff1a;controller 控制器 S: service 服务处理 D: Dao 数据持久化 视图 我理解就是web页面&#xff0c;帮助用户调用后端接口。 前后端分离之后&#xff0c;view似乎就和后端没什么关系了。 模型 格式…

zabbix6.4监控交换机发现ICMP报错Ping item must have target or host interface specified

报错信息&#xff1a; 查看监控项&#xff1a; 修改键值&#xff1a; 保存再次检查&#xff0c;发现又报错/usr/sbin/fping: [2] No such file or directory 原因是&#xff0c;zabbix-server上没有安装fping工具 解决方法&#xff1a;yum install fping -y 之后数据采集正常…

【unity3D】Transform组件(如何访问和获取Transform组件)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Transform组件 Transform组件 基础知识介绍三个成员变量常用属性扩展 Transform的相关查找方法静态方法 基础知识 介绍 在Unit…

mapbox实现框选要素

成果图 参考博客 https://blog.csdn.net/ScapeD/article/details/89158755 原理与源码 利用mapbox的queryRenderedFeatures方法可以获取范围内的要素&#xff0c;但是这个只能是点和矩形和范围内的全屏要素&#xff0c;并不支持多边形&#xff0c;所以实现这个的思路就是画完框…

【JavaEE进阶】 Spring核⼼与设计思想

文章目录 &#x1f332;Spring 是什么&#xff1f;&#x1f384;什么是IoC呢&#xff1f;&#x1f388;传统程序开发&#x1f388;传统程序开发的缺陷&#x1f388;如何解决传统程序的缺陷&#xff1f;&#x1f388;控制反转式程序开发&#x1f388;对⽐总结规律 &#x1f340;…

适用于 Windows 的最佳(免费/付费)数据恢复软件

借助最佳数据恢复工具从 Windows PC 恢复丢失和删除的数据 您是否正在寻找一种巧妙的方法来从计算机中取消删除或恢复已删除的文件&#xff1f;如果是&#xff0c;那么这篇文章就是为您准备的&#xff01;在本教程中&#xff0c;我们整理了一份全面的数据恢复软件列表&#xf…

机器人学习目标

学习目标&#xff1a; 若干年后&#xff0c;我们都将化为尘土&#xff0c;无人铭记我们的存在。那么&#xff0c;何不趁现在&#xff0c;尽己所能&#xff0c;在这个世界上留下一些痕迹&#xff0c;让未来的时光里&#xff0c;仍有人能感知到我们的存在。 机器人协会每届每个阶…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

postgres pg_dump: fe_sendauth: no password supplied问题处理

postgres pg_dump: fe_sendauth: no password supplied问题处理 1、pg_dump: fe_sendauth: no password supplied问题处理&#xff08;root 用户&#xff09;2、解决方法2.1、创建 .pgpass文件2.2、chmod 600 ~/.pgpass 3、额外情况 1、pg_dump: fe_sendauth: no password supp…