【探索Linux】P.40(传输层 —— TCP滑动窗口 | 快重传 | 流量控制 )

在这里插入图片描述

阅读导航

  • 引言
  • 一、TCP滑动窗口
    • 1. 为什么要用滑动窗口
      • (1)逐个确认
      • (2)优化逐个确认(滑动窗口)
    • 2. TCP滑动窗口的工作原理
  • 二、快重传的引入
  • 三、快速重传详细介绍
    • 1. 机制原理
    • 2. 触发条件
    • 3. 操作步骤
    • 4. 与超时重传的区别
    • 5. 有了快重传可以不要超时重传吗?
  • 四、流量控制
    • 1. 概念
    • 2. 流量控制的特点
    • 3. 注意事项
  • 温馨提示

引言

在网络通信的世界里,TCP(传输控制协议)以其可靠性和顺序性而著称,成为互联网上数据传输的基石。上一篇文章中,我们深入探讨了TCP协议的两个关键机制:三次"握手"和四次"挥手",它们确保了数据传输的建立和终止过程的稳定性和可靠性。现在,让我们进一步探索TCP协议的另外三个高级特性:滑动窗口、快重传和流量控制

在本文中,我们将详细解析这些机制是如何协同工作,以确保TCP协议在各种网络环境下都能提供高效、可靠的数据传输服务。通过深入理解这些特性,我们可以更好地把握网络通信的复杂性,并利用它们来优化我们的应用程序和网络服务。让我们开始这段探索之旅,一窥TCP协议的精妙之处。

一、TCP滑动窗口

1. 为什么要用滑动窗口

(1)逐个确认

正如我们前面所说每个发送的数据段都进行单独确认(称为“逐个确认”或“延迟确认”)。这种方法确保了数据的可靠性,但也存在一些性能上的缺陷,尤其是在数据往返时间较长的情况下。
在这里插入图片描述

🔴逐个确认的缺点

  1. 增加延迟:因为每个数据段都需要等待一个单独的确认,这会增加数据传输的总延迟。

  2. 降低吞吐量:如果网络条件不佳,或者接收方处理速度较慢,发送方可能需要等待较长时间才能收到确认,这会限制数据的发送速率。

  3. 增加网络负载:每个数据段都需要一个确认包,这会增加网络中的数据包数量,特别是在高带宽环境下,可能会造成不必要的网络负载。

(2)优化逐个确认(滑动窗口)

既然这样一发一收的方式性能较低, 那么我们发送多个数据段而不是单个数据段,可以有效地减少等待确认的时间,从而提高整体的传输性能。这种方法允许数据传输在等待确认的过程中继续进行,实现时间上的重叠,优化了网络资源的利用。
在这里插入图片描述
上图的窗口大小就是4000,窗口大小设置为4000这意味着发送方可以连续发送4000字节的数据,而不需要等待接收方对这些数据的确认应答。

2. TCP滑动窗口的工作原理

  1. 初始发送:发送方一开始可以发送四个数据段,而无需等待任何确认应答(ACK)。

  2. 窗口滑动:一旦接收方发送了第一个ACK,表明已成功接收到数据,发送方的滑动窗口就会向后移动,允许发送方继续发送下一个数据段。

  3. 连续发送:这个过程会一直持续,每当收到一个ACK,窗口就会滑动,发送方就可以继续发送更多的数据段。

  4. 发送缓冲区:操作系统内核使用发送缓冲区来跟踪哪些数据已经被发送但还没有收到确认应答。

  5. 数据删除:只有当数据被确认应答后,它们才会从发送缓冲区中删除。

在这里插入图片描述

二、快重传的引入

在讨论了TCP滑动窗口的工作原理之后,接下来我们来探讨数据丢包的问题。
✅情况一:当数据包成功到达接收方,但对应的确认应答(ACK)却未能到达发送方
在这里插入图片描述
在TCP通信中,即使某些ACK丢失,也不会导致严重问题,因为TCP的确认机制允许使用后续的ACK来确认丢失ACK所对应的数据段。这是因为TCP在发送ACK时,实际上是确认了所有之前序列号的数据都已经成功接收

🔴情况二:数据包就直接丢了
在这里插入图片描述
在TCP通信中,如果数据段丢失,发送方会通过连续收到相同序列号的ACK得知这一点。例如,如果发送方收到三次序列号为1001的ACK,它会立即重传丢失的数据段(1001到2000)

接收方在收到并确认这些重传的数据后,会更新ACK,发送一个更大的序列号(如7001),表示之前丢失的数据段已经补齐,并且更多的数据已经准备好接收

这个过程称为’快重传’,它优化了数据传输,减少了等待时间,提高了网络通信的效率。

三、快速重传详细介绍

快速重传(Fast Retransmit)是TCP协议中的一种重要机制,旨在提高数据传输的效率,尤其是在发生数据包丢失的情况下。以下是对快速重传机制的详细介绍:

1. 机制原理

快速重传基于这样一个事实:如果接收方收到一个失序的数据包,这通常意味着前一个数据包已经丢失。因此,接收方会立即发送一个重复的ACK(对最后一个成功接收的数据包的确认),而不是等待接收到期望的数据包后再发送ACK

2. 触发条件

当发送方连续收到三个相同的ACK时,这表明接收方已经收到了一个数据包三次,但期望的数据包尚未到达。这时,发送方会认为丢失的数据包是紧接在最后一个成功接收的数据包之后的那个,从而触发快速重传机制。

3. 操作步骤

  • 发送方在发送数据后,等待接收方的ACK。
  • 如果发送方收到三个相同的ACK,表明有数据包丢失。
  • 发送方立即重传丢失的数据包,而不必等待重传定时器(RTO)超时。

4. 与超时重传的区别

  • 超时重传依赖于重传定时器,当定时器超时后,发送方才会重传数据。
  • 快速重传不依赖于定时器,而是根据连续重复的ACK来确定何时重传。

5. 有了快重传可以不要超时重传吗?

🚨🚨答:不可以,尽管快速重传机制提高了TCP在处理数据包丢失时的效率,但它并不能完全替代超时重传。例如,在最后三个数据包同时丢失的情况下,由于无法触发连续三个重复ACK的条件,快速重传机制将无法被激活。因此,超时重传作为一种补充机制,仍然在TCP中发挥着重要作用。

四、流量控制

1. 概念

TCP协议通过流量控制机制来适应接收端的处理能力,避免因发送端发送数据过快而导致接收端缓冲区溢出和数据包丢失。当接收端的缓冲区接近满载时,如果发送端继续快速发送数据,可能会引发丢包和连锁的重传问题。流量控制允许接收端根据自己的处理速度动态调整发送端的发送速率,从而维持网络通信的稳定性和效率

⭕下面这个是根据窗口大小控制流量过程的一个示例:
在这里插入图片描述
在提供的示意图中,我们可以看到,当接收端接收到编号从3001开始的数据段后,它的缓冲区被填满,因此不得不暂停接收新的数据。为了恢复数据传输,接收端需要等待发送端发出的窗口更新通知。但是,如果这个通知在传输过程中丢失,可能会导致通信中断。为了避免这种情况,发送端会定期发送窗口探测数据段,这个数据段只包含一个字节,用于获取接收端的最新窗口大小信息。

2. 流量控制的特点

  1. 动态调整

    • 接收方根据自身的缓冲区使用情况动态调整窗口大小。
    • 如果缓冲区接近满载,接收方会减小窗口大小,通知发送方减慢发送速率。
  2. 发送端的响应

    • 发送方根据接收方通告的窗口大小来控制数据的发送。
    • 如果窗口大小减小,发送方必须减少数据的发送量,以避免超过接收方的处理能力。
  3. 零窗口通知

    • 当接收方的缓冲区已满,它会将窗口大小设置为0,通知发送方停止发送数据。
    • 发送方接收到零窗口通知后,将暂停数据传输,但会定期发送窗口探测数据段,以检查接收方是否还有空间接收数据
  4. 窗口探测

    • 发送方在接收到零窗口通知后,会定期发送小的数据段(通常只有1字节),以探测接收方的窗口大小是否已经更新。
    • 接收方响应这些探测,通告当前的窗口大小。
  5. 流量控制的实现

    • 流量控制的实现依赖于TCP的滑动窗口机制
    • 发送方维护一个滑动窗口,其右边界由接收方通告的窗口大小决定

3. 注意事项

  • TCP协议通过在TCP头部的“窗口大小”字段中设置接收端的缓冲区容量来实现流量控制。
  • 窗口大小的值越大,表示接收端能够处理更多的数据,从而可能提高网络的吞吐量。
  • 当接收端的缓冲区接近满载时,它会减小窗口大小的值,通过ACK通知发送端减慢发送速率。
  • 一旦接收端的缓冲区满了,它会将窗口大小设置为0,指示发送端暂停发送数据。此时,发送端虽然停止了数据传输,但会定期发送窗口探测数据段,以获取接收端关于窗口大小的最新信息,确保一旦缓冲区有空间,数据传输可以立即恢复。

流量控制是TCP协议中确保数据可靠传输的重要组成部分。通过动态调整发送速率以适应接收方的处理能力,流量控制机制有助于防止数据丢失和网络拥塞,从而提高网络通信的稳定性和效率。

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何处理AI模型中的“Gradient Vanishing”错误:优化训练技巧

如何处理AI模型中的“Gradient Vanishing”错误:优化训练技巧 🌑 如何处理AI模型中的“Gradient Vanishing”错误:优化训练技巧 🌑摘要引言“Gradient Vanishing”问题的成因分析 🤔1. 激活函数的选择2. 网络层数过深3…

【自动驾驶汽车通讯协议】SPI通讯:深入理解与应用

文章目录 0. 前言1. 工作原理2. 模式与配置2.1 CPOL (Clock Polarity)2.2 CPHA (Clock Phase)2.3 组合模式 3. 特性与优势4. 在自动驾驶汽车中的应用5. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见…

【MCGS学习-待更】

1、Mcgspro与mcgse区别&入门先学哪个合适? ? 2、软件下载 现在官网没有找到下载链接。 这个网盘里有学习资料: 昆仑通态Mcgspro学习笔记(V3.3.6)-CSDN博客 3、基础入门资料视频(待找) …

谷粒商城实战笔记-36-前端基础-Vue-介绍HelloWorld

文章目录 一,MVVM 思想直接操作DOM的示例使用Vue和MVVM的示例MVVM与DOM操作的主要区别 二,Vue 简介三,第一个Vue项目1 新建项目2 安装依赖3 使用Vue 这一节的主要内容是演示Vue的简单使用。 一,MVVM 思想 M:即 Model…

【电路笔记】-放大器的频率响应

放大器的频率响应 文章目录 放大器的频率响应1、概述2、定义3、电容器的影响4、低频响应5、高频响应6、总结1、概述 对于任何电子电路来说,放大器的行为都会受到其输入端子上信号频率的影响。 该特性称为频率响应。 频率响应是放大器最重要的特性之一。 在放大器设计的频率范…

凭什么赚钱?

我先说一个朴素的逻辑,赚钱的本质是交换,而交换的底层逻辑是需求。那么现在赚钱的公式就出来了,挖掘需求,找到人群,进行兜售。 而我们普遍意义上的赚钱,就分为两类,体力和脑力。脑力是高纬度的赚…

【C++】深入理解函数重载:C语言与C++的对比

文章目录 前言1. 函数重载:概念与条件1.1 什么是函数重载1.2 函数重载的条件1.3 函数重载的注意点 2. 函数重载的价值2.1 书写函数名方便2.2 类中构造函数的实现2.3 模板的底层实现 3. C语言与C的对比3.1 C语言不支持函数重载的原因3.2 C支持函数重载的原因 4. Linu…

2024.7.19 作业

1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…

机器人开源调度系统OpenTcs6-架构运行分析

系统启动 启动 Kernel&#xff1a;加载核心应用&#xff0c;初始化系统配置和状态。 启动 Plant Overview&#xff1a;加载图形用户界面&#xff0c;初始化模型和用户界面。 模型导入和配置 在 Plant Overview 中导入或创建工厂布局模型。 配置路径、位置和车辆信息。 车辆连…

C++迈向精通:STL设计机制之运算检查(含部分源码解析)

STL设计机制之支持运算检查 文章目录 STL设计机制之支持运算检查__STL_REQUIRES_LessThanComparable_STL_ERROR::__less_than_comparable_requirement_violation STL运算检查方法的特点do{...}while 的优点场景1场景2 __x __x 自己写一个运算检查 单说这个标题可能有点奇怪&am…

基于java的设计模式学习

PS &#xff1a;以作者的亲身来看&#xff0c;这东西对于初学者来说有用但不多&#xff0c;这些东西&#xff0c;更像一种经验的总结&#xff0c;在平时开发当中一般是用不到的&#xff0c;因此站在这个角度上用处不大。 1.工厂模式 1.1 简单工厂模式 我们把new 对象逻辑封装…

【VUE】v-if和v-for的优先级

v-if和v-for v-if 用来显示和隐藏元素 flag为true时&#xff0c;dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历&#xff0c;可以遍历数字对象数组&#xff0c;会将整个元素遍历指定次数 <!-- 遍…

【大数据】JSON文件解析,对其文本聚类/情感分析

目录 引言 JSON&#xff08;JavaScript Object Notation&#xff09; 文本聚类K-means 基本步骤 优点 缺点 实际应用 情感分析 核心任务与应用场景 算法原理与技术 json数据集 情感分析实现 文本聚类实现 引言 JSON&#xff08;JavaScript Object Notation&#…

从系统层面认识Linux及mysql中的多表查询

为什么计算机起始时间是1970年1月1日 为什么计算机起始时间是1970年1月1日-CSDN博客https://blog.csdn.net/csdn_kou/article/details/81535452 date "%Y-%m-%d %H:%M:%S" 查看日期 sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 在数据层面 CPU不…

Nacos Derby 远程命令执行漏洞(QVD-2024-26473)

0x01 产品简介 Nacos 是一个功能强大的服务注册与发现、配置管理平台,为微服务架构和云原生应用提供了重要的基础设施支持。 0x02 漏洞概述 由于Alibaba Nacos部分版本中derby数据库默认可以未授权访问,恶意攻击者利用此漏洞可以未授权执行SQL语句,最终导致任意代码执行。…

第三届智能机械与人机交互技术学术会议(IHCIT 2024)

【北航主办丨本届SPIE独立出版丨已确认ISSN号】 第三届智能机械与人机交互技术学术会议&#xff08;IHCIT 2024&#xff09; 2024 3rd International Conference on Intelligent Mechanical and Human-Computer Interaction Technology 2024年7月27日----中国杭州&#xff0…

敲详细的springframework-amqp-rabbit源码解析

看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开&#xff0c;springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念&#xff0c;这两个概念不注意区分容易混淆。…

Vatee万腾平台:智慧金融的创新引擎,驱动金融服务升级

在数字化浪潮席卷全球的今天&#xff0c;金融行业正经历着前所未有的变革与升级。Vatee万腾平台&#xff0c;作为智慧金融领域的创新先锋&#xff0c;正以其独特的技术优势、前瞻的战略布局和卓越的服务能力&#xff0c;成为推动金融服务升级的重要引擎。 智慧金融&#xff1a;…

一个关于STM32的DAC输出的遗忘点

众所周知熟练使用HAL库可以帮你解决不少stm32的开发难题&#xff0c;但是是谁让你陷入了这些难题&#xff0c;别问。 如上图所示&#xff0c;正常初始化这个模块后生成代码如下图所示&#xff1b; * DAC init function */ void MX_DAC_Init(void) {/* USER CODE BEGIN DAC_Ini…

2024年计算机软考中级【硬件工程师】面试题目汇总(附答案)

硬件工程师面试题汇总分析 1、解释一下同步电路和异步电路 解题思路 同步电路和异步电路是指同步时序电路和异步时序电路。由于存储电路中触发器的动作特点不同&#xff0c;因此可以把时序电路分为同步时序电路和异步时序电路两种。同步时序电路所有的触发器状态的变化都是在同…