哈工大计算机网络传输层协议详解之:可靠数据传输的基本原理

哈工大计算机网络传输层协议详解之:可靠数据传输的基本原理

  • 哈工大计算机网络课程传输层协议详解之:流水线机制与滑动窗口协议
  • 哈工大计算机网络课程传输层协议详解之:TCP协议
  • 哈工大计算机网络课程传输层协议详解之:拥塞控制原理剖析

可靠数据传输原理

什么是可靠?

  • 不错、不丢、不乱

    可靠数据传输协议

  • 可靠数据传输对应用层、传输层、链路层都很重要

  • 网络Top-10问题

  • 信道的不可靠特性决定了可靠数据传输协议(rdt)的复杂性

在这里插入图片描述

可靠数据传输可以从不同的角度来看,比如从a图是从提供的服务来看:

红线网上是应用层,在发送方是一个发送的进程,接收方是一个接收的进程。红线下面的传输层为上层提供可靠的数据传输服务,虽然从底层来看仍然是不可靠的信道,但是传输层通过设计的策略来实现可靠。

进一步的,从服务的实现角度(b图)来看,由于底层仍然是一个不可靠的信道,可靠数据的实现要在传输层借助算法实现,包括了发送方的可靠数据传输协议部分和接收方可靠数据传输协议部分。这两部分相互配合,共同实现可靠的数据传输协议。

因为下层仍然是不可靠的信道,因此传输层向下调用的是udt_send方法,即unreliable data send,发送到信道中。而此时传输层对上层来看是一个可靠的传输协议,因此上层调用的是rdt_send,即reliable data send。

总而言之,这就相当于在传输层实现了一套可靠传输协议,并对上层透明,对上层应用来说它所面向的就是可靠数据传输,尽管底层的信道仍然是不可靠的,也就是a图中从服务角度来看。

在这里插入图片描述

从图中可以看到,在传输层和不可靠信道(比如网络层)之间是双向的箭头,也就是说在不可靠信道上实现可靠的数据传输,并不是一个简单的单向数据流动就能实现,需要双向的控制消息的流动。

可靠数据传输协议

只考虑单向数据传输,但是控制信息双向流动。利用状态机(Finite State Machine, FSM)刻画传输协议

接下来,我们从易到难,逐步递进来分析一下实现可靠数据传输的方案和流程。

Rdt 2.0:产生位错误的信道

首先我们假定一个简单的场景,即信道只会产生位错误,而不会有其他错误产生。

**场景:**传输中可能会发生位错误,比如把某个0翻转为1,把某个1翻转为0。目前的场景认为信道只可能发生这种错误,不会发生分组丢失等其他问题,并且数据是按顺序到达的。这种场景下来研究位错误时,可靠传输机制如何来实现。

接收方:

  • 需要知道接收的数据是否发生了位错误
  • 如果发生了错误,需要发送方重传
  • 需要告诉发送方出现错误,需要恢复数据

接收方如何判断接收的数据是否发生了位错误?

利用校验和检测位错误

如何从错误中恢复?

  • 确认机制(Acknowledgements, ACK):接收方显示地告知发送方分组已正确接收
  • NAK:接收方显示地告知发送方分组有错误
  • 发送方收到NAK后,重传分组

接收方显示的反馈给发送方一些控制消息:ACK/NAK

基于上述这种重传机制的rdt协议被称为ARQ(Automatic Repeat reQuest)协议

基于上述思想,设计如下的有限状态机:

在这里插入图片描述

发送方有限状态机

此时,发送方存在两个有限状态:Wait for call from aboveWait for ACK or NAK

  • 第一个状态表示等待上层调用,比如应用层向传输层发送数据(rdt_send),接收到数据后会调用make_pkt进行打包,此时会携带是数据的checksum校验和,最后调用udt_send发送到接收方。

  • 第二个状态表示等待ACK/NAK控制状态的返回,即停—等协议。

上述发送方的有限状态机即表示:接收上层协议的调用,并将数据打包发送到接收方,同时,停止等待接收方ACK/NAK状态信息的返回。如果接收到的是NAK状态,则重新执行udt_send将数据重传到接收端。如果接收到的是ACK状态,则回到第一个状态,等待下次调用。

接收方有限状态机

  • 只有一个状态,表示等待下层协议的调用。此时会去判断接收的数据是否有错误。如果有错误,则调用udt_send方法返回NAK状态,如果没有错误,则返回ACK状态。

Rdt 2.1:发送方。应对ACK/NAK破坏

Rdt2.0有什么缺陷?

如果ACK/NAK消息发生错误/被破坏(corrupted)会怎么样?

  • 为ACK/NAK增加校验和,检错并纠错
  • 发送方收到被破坏ACK/NAK时不知道接收方发生了什么,添加额外的控制消息
  • 如果ACK/NAK坏掉,发送方重传
  • 不能简单的重传:产生重复分组。比如前一个分组已经被接收端正确接收了,但是返回的ACK/NAK坏掉了,导致发送方重传,此时就会产生重复分组。

如何解决重复分组问题?

  • 序列号(Sequence number):发送方给每个分组增加序列号
  • 接收方丢弃重复分组

发送方有限状态机

此时发送方的有限状态机设计如下所示:

在这里插入图片描述

假设这里使用两个序列号,0和1,可以看到状态机的状态翻倍了,因为要停止等待不同序列号下数据的ACK/NAK。这里在make_pkt方法中携带了每个数据包对应的序号,此时对于上述重传可能产生分组重复的问题,相同序号的数据包会在接收到被丢弃。

接收方有限状态机

在这里插入图片描述

可以看到有限状态机的状态也翻倍了,分别等待接收序号为0和1的数据包。

Rdt2.1 vs Rdt2.0

发送方

  • 为每个分组增加了序列号
  • 两个序列号就够用,为什么?
  • 需校验ACK/NAK消息是否发生错误
  • 状态数量翻倍
    • 状态必须记住当前的分组序列号

接收方

  • 需判断分组是否重复
    • 当前所处状态提供了期望收到分组的序列号
  • 注意:接收方无法知道ACK/NAK是否被发送方正确收到

Rdt 2.2:无NAK消息协议

实际上,我们并不需要两种状态来表示接收方是否正确接收数据。

与rdt2.1功能相同,但是只使用ACK,如何实现?

  • 接收方通过ACK告知最后一个被正确接收的分组
  • 在ACK消息中显式地加入被确认分组的序列号
  • 发送方收到重复的ACK之后,采取与收到NAK消息相同的动作,重传当前分组。

Rdt2.2 状态机片段

在这里插入图片描述

Rdt3.0:如果信道既可能发生错误,也可能丢失分组,怎么办?

”校验和 + 序列号 + ACK + 重传”够用吗?

如果发送方发送的一个数据分组在信道中丢失了,此时发送方和接收方分别会采取什么反应?

此时,接收方没有收到数据,则什么也不做,仍然一直等待接收数据。而发送方则会一直等待接收方反馈的状态信息(状态机停留在Wait for ACK状态)。在这种情况下,这个分组就完全丢失了,变成不可靠传输了。

又或者,数据分组到达接收方,但是接收方返回的ACK在信道中丢失了,此时发送方也会一直等待下去,此时这个协议就不能正常工作了,也就是上面的Rdt2.2的机制就不够用了

怎么解决上述问题?

解决方案也很简单:超时重传。

即发送方等待“合理”的时间,如果超时没收到ACK,则重传。

同时,由于存在分组或ACK只是延迟而不是丢失,导致的超时后,数据重复的问题,仍然采用上述Rdt2.1机制中介绍的序列号的方法:

  • 发送端发送数据时加上序列号,接收方对于重复的序列号遗弃。
  • 接收方返回ACK时,需要在ACK中显式的告知所确认的分组序号

Rdt3.0有限状态机图例:

在这里插入图片描述

从上图中可以看出:

  • 在接收到上层的数据后,发送端除了将数据包发送出去外,还会启动一个定时器(start_timer),然后进入等待ACK的状态。
  • 这里Wait for ACK状态中,多了一种状态转移条件,即timeout。如果timeout超时,则触发udt_send重传数据。

Rdt3.0工作的几种场景

在这里插入图片描述

右图的timeout即显示了当丢失了packet时,等待超时时间后,发送方重传packet,此时当数据包丢失时,rdt3.0仍能正常工作。

在这里插入图片描述

C图表示了当接收方返回的ACK1丢失时,发送方再等待timeout时间后,对数据包进行了重传。此时,由于接收方会接收到两个pkt1,即重复的packet,由于有序号机制,接收方发现存在两个相同序列号的数据包,会丢弃刚刚收到的这个pkt1的数据包,并重发ACK1。在这种场景下,即使ACK丢失了,rdt3.0机制仍能正常工作。

D图表示了ACK没有丢失,只是延迟到达的场景。此时,发送端在等待timeout时间后对pkt1数据包进行了重传,然而此时发送方才收到ACK1的返回。这种情况接收方也会出现接收到重复分组的问题,但是由于存在序列号机制,接收方仍然可以根据序列号丢掉重复的分组。而发送方也会接收到两个重复的ACK1的返回,根据上图中发送方的有限状态机状态可以发现,由于在前一个ACK1到达后,发送端就发送pkt0的数据了,因此停留在等待ACK0响应的状态,因此第二个ACK1不会引起状态机的状态转移,相当于也会被接收方丢弃。(因为是示例,所有图中只有两个状态,实际上TCP在解决这个问题时,会丢弃返回的ACK序号小于当前发送数据包序号的ACK)。因此这种场景下,即使ACK重复,rdt3.0机制仍能正常工作。

到此我们的rdt3.0机制中解决了之前多个场景下的问题,引入了序号机制、超时重传机制等。

Rdt3.0性能分析

Rdt3.0能够正确工作,但相对来说性能很差,特别是当带宽速率很高的时候

示例:比如存在一个1Gbps的链路,由于链路比较长,存在15ms端到端的传播延迟,假定发送的每个分组大小是1KB

则此时的分组的在该链路上的传输时间为:

在这里插入图片描述

即需要8s,可以将一个分组从这个链路上发送出去。由于rdt3.0是一个停等协议,因此发送完数据分组后,会停止等待ACK的返回。

由于端到端的传播延迟为15ms,因此rtt约等于30ms(一个来回)。

发送方利用率:发送方发送时间百分比:

在这里插入图片描述

相当于在1Gbps链路上,每30ms才发送一个分组 -> 33KB/sec

网络协议限制了物理资源的利用

在这里插入图片描述

rdt3.0导致的性能较差的原因,本质上就是因为停止等待协议。

总结

上面我们通过自己设计可靠传输协议的方式,来层层递进地展示可靠性传输算法所要解决的问题和实现原理。更进一步的,借助于有限状态机的状态更新来标识可靠性传输步骤,其中如果能吃透有效状态机在可靠性传输过程中的状态转换,会很有助于我们自己理解可靠性传输的机制和原理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Postman中读取外部文件

目录 前言: 一、postman中读取外部文件的格式 二、Postman中如何导入文件 三、在Postman读取导入的数据文件 前言: 在Postman中,您可以使用"数据文件"功能来读取外部文件,如CSV、JSON或Excel文件。这使得在测试中使用…

Bootstrap CSS 概览

文章目录 Bootstrap CSS 概览HTML 5 文档类型(Doctype)移动设备优先响应式图像全局显示、排版和链接基本的全局显示排版链接样式 避免跨浏览器的不一致容器(Container)Bootstrap 浏览器/设备支持 Bootstrap CSS 概览 在这一章中&a…

成为行业风向标,亚马逊云科技近年在数据库排名逐年上升

近10年,全球数据库市场加速变革,云数据库尤其是云原生数据库成为整个数据库市场的关键变量。某种程度上,亚马逊云科技作为全球云原生数据库的领导者,具有行业风向标的价值。 近期,发生了一件对全球数据库市场具有标志性…

爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

文章目录 动态网页爬取静态网页与动态网页的区别使用Selenium实现动态网页爬取Selenium 的语法及介绍Selenium简介安装和配置创建WebDriver对象页面交互操作 元素定位 等待机制页面切换和弹窗处理截图和页面信息获取关闭WebDriver对象 使用API获取动态数据未完待续.... 动态网页…

GB51309实施后对于消防应急照明和疏散指示系统在城市隧道应用中的影响

安科瑞 崔丽洁 【摘要】:应急照明和疏散指示系统被广泛运用于城市隧道、楼宇建筑、地下管廊等各个方面。当隧道这类特殊建筑内出现火灾或事故时,可靠的应急照明和疏散指示系统对于人员的安全逃生有着重要的作用。随着GB51309-2018《消防应急照明和疏散指…

java 调用 opencv 识别图片

前言 opencv 的 github 地址 opencv 官网 本文介绍如何使用 java 来调用 opencv 下载opencv opencv下载 页面根据自己电脑操作系统下载最新的安装包,我这里下载的是 4.7.0 版本。 (4.7.0 版本里的 opencv-470.jar 包是使用 jdk11 编译的&#xff0c…

JVM 常量池、即时编译与解析器、逃逸分析

一、常量池 1.1、常量池使用 的数据结构 常量池底层使用HashTable key 是字符串和长度生成的hashValue,然后再hash生成index, 改index就是key;Value是一个HashTableEntry; 1、key hashValue hash string(name, len) i…

66. 加一

LeetCode-66. 加一 1、题目描述2、解题思路3、代码实现4、解题记录 ) 1、题目描述 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以…

【NLP】用python实现文本转语音处理

一、说明 介绍一款python调用库,离线软件包pyttsx3 API,它能够将文字转化成语音文件。Python 中有多种 API 可用于将文本转换为语音。pyttsx3 是一个非常易于使用的工具,可将输入的文本转换为音频。与其它类似的库不同,它可以离线…

单片机学习12-串口通信

目录 串口通信实验 通信的基本概念 串行通信与并行通信 异步通信与同步通信 单工、半双工与全双工通信 通信速率(比特率) 单片机串口介绍 串口通信简介 串口相关寄存器 串口工作方式 方式 0 方式 1 方式 2 和方式 3 串口的使用方法 硬件设计…

Spring相关API

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

笔记本安装双系统ubuntu时踩的坑——戴尔

如果你遇到以下的这些问题,不要直接装了,无解!!! 建议看我另一篇教程,把硬盘取出来在另外的电脑上装好系统再放回去,这样嘎嘎快。 移动硬盘中安装Ubuntu 20.04系统——立省99%的问题_放风筝的…

插入排序——希尔排序

希尔排序其实就是一种插入排序,实际上就是通过直接插入排序一步步改进优化而实现的。所以在了解希尔排序之前要明白插入排序的实现原理。 插入排序 其实我觉得插入排序也可以叫做摸牌排序,就是从第二张牌开始处理,将摸到的牌按照合适的顺序插…

解决 An attempt was made to call a method that does not exist. 问题详解

哈喽大家好,我是阿Q。今天在开发代码的过程中,由于手抖,不知道引入了什么包依赖,导致项目启动一直报错,特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 有想赚点外块|技术交流…

苹果Vision Pro手势+眼球融合交互的奥秘

毫无疑问,Vision Pro在眼球追踪手势的融合交互体验上,给AR/VR头戴设备带来了新突破,在用户体验上的提升非常明显。 ​那么,为什么Vision Pro上这一功能会被如此值得关注呢?为了弄清楚,我们先来看看主流VR设…

原来,这就是铁路隧道R型变压器的工作真相!

铁路作为我们日常交通的重要出行设备,其安全稳定性极为重要。高速铁路具有行车速度快、行车密度高、负荷分布密集、自动化程度高、要求安全、正点运行的特点。铁路隧道对电力系统的供电可靠性也有非常严格的要求。铁路隧道R型变压器在铁路隧道供电系统中的主要功能是…

Upload靶场通关笔记

文章目录 一、Pass-011.抓包上传2.获取上传路径3.工具验证 二、Pass-02三、Pass-031.使用httpd.conf自定义后缀2.提取上传文件名3.工具测试4.注意点四、Pass-041.上传.htaccess2.上传图片3.工具测试 五、Pass-05六、Pass-061.空格.号绕过2.工具测试 七、Pass-07八、Pass-081.特…

NoSQL之Redis优化(一)

Redis的高可用 一、Redis 持久化RDB 持久化AOF 持久化RDB和AOF的优缺点 二、Redis 性能管理内存碎片如何产生的?解决碎片率大的问题:内存使用率内回收key 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时…

8.6 socket套接字及TCP的实现框架

socket套接字 目录 socket套接字 体系结构的两种形式 几种常见的网络编程接口 socket套接字 socket常用API介绍 socket套接字 三元组【IP地址,端口,协议】 地址族结构体 套接字类型 TCP通信的实现过程 体系结构的两种形式 网络的体系结构 (N…

TinyViT: 一种高效的蒸馏方法

目录 背景方法大意快速预训练蒸馏(Fast Pretraining Distillation, FPD)如何实现快速三个细节深入理解FPD 模型架构训练trick预训练参数配置(Imagenet21k-pretraining)finetuning 参数配置(Imagenet-1k) 消融实验**Q: 数据是否越多…