TCP的窗口控制和重发控制【TCP原理(笔记三)】

news2024/11/26 18:23:57

文章目录

    • 利用窗口控制提高速度
    • 窗口控制与重发控制
      • 确认应答未能返回的情况
      • 某个报文段丢失的情况
    • 控制流

利用窗口控制提高速度

TCP以1个段为单位,每发一个段进行一次确认应答的处理,如图。这样的传输方式有一个缺点。那就是,包的往返时间越长通信性能就越低。
按数据包进行确认应答
为解决这个问题,TCP引入了窗口这个概念。即使在往返时间较长的情况下,它也能控制网络性能的下降。如图所示,确认应答不再是以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。
用滑动窗口方式并行处理
窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。在上图中,窗口大小为4个段。

这个机制实现了使用大量的缓冲区(缓冲区(Buffer)在此处表示临时保存收发数据的场所。通常是在计算机内存中开辟的一部分空间。) ,通过对多个段同时进行确认应答的功能。

如下图所示,发送数据中高亮圈起的部分正是前面所提到的窗口。在这个窗口内的数据即便没有收到确认应答也可以发送出去。此外,从该窗口中能看到的数据因其某种数据已在传输中丢失,所以发送端才能收到确认应答,这种情况也需进行重发。为此,发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。
滑动窗口方式
在滑动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。

收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。

窗口控制与重发控制

在使用窗口控制中,如果出现段丢失该怎么办?

确认应答未能返回的情况

首先,我们先考虑确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的。然而,在没有使用窗口控制的时候,没有收到确认应答的数据都会被重发。而使用了窗口控制,就如下图所示,某些确认应答即便丢失也无需重发。
没有确认应答也不受影响

TCP中的窗口控制机制可以使得即便某些确认应答丢失,发送方无需重发对应的数据。这是通过TCP的选择确认机制(Selective Acknowledgment,SACK)来实现的。

  • 在传统的TCP中,如果接收方收到乱序的数据段,它只会发送一个累积确认(Acknowledgment,ACK)来指示已经成功接收到哪些数据段,而没有指明丢失了哪些数据段。这样,发送方只能根据连续的确认来确定丢失的数据,并进行重传。
  • 然而,使用了SACK选项后,接收方可以在ACK中指明哪些数据段已经成功接收,同时也指明哪些数据段还未接收到。这样,发送方就知道了具体哪些数据段需要进行重传,而不必等待超时,提高了传输效率。
  • SACK选项提供了更精确的信息,使得发送方能够快速重传仅丢失的数据段,而不必重传已经成功接收的数据段。这样可以避免不必要的重传,减少网络拥塞和传输延迟,提高整体速度。
  • 需要注意的是,SACK选项并不是TCP的必需功能,它是一种可选的扩展。因此,对于不支持SACK的TCP实现或网络环境,仍然会使用传统的累积确认和超时重传机制。

某个报文段丢失的情况

其次,我们来考虑一下某个报文段丢失的情况。如图所示,接收主机如果收到一个自己应该接收的序号以外的数据时,会针对当前为止收到数据返回确认应答(不过即使接收端主机收到的包序号并不连续,也不会将数据丢弃而是暂时保存至缓冲区中。) 。

如图所示。当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,这个确认应答好像在提醒发送端“我想接收的是从1001开始的数据”。因此,在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答(之所以连续收到3次而不是两次的理由是因为,即使数据段的序号被替换两次也不会触发重发机制。) ,就会将其所对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制。
高速重发控制

如果接收主机收到一个自己应该接收的序号以外的数据时,它会针对当前为止已经成功接收到的数据返回确认应答,而不是针对异常数据。

  • TCP使用序号(Sequence Number)来标识每个传输的数据段,并使用确认序号(Acknowledgment Number)来确认已成功接收到的数据。当接收主机收到一个序号不匹配的数据段时,它会忽略该数据段,并发送一个确认应答,确认已经成功接收到的数据,即上一个正确的序号对应的数据。
  • 这种行为是为了通信的可靠性和协议的健壮性。通过确认已成功接收的数据,发送主机可以得知哪些数据已经被接收到,从而避免重复发送相同的数据。接收主机可以通过丢弃不匹配的数据段并返回确认应答来通知发送主机数据接收的状态。
  • 如果发送主机在一定时间内没有收到确认应答,它会认为发送的数据丢失,并重新发送相应的数据段,以确保数据的可靠传输。
  • 总结来说,当接收主机收到一个不匹配序号的数据时,它会针对当前为止已经成功接收到的数据返回确认应答,而不会针对异常数据。这种机制有助于确保TCP的可靠性和传输的正确性。

控制流

发送端根据自己的实际情况发送数据。但是,接收端可能收到的是一个毫无关系的数据包又可能会在处理其他问题上花费一些时间。因此在为这个数据包做其他处理时会耗费一些时间,甚至在高负荷的情况下无法接收任何数据。如此一来,如果接收端将本应该接收的数据丢弃的话,就又会触发重发机制,从而导致网络流量的无端浪费。

为了防止这种现象的发生,TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。在前面6.4.6节中所介绍的窗口大小的值就是由接收端主机决定的。

TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。

不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。这也就形成了一个完整的TCP流控制(流量控制)。

下图为根据窗口大小控制流量过程的示例。
控制流

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

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

相关文章

YOLO-V5分类实战系列 —— 调优自己的数据集+RK1808部署

YOLO-V5分类实战系列 —— 调优自己的数据集 1、保存训练和测试图片2、数据归一化3、数据增强3.1、数据增强库:albumentations3.2、数据增强库:torchvision 4、ONNX CPU 推理4.1、Pt 模型转为 ONNX4.2、ONNX 推理验证4.3、 ONNX CPU推理(C&am…

理解Deformable Convolution网络

1.简介 偶然了解到了可形变卷积这篇文章,看了几篇博文后大致了解的差不多了,但是有些细节还是看了代码之后才理解。这里想自己写一下关于这篇论文的了解,希望自己能够讲清楚。这里放一篇写的很好地博文链接,想更深入了解代码的可…

Gateway自定义过滤器——全局过滤器

一、什么是全局过滤器🍉 首先,我们要知道全局过滤器其实是特殊路由过滤器(特殊的GatewayFilter),会有条件地作用于所有路由。 为什么要自定义全局过滤器?就好比是看大门的保安大叔,平时主要是做好进出大门外来人员登记…

Chatglm实现agent控制

背景: 这个系列文章,会从LLM搭建应用生态角度来写。从0到1训练一个大的通用的模型对于大部分人和团队来讲是不现实的。重资金,重技术含量、重投入这几个门槛可以把很多团队直接劝退。那么在LLM蓬勃发展的时候我们可以做些什么呢,…

C语言程序设计——字符、字符串、内存函数

一、长度不受限的字符串函数 1. strlen size_t strlen(const char* str); 功能:求字符串长度 (1)字符串以\0作为结束标志,strlen函数返回的是在字符串中\0之前出现的字符个数(不包含\0)。 &#xff08…

【每日运维】大文件的分割与合并

产生背景 特殊单位需要将文件刻盘带入,并且刻盘有大小限制,所以有了这个需求 推荐方法 个人电脑上使用 split 命令指定大小分割Linux 服务上使用 cat 命令进行合并使用 md5sum 命令校验包的完整性 方法演示 需要将一个按照100M分割后刻盘导入 在个…

数据结构 ~ 树

什么是树 - tree 一种分层数据的抽象模型; 如:DOM、级联选择、树形控件,js 中没有树 可以用 Object 构建树: const tree {val: a,children: [{val: a-1,children: [{val: a-1-1,children: []}]},{val: a-2,children: [{val: a…

mapbox绘制多边形

1、实现效果 请忽略马赛克 2、实现思路 绘制一个填充的多边形,再描个边框。 3、实现代码 绘制多边形函数 drawPolygon() {map.addSource(maine, {type: geojson,data: https://asc-test1.oss-cn-beijing.aliyuncs.com/2023/07/05/45f6bd80f2f34d79b3e457b31ec5d…

云原生网关如何实现安全防护能力

作者:刘晓瑞(钰诚) 云原生网关:将安全、流量和微服务三合一 作为面向南北向的公网网关,使用 Waf 防护异常流量是很常规的需求,而且随着互联网环境变得越来越复杂,用户对防护的诉求是持续增强的,常规做法是…

需要我怎么帮你?关于维护Nutsdb开源社区的思考

背景 近来有人问我打算怎么继续维护Nutsdb社区,他们当中不乏有开源项目的狂热爱好者,发起了好几个几千star的开源项目,也有对Nutsdb感兴趣的,想来问问后续的计划。这不禁让我回想到从刚开始参与这个项目到最近这段时间一个人维护…

三维重建的工作

文章目录 一、北京:二、广州:三、深圳: 一、北京: 链接 三维重建技术是自动驾驶领域4D真值数据生成的核心基础能力。融合LiDAR、Camera、IMU、轮速计等传感器数据像BlockNeRF一样重建城市级别逼真精细的三维场景,将…

ArcGIS Pro 矢量数据的空间校正

GIS 数据通常来自多个源。当数据源之间出现不一致时,有时需要执行额外的工作以将新数据集与其余数据进行整合。相对于基础数据而言,一些数据会在几何上发生变形或旋转。 在编辑环境中,空间校正提供用于对齐和整合数据的交互式方法。 空间校正可执行的一些任务包括:将数据…

SQLite数据库安装

安装方式一: sudi apt-get install sqlite 安装方式二: https://www.sqlite.org/download.html 1. 把下载的文件 sqlite-autoconf-3420000.tar.gz 上传到开发板 2. tar xvf sqlite-autoconf-3420000.tar.gz 解压 3. cd sqlite-autoconf-3420000 进入…

[Mysql] 索引失效的情况详解~

一条查询语句走了索引和没走索引的查询效率是非常大的,但有很多情况导致我们的索引失去效果。这里总结一下常见的索引失效的情况~ 数据准备 我们准备一张简单的学生来做演示。 CREATE TABLE student (id int NOT NULL COMMENT id,name varchar(255) COLLATE utf8…

基于weka手工实现支持向量机smo算法

关于svm机器学习模型,我主要学习的是周志华老师的西瓜书(《机器学习》); 但是西瓜书中对于参数优化(即:Sequential Minimal Optimization,smo算法)部分讲解的十分简略,看…

Linux运维面试题(三)之shell编程类

Linux运维面试题(三)之shell编程类 文本截取有一个b.txt文本,要求将所有域名截取出来,并统计重复域名出现的次数统计当前服务器正在连接的IP地址,并按连接次数排序(cut不能以空格做分隔符) 随机…

Vis相关的期刊会议

中国计算机学会推荐国际学术会议和期刊目录 文档, 下载 link:CCF推荐国际学术刊物目录-中国计算机学会 一.可视化方向文章 1.IEEE VIS,是由 IEEE Visualization and Graphics Technical Committee(VGTC) 主办的数据可视化领域的顶级会议&a…

VMware桥接模式无法识别英特尔AX200无线网卡解决办法

1.先到英特尔网站下载最新驱动,更新网卡驱动适用于 Intel 无线网络卡的 Windows 10 和 Windows 11* Wi-Fi 驱动程序 2.到控制面板查看无线网卡属性是否有下图组件 没有的话,依次操作 安装---服务---添加---从磁盘安装----浏览--进入VMware安装目录&…

Linux系统的目录结构

目录 一、Linux系统使用注意 1、Linux严格区分大小写 2、Linux文件"扩展名" 3、Linux中所有内容以文件形式保存 4、Linux中存储设备都必须在挂载之后才能使用 二、目录结构 1、Linux分区与Windows分区 2、Linux系统文件架构 3、Linux系统的文件目录用途 一、…

Docker【安装与基本使用】

【1】Docker的安装 注意:如果之前安装过docker其他版本,请删除干净。 docker-01 10.0.0.51 2G docker-02 10.0.0.52 2G docker-01 [rootdocker-01 ~]# cp -rp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cp: overwrite ‘/etc/localtime’? …