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)没有错误时的操作
- 上层调用 sender,sender 发送完分组,转为等待反馈状态
- receiver 接收到正确的分组,处理分组递交上层,并反馈确认信息
- sender 收到确认信息,转为等待调用状态
2)错误场景中的操作
- 上层调用 sender,sender 发送完分组,转为等待反馈状态
- receiver 接收到错误的分组,直接反馈否认信息
- sender 收到否认信息,立即重传分组,且仍为等待反馈状态
- receiver 接收到正确的分组,处理分组递交上层,并反馈确认信息
- 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 中可能出现的问题,图二和图三为相应的解决方案。
图一中的问题:
- 第一个 pkt 0 的确认信息 ack 0 在确认时间内没有到达 sender
- 按照超时才重传原则,sender 在确认时间截止时重传第二个 pkt 0
- 第一个 pkt 0 的确认信息 ack 0 终于到达
- sender 认为 pkt 0 已接收完毕,开始传输 pkt 1
- 在 pkt 1 的确认信息 ack 1 到达之前,第二个 pkt 0 的确认信息 ack 0 到达了
- 由于重复的 ack 等价于 nak,因此 sender 需要重传 pkt 1
在这里有两种重传方案:
- (a) 直接重传:此时此刻立即重传 pkt 1
- (b) 超时才重传:当 pkt 1 的确认时间截止时才重传

方案 (a) 直接重传:
- sender 需要立即重传第二个 pkt 1
- 在第二个 pkt 1 的确认信息 ack 1 到达之前,第一个 pkt 1 的确认信息 ack 1 到达了
- sender 认为 pkt 1 已接收完毕,开始传输 pkt 0
- 在 pkt 0 的确认信息 ack 0 到达之前,第二个 pkt 1 的确认信息 ack 1 到达了
- 由于重复的 ack 等价于 nak,因此 sender 需要重传 pkt 0
- ...
可见,使用该方案会不断地出现需要重传的情况。我们需要做的是:让子弹多飞一会儿!
方案 (b) 超时才重传:
- sender 选择在第一个 pkt 1 的确认时间截止时才重传第二个 pkt 1
- 然而,在截止之前第一个 pkt 1 的确认信息 ack 1 到达了,sender 不需要重传了
- sender 认为 pkt 1 已接收完毕,开始传输 pkt 0
- ...
后续一切正常。
4. rdt3.0 的性能
网络利用率 = 发送时间/得到响应的时间。公式如下。
七、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 ࿰…...
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/ …...
晶体基本知识
文章目录晶体基本知识基本概念晶胞<晶格<晶粒<晶体晶胞原子坐标(原子分数坐标)六方晶系与四轴定向七大晶系和十四种点阵结构学习资料吉林大学某实验室教程---知乎系列晶体与压敏器件晶体基本知识 基本概念 晶胞<晶格<…...
免费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框出来呢? (一)基本原理 浏览器端提供了一个表单,在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端࿰…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
