当前位置: 首页 > news >正文

DJ3-2 传输层(第二节课)

目录

一、如何实现可靠数据传输

1. 需要解决地问题

2. 使用的描述方法

二、rdt1.0:完全可靠信道上的可靠数据传输

1. 前提条件

2. 有限状态机 FSM

三、rdt2.0:仅具有 bit 错误的信道上的可靠数据传输

1. 前提条件

2. 有限状态机 FSM

3. 停等协议

4. rdt2.0 的致命缺陷

四、rdt2.1:发送方能够处理混淆的 ACK 和 NAK

1. 发送方的有限状态机 FSM

2. 接收方的有限状态机 FSM

五、rdt2.2:一个不需要 NAK 的协议

六、rdt3.0:具有出错和丢失的信道上的可靠数据传输

1. 前提条件

2. 发送方的有限状态机 FSM

3. 为什么要在超时后才进行重传?

4. rdt3.0 的性能

七、Go-Back-N


一、如何实现可靠数据传输

1. 需要解决地问题

分组交换限制了分组的大小

但是需要解决下述三大问题:

  • 发送顺序和接收顺序可能不同:编号
  • 数据可能出错:重传
  • 分组可能丢失:发送方定时 + 接收方确认

2. 使用的描述方法

二、rdt1.0:完全可靠信道上的可靠数据传输

1. 前提条件

在完美可靠的信道上

  • 没有 bit 错误
  • 没有分组丢失

发送方和接收方的 FSMs:

  • 发送方发送数据到下层信道
  • 接收方从下层信道接收数据

2. 有限状态机 FSM

发送方的动作:

  • 从应用层得到数据
  • 在传输层封装数据和发送分组

接收方的动作:

  • 从网络层接收分组
  • 在传输层解封分组和传递数据

三、rdt2.0:仅具有 bit 错误的信道上的可靠数据传输

1. 前提条件

1)如何检测到错误

下层信道可能使传输分组中的 bit 受损

  • 接收方将通过校验和检测到 bit 错误

2)如何从错误中恢复

接收方反馈:

  • 确认(ACKs):接收方明确告诉发送方 “分组接收正确”
  • 否认(NAKs):接收方明确告诉发送方 “分组接收出错”

发送方收到 NAK 后将会重传该分组。

3)rdt2.0 中的新机制(在 rdt1.0 中没有的)

  • 差错检测
  • 接收方反馈

接收方反馈给发送方控制信息(ACK,NAK)

2. 有限状态机 FSM

checksum           //校验和rdt_rcv(rcvpkt)    //对于sender是确认信息//对于receiver是分组isACK(rcvpkt)      //确认信息为ACK
isNAK(rcvpkt)      //确认信息为NAKcorrupt(rcvpkt)    //根据校验和发现有差错
notcorrupt(rcvpkt) //根据校验和发现没有差错

1)没有错误时的操作

  1. 上层调用 sender,sender 发送完分组,转为等待反馈状态
  2. receiver 接收到正确的分组,处理分组递交上层,并反馈确认信息
  3. sender 收到确认信息,转为等待调用状态

2)错误场景中的操作

  1. 上层调用 sender,sender 发送完分组,转为等待反馈状态
  2. receiver 接收到错误的分组,直接反馈否认信息
  3. sender 收到否认信息,立即重传分组,且仍为等待反馈状态
  4. receiver 接收到正确的分组,处理分组递交上层,并反馈确认信息
  5. sender 收到确认信息,转为等待调用状态

3. 停等协议

停等协议:发送方发送一个报文,然后等待接受方的响应。

rdt2.0 的优点:因为必须保证上一个分组接收成功后才能发送下一个,所以不存在分组失序问题。

4. rdt2.0 的致命缺陷

1)ACK 和 NAK 可能出现混淆

发送方并不知道接收方发生了什么!

  • 万能的做法是:重传但是重传可能导致分组重复
  • 并且接收方无法区分这是重传的分组还是下一个分组

2)如何解决分组重复

发送方给每个分组加一个序号

  • 在 ACK 和 NAK 混淆时,发送方重传当前分组
  • 接收方通过识别序号来丢弃重复的分组,并不向上传递

3)需要为停等协议设置多少个序号

答案:2 个,因此只需要一个 bit 。可以采用 0 号和 1 号来区分。

分析:由于采用停等协议,因此在 发送方发送当前分组 - 接收方接收分组并反馈 ACK - 发送方发送下一个分组 的过程中,只会涉及到两个相邻的分组:当前发送的分组和下一个发送的分组。如下图所示。

四、rdt2.1:发送方能够处理混淆的 ACK 和 NAK

1. 发送方的有限状态机 FSM

make_pkt(0, data, checksum) //封装有序号/数据/校验和corrupt(rcvpkt)    //对于sender是确认信息出错//对于receiver是报文出错

2. 接收方的有限状态机 FSM

has_seq0(rcvpkt)      //根据序号知道接收的是0号make_pkt(ACK, chksum) //封装校验和以便sender检测确认信息是否出错

分析右侧语句:

rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) && has_seq0(rcvpkt)
-------------
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)

此时 receiver 等待的是 1 号报文,但是 has_seq0(rcvpkt) 表示 sender 给 receiver 发的是 0 号报文,这种情况说明:receiver 的反馈信息 ack 1 出错导致 sender 不知道 receiver 是否正确接收了 1 号报文。因此,receiver 需要做的是:重传 ack 1 。

五、rdt2.2:一个不需要 NAK 的协议

同 rdt2.1一样的功能,但是只用 ACK 不用 NAK。如果当前分组接收正确,则接收方发送 ACK,并且 ACK 必须明确包含被确认的分组的序号。

如果发送方收到重复 ACK,则执行和 NAK一样的处理:重发当前分组。

六、rdt3.0:具有出错和丢失的信道上的可靠数据传输

1. 前提条件

1)存在的问题

下层信道除了 bit 出错还要丢失报文:包括数据和 ACK 。

校验和、序号、确认、重传将会有帮助,但是不够。

2)解决方法

方法:发送者等待 “合理的” 确认时间,如果在这个时间内没有收到确认就重传。

  • 要求倒计时定时器
  • 只有在定时器超时时才触发重传

如果报文只是延迟而没有丢失:

  • 重发将导致重复,但是使用序号已经解决了这个问题
  • 接受方必须指定被确认的报文序号

2. 发送方的有限状态机 FSM

分析右侧语句:

1)即使 sender 接收到的确认信息出错了或 receiver 说这个报文出错了,sender 也只在超时时重传当前报文。

rdt_rcv(rcvpkt) &&  
(corrupt(rcvpkt) || isACK(rcvpkt, 1))
-------------
//do no-optimeout
-------------
udt_send(sndpkt)
start_timer

2)sender 可能接收到上一个报文超时了很长时间的确认信息(甚至在重传报文的确认信息之后才到达),此时 sender 不做任何操作。

rdt_rcv(rcvpkt)
-------------
//do no-op

3. 为什么要在超时后才进行重传?

图一为 rdt3.0 中可能出现的问题,图二和图三为相应的解决方案。

图一中的问题:

  1. 第一个 pkt 0 的确认信息 ack 0 在确认时间内没有到达 sender
  2. 按照超时才重传原则,sender 在确认时间截止时重传第二个 pkt 0
  3. 第一个 pkt 0 的确认信息 ack 0 终于到达
  4. sender 认为 pkt 0 已接收完毕,开始传输 pkt 1
  5. 在 pkt 1 的确认信息 ack 1 到达之前,第二个 pkt 0 的确认信息 ack 0 到达了
  6. 由于重复的 ack 等价于 nak,因此 sender 需要重传 pkt 1

在这里有两种重传方案:

  • (a) 直接重传:此时此刻立即重传 pkt 1
  • (b) 超时才重传:当 pkt 1 的确认时间截止时才重传

方案 (a) 直接重传:

  1. sender 需要立即重传第二个 pkt 1
  2. 在第二个 pkt 1 的确认信息 ack 1 到达之前,第一个 pkt 1 的确认信息 ack 1 到达了
  3. sender 认为 pkt 1 已接收完毕,开始传输 pkt 0
  4. 在 pkt 0 的确认信息 ack 0 到达之前,第二个 pkt 1 的确认信息 ack 1 到达了
  5. 由于重复的 ack 等价于 nak,因此 sender 需要重传 pkt 0
  6. ...

可见,使用该方案会不断地出现需要重传的情况。我们需要做的是:让子弹多飞一会儿!

方案 (b) 超时才重传:

  1. sender 选择在第一个 pkt 1 的确认时间截止时才重传第二个 pkt 1
  2. 然而,在截止之前第一个 pkt 1 的确认信息 ack 1 到达了,sender 不需要重传了
  3. sender 认为 pkt 1 已接收完毕,开始传输 pkt 0
  4. ...

后续一切正常。

4. rdt3.0 的性能

网络利用率 = 发送时间/得到响应的时间。公式如下。

U_{sender}=\frac{L/R}{RTT+L/R}

七、Go-Back-N

发送方需要做的:

  • 在分组头中规定一个 k 位的序号
  • 设置窗口:允许连续发送 N 个未被确认的报文

窗口里的报文的状态:

  • 已发送但未确认
  • 未发送

1. 一次性发送窗口内的 N 个报文

发完这 N 个报文,就停止发送。

2. 报文得到确认时

receiver 确认收到 1 号报文,sender 得到确认,窗口右移一格,sender 发送此前未发送的 5 号报文。

3. 报文丢失时

假设 2 号报文在传输过程中丢失了,那么即使 3 号报文到达了 receiver,receiver 也会拒绝接收它,更不用说反馈确认信息了。对于 4 号报文和 5 号报文也不例外。

4. 确认信息超时时

由于 receiver 是一个很专一的人,它拒绝除 2 号报文以外的所有报文,然而 2 号报文又丢失了,因此 receiver 无法反馈确认信息,从而导致 sender 长时间无法收到确认信息。

幸好有一个定时器在记录 2 号报文的确认时间,该 计时器 用于记录最早的未被确认报文的发送时间。它告诉 sender 超时了,于是 sender 重发窗口里的所有报文。

5. 确认信息丢失时

假设 receiver 接收了 2 号报文和 3 号报文,但是相应的确认信息在传输过程中丢失了。而之后 receiver 又接收了 4 号报文,并且其确认信息顺利传输给了 sender 。

sender 认为像 receiver 这样专一又负责的人,一定是已经接收到了 4 号报文之前的所有报文才会反馈 4 号报文的确认信息。因此 sender 放心的右移三次窗口,并且发送在窗口里出现的新报文。

  • 暗示当前分组之前的所有分组都被正确接收了
  • 窗口可以一次性右移多个位置

相关文章:

DJ3-2 传输层(第二节课)

目录 一、如何实现可靠数据传输 1. 需要解决地问题 2. 使用的描述方法 二、rdt1.0:完全可靠信道上的可靠数据传输 1. 前提条件 2. 有限状态机 FSM 三、rdt2.0:仅具有 bit 错误的信道上的可靠数据传输 1. 前提条件 2. 有限状态机 FSM 3. 停等协…...

FrIf-FrIf功能模块概述和与底层驱动的交互

总目录链接==>> AutoSAR入门和实战系列总目录 总目录链接==>> AutoSAR BSW高阶配置系列总目录 文章目录 1 FlexRay 接口模块概述2 与FlexRay底层驱动的交互1 FlexRay 接口模块概述 FlexRay 接口模块通过 FlexRay 驱动程序模块间接与 FlexRay 控制器通信。 它…...

【LeetCode】前 K 个高频元素(堆)

目录 1.题目要求: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 2.解题思路: 代码展示: 1.题目要求: 给你一个整数数组 nums 和一个整数 k &#xff0…...

Java ---多态

(一)定义 官方:多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。 生活中的多态,如图所示: 多态性是对象多种表现形式的体现。 现实中,…...

13个程序员常用开发工具用途推荐整理

作为一名刚入门的程序员,选择合适的开发工具可以提高工作效率,加快学习进度。在本文中,我将向您推荐10个常用的开发工具,并通过简单的例子和代码来介绍它们的主要用途。 1. Visual Studio Code Visual Studio Code(V…...

TCP分包和粘包

文章目录TCP分包和粘包TCP分包TCP 粘包分包和粘包解决方案:TCP分包和粘包 TCP分包 场景:发送方发送字符串”helloworld”,接收方却分别接收到了两个数据包:字符串”hello”和”world”发送端发送了数量较多的数据,接…...

手撕深度学习中的优化器

深度学习中的优化算法采用的原理是梯度下降法,选取适当的初值params,不断迭代,进行目标函数的极小化,直到收敛。由于负梯度方向时使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新params的值&#…...

英文打字小游戏

目录 1 实验目的 2 实验报告内容 3 实验题目 4 实验环境 5 实验分析和设计思路 6 流程分析和类图结构 ​编辑 7. 实验结果与测试分析 8. 总结 这周没有更新任何的文章,感到十分的抱歉。因为我们老师让我们做一个英文打字的小游戏,并要求撰写实验…...

PCB生产工艺流程三:生产PCB的内层线路有哪7步

PCB生产工艺流程三:生产PCB的内层线路有哪7步 在我们的PCB生产工艺流程的第一步就是内层线路,那么它的流程又有哪些步骤呢?接下来我们就以内层线路的流程为主题,进行详细的分析。 由半固化片和铜箔压合而成,用于…...

算法竞赛进阶指南0x61 最短路

对于一张有向图,我们一般有邻接矩阵和邻接表两种存储方式。对于无向图,可以把无向边看作两条方向相反的有向边,从而采用与有向图一样的存储方式。 $$ 邻接矩阵的空间复杂度为 O(n^2),因此我们一般不采用这种方式 $$ 我们用数组模…...

[学习篇] Autoreleasepool

参考文章: https://www.jianshu.com/p/ec2c854b2efd https://suhou.github.io/2018/01/21/%E5%B8%A6%E7%9D%80%E9%97%AE%E9%A2%98%E7%9C%8B%E6%BA%90%E7%A0%81----%E5%AD%90%E7%BA%BF%E7%A8%8BAutoRelease%E5%AF%B9%E8%B1%A1%E4%BD%95%E6%97%B6%E9%87%8A%E6%94%BE/ …...

晶体基本知识

文章目录晶体基本知识基本概念晶胞<晶格<晶粒<晶体晶胞原子坐标(原子分数坐标)六方晶系与四轴定向七大晶系和十四种点阵结构学习资料吉林大学某实验室教程---知乎系列晶体与压敏器件晶体基本知识 基本概念 晶胞<晶格&#xff1c…...

免费CRM如何进行选择?

如今CRM领域成为炙手可热的赛道,很多CRM系统厂商甚至打出完全免费的口号,是否真的存在完全免费的crm系统?很多企业在免费使用过程中会出现被迫终止的问题,需要花费高价钱才能继续使用,那么,免费crm系统哪个…...

关于金融类iOS套壳上架,我帮你总结了这些经验

首先说明,本文中出现的案例的,没有特别的专门针对谁,只是用于分析,如有觉得不妥的,请及时联系我删除,鉴于本文发出之后,可能造成的一些影响,所以大家看看就好了,千万不要…...

4年功能测试月薪9.5K,3个月时间成功进阶自动化,跳槽涨薪6k后我的路还很长...

前言 其实最开始我并不是互联网从业者,是经历了一场六个月的培训才入的行,这个经历仿佛就是一个遮羞布,不能让任何人知道,就算有面试的时候被问到你是不是被培训的,我还是不能承认这段历史。我是为了生存,…...

python url解码详解

python url解码 url是数据的一个部分,一般会用来做什么呢?比如网站的 URL,比如搜索引擎中的 url,再比如网页中的图片等。 你也许不知道,在 Web页面中的图片、链接、超链接都是 URL,也就是 url。 而如果想要…...

leetcode102:二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入…...

深度学习openMMLab的介绍和使用

文章目录MMCV介绍MMCV的安装修改链接中的cu113修改链接中的torch1.10.0物体分类MMCLS源码下载配置参数解读配置文件的组成如何生成完整配置文件定义自己的数据集构建自己的数据集训练自己的任务物体检测MMDetection语义分割MMSegmentation姿态估计MMPose未完成,持续…...

【vue2】axios请求与axios拦截器的使用详解

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:当我们在路由跳转前与后我们可实现触发的操作 【前言】ajax是一种在javaScript代码中发请…...

文件上传都发生了啥

一直在用组件库做文件上传,那里面的原理到底是啥,自己写能不能写一个upload框出来呢? (一)基本原理 浏览器端提供了一个表单,在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端&#xff0…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...