【探索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…

Python补充前文未述知识

函数名说明 chr(x) 将对应的字符转换为ASCII编码,也可以将整数x转换为一个字符ord(x)将对应的字符转换为unicode编码(包括中文)bin(x)将一个整数x转换为一个二进制字符串oct(x)将一个整数x转换为一个八进制字符串hex(x)将一个整数x转换为一个…

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

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

Linux 之 awk命令详解

Linux命令详解:巧妙使用awk命令进行文本处理 基本用法 常用功能 1. 打印指定列 2. 使用分隔符 3. 条件过滤 4. 格式化输出 高级功能 1. 使用BEGIN和END块 2. 内置变量 3. 自定义函数 实战案例 总结 Linux命令详解:巧妙使用awk命令进行文本处…

力扣 217. 存在重复元素,389. 找不同,705. 设计哈希集合,3. 无重复字符的最长子串,139. 单词拆分

217. 存在重复元素 题目 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 AC代码 class Solution { public:bool containsDuplicate(vector<int>& nums) {// …

Shell 构建flutter + Android 生成Apk

具体步骤 #shell 具体实现和说明如下: echo "build_start_apk!" echo "编译此脚本的前提条件如下:" #在Android 项目的主工程下,进入主工程文件夹,创建build-android 文件夹,在其文件夹下有build-android.sh文件,此文件就是整个文章的脚本内容(…

【MCGS学习-待更】

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

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

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

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

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

凭什么赚钱?

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

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

文章目录 前言1. 函数重载&#xff1a;概念与条件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-&…

JAVA集合和数组转换

阿里规约 4.【强制】使用集合转数组的方法&#xff0c;必须使用集合的toArray(T[]array)&#xff0c;传入的是类型完全一样的数组&#xff0c;大小就是list.size()。 说明&#xff1a;使用toArray带参方法&#xff0c;入参分配的数组空间不够大时&#xff0c;toArray方法内部将…

机器人开源调度系统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;会将整个元素遍历指定次数 <!-- 遍…

Provider(6) - Reformat和ClampBufferProvider

ReformatBufferProvider和ClampFloatBufferProvider 简介 ReformatBufferProvider就是用于转换输入和输出的数据format不一致&#xff0c;比如输入是float、输出是int32_t&#xff1b; ClampFloatBufferProvider则是将float类型的音频数据其能量限制在[-3dB&#xff0c;3dB]…

【大数据】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不…