计算机网络第3章-运输层(2)
可靠数据传输原理
可靠数据传输依靠数据在一条可靠信道上进行传输。
TCP也正是依靠可靠信道进行传数据,从而数据不会被丢失。
而实现这种可靠数据传输服务是可靠数据传输协议的责任
构造可靠数据传输协议
1.经完全可靠信道的可靠数据传输:rdt1.0
在协议rdt1.0下,底层信道是完全可靠的。
上图是rdt1.0发送方和接收方的有限状态机的定义。
经具有比特差错信道的可靠数据传输:rdt2.0
rdt2.0的底层信道是不可靠的,在该信道下分组中的比特可能会受损。
考虑一下你自己是怎样通过电话口述一条长报文的。在通常情况下,报文接收者在 听到、理解并
记下每句话后可能会说“0K” 。如果报文接收者听到一句含糊不清的话时, 他可能要求你重复那句容
易误解的话。这种口述报文协议使用了肯定确认("OK”)与否定确认("请重复一遍)。这些 控制报文使
得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需 要重复。在计算机
网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求 (Automatic Repeat
reQuest, ARQ)协议。
ARQ协议还需要另外三种协议功能来处理比特差错的情况。
1.差错检测。需要一种机制以使接收方检测到何时出现了比特差错。
2.接收方反馈。因为发送方和接收方通常在不同端系统上执行,可能相隔数千英里,发送方要了解接收方的情况(此时分组是否被正确接收)的唯一途径就是让接收方提供明确的反馈信息给发送方。
3.重传。接收方收到有差错的分组时,发送方将重传该分组文。
在rdt2.0下,发送方有两个状态。
最左边的状态发送端协议正等待来自上层传下来的数据。
最右边的状态发送端协议等待接收一个ACK/NAK分组。
如果接受到ACK代表,分组已经被正确接收,此时关闭该状态,重新变为最左边的状态,对于这种行为,我们也称之为“停等”。
而接收方仍然只有一种状态,并且只会回答ACK/NAK(正确/错误),这取决于分组是否受损。
尽管如此,rdt2.0仍然存在很大问题,因为ACK或者NAK在返回的时候,也有可能受损!!!
下面考虑处理ACK和NAK时受损的三种可能性:
1.接收方可能并不能理解会大方的ACK和NACK是什么意思,显然这不可能
2.增加足够多的检验和比特,使发送方不仅可以检测差错,还可恢复差错。
对于会产生差错但不丢失分组的信道,这就可以直接解决问题。
3.第三种方法是重发分组,然而这种方法会向信道中引入亢余分组。
对于这些可能性,其实有一个简单方法(几乎所有现有的数据传输协议中,包括TCP、都采用了这种方法)是在数据分组中添加一个新字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段。
于是,接收方只需要检查序号即可确定接收到的分组是否一次重传。
下面是rdt2.1的FSM描述,是rdt2.0的修订版,rdt2.1的发送方和接收方FSM的状态数都是以前的两倍。这是因为协议状态必须反映出目前(由发送方)正发送的分组或(在接收方)希望接受的分组序号是0还是1。
以上是rdt2.1发送方
以上是rdt2.1接收方。
经具有比特差错的丢包信道的可靠数据储传输rdt3.0
现在我们界定除了比特受损外,底层信道还会丢包。
一个处理这个问题的方法是:“重传”。
在发送方发送完一个分组后,如果长时间没有接收到ACK,则会自动重传。
问题关键在于,等待的时间该如何确定?
注意到,如果一个分组经历了特别大的时延,但是没有丢失,发送方仍然会重传一个分组,这就造成了亢余数据分组的问题,幸运的是,rdt2.2协议已经能处理亢余分组情况了。
因此为了实现时间的重传机制,需要一个倒计数定时器。
在一个给定的时间量过期后,可中断发送方。
因此,发送方需要做到:
1.每次发送一个分组时,便启动一个定时器。
2.响应定时器中断。
3.终止定时器。
下图给出了rdt3.0的发送方FSM。
下面是rdt3.0在运行过程中四种协议运作的情况:
(rdt3.0有时被称为比特交替协议)
上图中的括号代表计时器建立时间以及终止时间。
流水线可靠数据传输协议
rdt3.0是一个共功能正确的协议,但是rdt3.0作为一个停等协议,会严重造成性能浪费!
为此,一种不以停等方式工作的协议诞生了,被称为:“流水线”。
流水线协议不以停等方式运行,允许发送方发送多个分组而无需等待确认,如下图所示:
但流水线技术也带来了下面三个影响:
1.必须增加序号范围,因为每个输送中的分组必须有一个唯一的序号。
2.协议的发送方和接收方两端也许不得不缓存多个分组。发送方最低限度应当能缓冲那些已发送但没有被确认的分组。
3.所需序号范围和对缓冲的要求取决于数据传输协议如果处理丢失、损坏及延时过大的分组。
解决流水线的差错恢复有两种基本方法是:
回退N步(GBN)和选择重传(SR)。
回退N步
允许发送方发送多个分组而不需等待确认,但也受限于在流水线中未确认的分组数不能超过某个最大允许数N。
下图是一个发送方看到的GBN协议的序号范围:
其中我们将基序号(base)定义为最早未确认分组的序号,将下一个序号(nextseqnum)定义为
最小未使用的序号,即下一个待发分组的序号。
则可以将上面的序号范围分割成四段,在[0,base-1]段内的序号已经发送,在[base,
nextseqnum-1]为已发送但是未接收到响应的分组,在[nextseqnum,base+N-1]段内的序号是马上
要被立刻发送出的分组,大于base+N-1的序号是不能使用。
因此,这个序号范围可以被看作是一个长度为N的窗口。
通常随着协议的运行,该窗口会向前滑动,而N常被称为窗口长度。
GBN协议也被常常称为滑动窗口协议。
该窗口也可以想象为一个队列,不断地进出元素(未发送的分组序号/已发送且收到回应的分组序号)。
下图为GBN的扩展FSM图:
除此之外,GBN发送方必须响应三种类型的事件:
1.上层的调用。当上层调用时,发送方检查发送窗口是否已满,若未满则产生一个分组并将其发送,并更新变量(base、nextseqnum)。若窗口已满,发送方则隐式的告诉上层该窗口已满。
2.收到一个ACK。在GBN协议中,对序号为n的分组的确认采取累积确认的方式,表明接收方已正确接收到一个窗口容量的分组。
3.超时事件。若出现超时,发送方重传所有已发送但还未被确认过的分组。
而接收方的动作也很简单,如果一个序号为n的分组被正确的接收到,并且按序接收到(即上次交付的分组序号为n-1),则接收方为分组n发送一个ACK。
其它所有情况下,接收方会丢弃该分组。
选择重传
在上面所说的GBN协议潜在地允许发送方用多个分组"填充流水线",因此避免了停等协议中所提到
的信道利用率的问题。但是GBN本身也有一些情况存在着性能问题,尤其是当窗口长度和宽带时
延积都很大时,在流水线中会有很多分组处于重传状态。这会导致接收到的数据很断断续续的,严
重影响使用感。
而选择重传(SR)只会选择性的重传它觉得可能出错或出错的位置,具体的原理是,当发现出错
后,接收方会缓存出错序号的所有分组,直到该分组之前的正确分组被传送过来,这一批分组才会
按照次序被传送给上层。
当我们面对有限序号范围的现实时,发送方和接收方窗口间缺乏同步会产生严重的后果。
下面两个例子都代表了接收方无法区别新传来的分组是上一次传输的重传副本还是新一次传来分组的起始。
下面我们来看一个对于该节知识点的一个总回顾图片。
相关文章:

计算机网络第3章-运输层(2)
可靠数据传输原理 可靠数据传输依靠数据在一条可靠信道上进行传输。 TCP也正是依靠可靠信道进行传数据,从而数据不会被丢失。 而实现这种可靠数据传输服务是可靠数据传输协议的责任 构造可靠数据传输协议 1.经完全可靠信道的可靠数据传输:rdt1.0 在…...

【微信小程序】实现投票功能(附源码)
一、Vant Weapp介绍 Vant Weapp 是一个基于微信小程序的组件库,它提供了丰富的 UI 组件和交互功能,能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发…...

Pytorch入门实例的分解写法
数据集是受教育年限和收入,如下图 代码如下 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pddata pd.read_csv(./Income.csv)X torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) Y torch.from_numpy(data…...
Google单元测试sample分析(一)
本文开始从googletest提供的sample案例分析如何使用单元测试, 代码路径在googletest/googletest/samples/sample1.unittest.cc 本文件主要介绍EXPECT*相关宏使用 EXPECT_EQ 判断是否相等 EXPECT_TRUE 是否为True EXPECT_FALSE 是否为False TEST(FactorialTest, N…...
requests 实践
Requests 常用参数 method: 请求方式 get,或者 post,put,delete 等 url : 请求的 url 地址 接口文档标注的接口请求地址 params:请求数据中的链接,常见的一个 get 请求,请求参数都是在 url 地址…...

UI设计公司成长日记2:修身及持之以恒不断学习是要务
作者:蓝蓝设计 要做一个好的UI设计公司,不仅要在能力上设计能力一直(十几年几十年)保持优秀稳定的保持输出,以及心态的平和宽广。创始人对做公司要有信心,合伙人之间要同甘共苦,遵守规则,做好表…...

辅助驾驶功能开发-功能规范篇(23)-2-Mobileye NOP功能规范
5.2 状态机要求 5.2.1 NOP/HWP 状态机 NOP/HWP状态机如下所示: 下表总结了这些状态: 状态描述Passive不满足功能条件,功能无法控制车辆执行器。Standby满足功能条件。该功能不是由驾驶员激活的。功能不控制车辆执行器。Active - Main功能由驾驶员激活。功能是控制…...
React中如何提高组件的渲染效率
一、是什么 react 基于虚拟 DOM 和高效 Diff算法的完美配合,实现了对 DOM最小粒度的更新,大多数情况下,React对 DOM的渲染效率足以我们的业务日常 复杂业务场景下,性能问题依然会困扰我们。此时需要采取一些措施来提升运行性能&…...
springboot+mybatis3.5.2动态查询某一字段在某一段时间内的统计信息(折线图)
需求: 动态查询某一统计字段在一段时间内的统计折线图信息 controller层 ApiOperation(value "getStatisticDetail", notes "统计折线图")GetMapping("/detail")ResponseStatus(HttpStatus.OK)AccessLogAnnotation(ignoreRequestA…...

关于本地项目上传到gitee的详细流程
如何上传本地项目到Gitee的流程: 1.Gitee创建项目 2. 进入所在文件夹,右键点击Git Bash Here 3.配置用户名和邮箱 在gitee的官网找到命令,注意这里的用户名和邮箱一定要和你本地的Git相匹配,否则会出现问题。 解决方法如下&…...

MarkDown详细入门笔记
本帖整理了MarkDown的入门学习笔记~ 一.介绍 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。 诸如微信公众平台、CSDN博客、还有Typora中写文档的部分,均涉及到MD的功能~ 它…...
算法——贪心算法
贪心算法(Greedy Algorithm)是一种算法设计策略,通常用于解决组合优化问题,其核心思想是在每一步都选择当前状态下最优的解,而不考虑之后的步骤。贪心算法在每一步都做出局部最优选择,期望通过一系列局部最…...

102.linux5.15.198 编译 firefly-rk3399(1)
1. 平台: rk3399 firefly 2g16g 2. 内核:linux5.15.136 (从内核镜像网站下载) 3. 交叉编译工具 gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 4. 宿主机:ubuntu18.04 5. 需要的素材和资料ÿ…...

易点易动固定资产管理系统:多种盘点方式助力年终固定资产盘点
年末固定资产盘点是企业管理中一项重要而繁琐的任务。为了帮助企业高效完成年终固定资产盘点工作,易点易动固定资产管理系统提供了多种盘点方式。本文将详细介绍易点易动固定资产管理系统的多种盘点方式,展示如何借助该系统轻松完成年终固定资产盘点&…...

C# Winform编程(10)Chart图表控件
Chart控件 Chart控件Chart属性详述Chart属性设置图表样式属性数据样式属性图例样式图标区样式SeriesChartType类型 Chart控件鼠标滚轮事件特殊处理Series绑定数据演示代码鼠标滚轮缩放图表示例参考引用 Chart控件 Chart控件是微软自带的一种图形可视化组件,使用简单…...
群狼调研(长沙产品概念测试)|如何做新品上市满意度调研
新品上市满意度调研是一种重要的市场研究方法,它通过收集和分析消费者对新产品的态度、购买意愿和满意度等方面的数据,帮助企业了解消费者的需求和期望,发现新产品的问题和不足,从而为产品改进提供有力的数据支持。群狼调研&#…...

Lua与C++交互
文章目录 1、Lua和C交互2、基础练习2.1、加载Lua脚本并传递参数2.2、加载脚本到stable(包)2.3、Lua调用c语言接口2.4、Lua实现面向对象2.5、向脚本中注册c的类 1、Lua和C交互 1、lua和c交互机制是基于一个虚拟栈,C和lua之间的所有数据交互都通…...
Ubuntu安装pyenv,配置虚拟环境
文章目录 安装pyenvpyenv创建虚拟环境一般情况下创建虚拟环境的方法 安装pyenv 摘自:文章 pyenv可以管理不同的python版本 1、安装pyenv的依赖库 # 执行以下命令安装依赖库 # 更新源 sudo apt-get update # 更新软件 sudo apt-get upgradesudo apt-get install ma…...

【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步 前提介绍MySQL和ElasticSearch的同步双写优点缺点针对于缺点补充优化方案 MySQL和ElasticSearch的异步双写优点缺点 定时延时写入ElasticSearch数据库机制优点缺点 开源和成熟的数据迁移工具选型Logsta…...

什么是React中的高阶组件(Higher Order Component,HOC)?它的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

【Linux】使用1Panel 面板让服务器定时自动执行任务
服务器就是一台24小时开机的主机,相比自己家中不定时开关机的主机更适合完成定时任务,例如下载资源、备份上传,或者登录某个网站执行一些操作,只需要编写 脚本,然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...