中科大计网学习记录笔记(十五):可靠数据传输的原理
前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是什么再去看 RDT 是如何解决它的会很有帮助;在 RDT 之后又引入了流水线协议去解决 RDT 利用效率问题,这部分同样需要先搞清楚提出了什么问题。
前言:
学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程
该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信息量过大,有太多无法理解的地方,在我第一次点开的时候也有相同的感受,但经过了一段时间项目的学习,对计网有了更多的了解,所以我准备在这次学习的时候做一些记录并且加入一些我的理解,希望能够帮助到大家。
往期笔记可以看专栏中的内容😊😊😊
文章目录
- 3.4 可靠数据传输的原理
- 3.4.1 实现 RDT 通信需要解决哪些问题?
- 3.4.2 RDT 1.0 - 可靠信道上传输数据
- 3.4.3 RDT 2.0 - 在具有比特差错的信道传输数据
- 3.4.3.1 RDT 2.1
- 3.4.3.2 RDT 2.2 - NAK FREE
- 3.4.4 RDT 3.0 - 在具有比特差错和分组丢失的信道上传输
- 3.4.5 流水线协议
- 3.4.5.1 案例
- 3.4.5.2 滑动窗口
- 3.4.6 GBN 协议
- 3.4.7 SR 协议
3.4 可靠数据传输的原理
💡 RDT(Reliable Data Transfer,可靠数据传输)是一种通信协议,旨在通过各种技术手段确保数据在通信网络中可靠地传输。RDT的实现方式可以基于不同的传输层协议,如TCP或UDP。
3.4.1 实现 RDT 通信需要解决哪些问题?
如果说是在传输层来实现可靠数据传输的话需要从上层收取数据,将其进行封装然后交给下层,但如果下层是 unreliable 的话,就需要通过本层实现来解决下层不可靠的问题。
整个可靠数据传输需要解决如下的问题:
- 完整性(Integrity):数据在传输过程中没有被篡改或损坏。接收方能够准确地接收到发送方发送的数据。
- 顺序性(Ordering):数据包按照发送的顺序被接收方接收。即使在传输过程中发生了拥塞或丢包,接收方也能够按照正确的顺序重组数据。
- 可靠性(Reliability):数据包能够在不丢失的情况下被接收方接收到。如果数据包丢失或损坏,可靠的传输机制会重新发送数据,直到接收方正确地接收到为止。
- 及时性(Timeliness):数据包能够在合理的时间内被接收方接收到,避免过长的延迟或等待时间。
但如果网络层实现了其中的一部分,那传输层只需要解决 剩余的部分 即可。
所以采用一种渐进的方式来讲述 RDT 的实现,先假设一个可靠的传输信道,再逐步减少其能实现的功能,同时逐步是通过上层的协议来解决这些问题。
💡 使用有限状态机(FSM)来描述发送方和接收方
- 是一种抽象的计算模型,用于描述系统在不同状态之间的转换以及状态转换所触发的行为。有限状态机由一组状态、一组输入和一组状态转换规则组成。
- 使用圆来表示一种状态,使用连线来表示从一个状态到另一个状态的变迁,连线上的标注:分子表示引起状态变迁的事件,分母表示状态变迁的时候要进行的动作。
3.4.2 RDT 1.0 - 可靠信道上传输数据
💡 此时下层的信道是完全可靠的
- 没有比特出错
- 没有分组丢失
此时的传输层就不需要做任何的操作,只需要接收上层的数据并且封装,接着将数据交给网络层即可。
此时发送方和接收方的 FSM:
💡 看懂这个图需要记住上面说的分子和分母的含义
- 发送方等待上层的数据,上层使用
rdt_send(data)
发送数据- 此时发送方将数据封装并且调用下层的
udt_send()
来进行发送- 接收方同理,接收到数据然后解封装向上层传递
3.4.3 RDT 2.0 - 在具有比特差错的信道传输数据
💡 此时下层的信道就稍微不可靠一点了,会使得发送的分组中的比特翻转过来。
此时发送方和接收方就需要通过一定的手段来找出数据中是否存在问题和解决了。
比如使用 校验和 的方式:
-
校验和是一种简单的错误检测方法,通常用于确认数据在传输过程中是否发生了错误。
-
它通过对数据中的每个字节进行加和运算得到一个校验值,并将该校验值附加到数据中 一起传输。
-
接收端 在接收到数据后也计算校验和,然后与发送端附加的校验和进行比较,如果两者相等,则说明数据在传输过程中没有发生错误;如果不相等,则说明数据可能已经损坏,需要进行重传。
-
校验和虽然能够检测一部分错误,但并 不是完美的错误检测方法,因为存在一些情况下校验和并不能准确地检测出错误。
💡 这篇博客里有关于 UDP 校验和形成的描述,感兴趣的朋友可以去看看:中科大计网学习记录笔记(十四):多路复用与解复用 | 无连接传输:UDP
此时校验如果出错,那解决方法就只能是通过 重传,所以需要 将检测结果反馈给发送端 来决定是否重传,当数据没有错误的时候向发送端发送 确认(ACK),反之发送 否定确认(NAK)
- 发送方需要等待接收方的确认消息才能决定是否重传分组或者继续发送其他分组
- 发送端接收到
NAK
的时候就重传分组
此时发送方就有了等待上层交付数据和等待接收方返回数据两种状态
3.4.3.1 RDT 2.1
💡 RDT 2.0 存在一个致命的缺陷:既然发送的数据可能损坏,那发送的 ACK 或者 NAK 是否也有可能损坏呢?
此时就需要一种解决方法:
发送方接收到一个无法理解的消息,这个消息有两种可能:ACK
或者 NAK
,NAK
直接重传就可以了,但是得有一种方法能让接收方重传这个 ACK
。
- 此时就采用和 NAK 同样的处理方式,直接重新发送上次的分组过去。
- 此时如果接收方发送的是
NAK
那就直接结束了,但如果发送方发送的是ACK
但是接收到了相同的分组,也就知道是发送的ACK
在传输中出现了问题,直接重发ACK
即可。 - 为了让接收方和发送方都能认识分组,所以采用编号的方式,快速的判断是否是重传。
3.4.3.2 RDT 2.2 - NAK FREE
💡 发送数据不一定一次就只发送一条数据,但如果发送多条数据的其中一条出错,仍然使用单调的
NAK
解释的话,就无法知道要重发哪一条。
- 停等协议(Stop-and-Wait)
- 流水线协议(Pipelining Protocol)
同时上面又引入了编号,那就有了一种新的确认错误的方式:发送的编号和返回的编号是否相同,比如说发送的是数据 0
但是接收方传输过来的是 ACK(1)
这时候同样可以达到标识错误。
这种改动其实对单个数据发送没有太大影响,而对后续改编成连续数据的发送则有很大的帮助。
3.4.4 RDT 3.0 - 在具有比特差错和分组丢失的信道上传输
💡 此时下层的信道可能会丢失分组,比如数据会丢失,或者 ACK 也可能会丢失
这样就带来了一些问题:发送方不知道接收方接收到了没有,因为发送的数据和发送方的 ACK 都有可能会丢失。
此时的解决方式就是采用超时重传机制:发送方等待 ACK 一段时间,如果没有收到就说明出现了问题,此时直接重传:
- 如果此时是数据丢失的情况,重传后双方同步
- 如果是 ACK 丢失的情况,接收方接收到了重复的数据,同样发送 ACK 回去,此时也能同步
👉 这个超时重传的时间设定要合理,当时间设置的过长会导致错误处理不及时,过低则会导致使用效率的降低:
- 当 ACK 还没来得及过来的时候发送方就重发了信息,此时接收方收到了重发,再次发送一个 ACK 过去,这样就会导致每次发送都是两次甚至多次的发送:
3.4.5 流水线协议
💡 此时通过 RDT 协议已经解决了网络层可能出现的所有问题,但是发送一条后等待确认再发送下一条的特质使得其对信道的利用效率极低。
3.4.5.1 案例
💡 使用发送速率为 1 Gbps 的链路进行通信,端到端的传播延时为 15 ms,一个分组的大小为 1kB,评判一下数据传输的效率。
传输延时为 8 / 109 = 8 us
总延时:15ms ✖ 2 + 8us
此时的利用率也就是总延时除以发送延时,达到了 0.00027,也就是说只有 0.027% 的时间在发送数据,其他时间都在等待 ACK。
这样的效率显然是不尽如人意的,所以在等待的时间中可以通过再次发送其他数据来增大利用率。
3.4.5.2 滑动窗口
💡 在学习具体的流水线协议之前要先了解滑动窗口,这是实现该协议的一种机制。
比如说此时有五个分组等待发送
肯定无法直接将这五个分组全部打出去,因为接收方的接受能力是有限的,而且下方的网络层提供的是不可靠的传输,需要对错误的信息进行重传等操作。
所以需要设置一个固定大小的 缓冲区,将每次只处理缓冲区域内的数据,等到缓冲区域中的一部分数据处理完成,通过移动缓冲区,又可以处理新的数据。
假设缓冲区的大小为 3
,就将这三个数据全部打出
此时进入等待,等到数据 0
的 ACK 收到的时候,就可以移动窗口了
这样逐次进行操作,直到处理完所有需要发送的分组。
以上就是滑动窗口的基本思想,同样的,在接收方也可以顺序的去接收一个分组或同时可接收多个分组,对于这两种情况发送方又有不同的策略。
3.4.6 GBN 协议
💡 GBN(Go-Back-N):当接收方一次只能接收一个分组的时候就需要使用该协议。
此时发送方只能接收分组 0,当接收到分组 0 的时候,将可接受的内容后移一位来接收 1,同时向发送方发送 ASK。
发送方接收到 ASK 之后可以移动窗口继续发送其他分组。
这是最好的情况,比如说此时通信处于如下的情况:
接收方等待接收分组 2,但是如果出现了某些情况导致分组 2 没有到达,而是分组 3 和 分组 4 到达,那这时候接收方就会 拒收 这些分组。
那这样之后,分组 2 包括其以后的分组都没有收到,必须通知发送方来重传;最好的方式就是给分组设置定时器,如果发送的分组没有收到 ASK 的话,就进行重传的操作。
所以当接收方收到分组 3 的时候,会返回 分组 1 的 ASK,那自然分组 2 之后的所有分组在分组定时器到期后就会进行重传操作,解决了分组丢失的问题。
所以当分组 2 丢失了之后就需要跳回到数个位置之前去重传,所以称之为 Go Back N。
但显然因为一个分组的丢失去重传多个分组是可以优化的,可以让 接收方同时可以接收多个分组 来实现,这也就是接下来要说的 SR 协议。
3.4.7 SR 协议
💡 SR(Selective Repeat):即选择重传协议,通过让接收方接收多个分组,可以实现选择性的重传分组,而不需要重传 N 个分组。
此时比如说接收到了分组 2,就将分组 2 先保留下来,同时发送 ASK2 给发送方,发送方此时给分组 2 一个标识,然后只需要发送其他的未接受到 ASK 的分组即可。
这个重发操作同样是通过 定时器 来实现。
对比一下:
- 当出错率低的时候使用 GBN,因为即使是 Go Back N 带来的损失依旧很小,没必要去使用复杂的 SR 协议。
- 当链路容量很大的时候建议使用 SR,因为容量大代表同时可发送的内容较多,为了充分利用就会同时发送很多的分组,此时如果出现错误,代价会比较大。
平衡这两点考虑就可以选择出适合的协议方式。
相关文章:

中科大计网学习记录笔记(十五):可靠数据传输的原理
前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是…...

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)
一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)࿰…...
力扣:93. 复原 IP 地址
回溯: 1.先定义一个接收的集合,之后再定义一个记录小数点的变量。之后编写回溯函数,终止条件为小数点的个数为3时,同时要判断最后一段的组合的值是否属于ip地址的范围。之后再用for循环来遍历ip地址的组合,先判断组合…...
利用序列化和反序列化实现深拷贝
利用序列化和反序列化可以实现对象的深拷贝,具体步骤如下: 将要深拷贝的对象序列化为字节流。从字节流中反序列化出一个新的对象,即完成了深拷贝。下面是一个示例代码: import java.io.*;class MyClass implements Serializable {private static final long serialVersion…...
【AHK】68键键盘键位布局优化/esc改退格键/回车键
本人习惯使用~作为退格键,但是由于keychron 68键的布局只能用esc平替~来修改,然后也将回车键通过alt和大小写锁定键一起触发 esc::bs ;次步骤与下面步骤相对应,如果是用send bs方式则下面的不生效^esc:: ;通过建立 保留esc功能 send {esc} re…...

计算机体系架构初步入门
🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 目录 1 计算机五大…...
常见的序列化数据结构方法及其优缺点汇总
文章目录 1. JSON (JavaScript Object Notation)2. XML (eXtensible Markup Language)3. YAML (YAML Aint Markup Language)4. Protobuf (Protocol Buffers)5. MessagePack6. BSON (Binary JSON)7. Avro8. Thrift9. CBOR (Concise Binary Object Representation) 将常见的序列化…...

华清远见嵌入式学习——驱动开发——作业1
作业要求: 通过字符设备驱动分步注册过程实现LED驱动的编写,编写应用程序测试,发布到CSDN 作业答案: 运行效果: 驱动代码: #include <linux/init.h> #include <linux/module.h> #include &l…...

小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)
C题:C-小苯的IDE括号问题(easy)_牛客小白月赛87 (nowcoder.com) D题: D-小苯的IDE括号问题(hard)_牛客小白月赛87 (nowcoder.com) C题代码: #include<bits/stdc.h>using namespace std…...

Redis如何修改key名称
点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景,本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中,可以使用rename命令来修改Key的名称。这个命令的基本语法如下: RENAME old_key new_key 在这里&#…...
浅谈redis之SDS
SDS 什么是SDSSDS结构len的作用free的作用buf的作用简单示例 SDS机制重新分配内存分配内存机制小于1MB情况大于1MB情况为什么这样分配 惰性释放内存 什么是SDS SDS:全名 simple dynamic string,意为简单动态字符串,作为redis里的一种数据结构…...

数据结构知识点总结-线性表(1)-线性表的定义、基本操作、顺序表表示
线性表 定义 线性表是具有相同数据类型的N(N>0)个元素的有限序列,其中N为表长,当N0时线性表是一张空表。 线性表的逻辑特征:每个非空的线性表都有一个表头元素和表尾元素,中间的每个元素有且仅有一个直…...

Spring Boot 手写starter!!!
原因:为什么要手写starter??? 原因:简化功能。 实例:以分页为例:写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…...

移动端自动化常用的元素定位工具 介绍
在移动端自动化测试和开发中,元素定位是非常关键的一步。以下是一些常用的工具和技术来帮助开发者或测试工程师在移动设备上定位元素: 1. **UiAutomator**: - **UiAutomator** 是 Android 官方提供的自动化测试框架。它可以用来编写测试脚本&…...

问题:Spark SQL 读不到 Flink 写入 Hudi 表的新数据,打开新 Session 才可见
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...

数学建模资料分享
1. 往年各赛题的优秀论文 可以用来参考一下论文是怎么写的。参考论文的结构,格式,思路等等。 链接:https://pan.baidu.com/s/1WG2t4-x9MjtaSgkq4ue5AQ?pwdnlzx 提取码:nlzx --来自百度网盘超级会员V4的分享 2.论文模板 链接&a…...

应用配置管理
一、Pod 配置管理 可变配置用 ConfigMap; 敏感信息用 Secret; 身份认证用 ServiceAccount 这几个独立的资源来实现的; 资源配置用 Resources; 安全管控用 SecurityContext; 前置校验用 InitContainers 这几个在 …...

This dependency was not found解决方法
问题如上(前端代码),我是引用js文件出的问题,无法找到api/userManage模块。 解决:没感觉哪有问题,把后面加了个/,就解决了,代表src目录,应该是目录和目录之间应该有/作为分割:...

基于SpringBoot的停车场管理系统
基于SpringBootVue的停车场管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台首页 停车位 个人中心 管理员界面 摘要 摘要:随着城市化进程的…...

SQL库操作
1、创建数据库 概念 创建数据库:根据项目需求创建一个存储数据的仓库 使用create database 数据库名字创建 数据库层面可以指定字符集:charset/character set 数据库层面可以指定校对集:collate 创建数据库会在磁盘指定存放处产生一个文件夹 创建语法 create …...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...