TCP_滑动窗口介绍

news/2024/5/20 8:06:14 标签: tcp/ip, 滑动窗口

简介

TCP协议中有两个窗口,滑动窗口和拥塞窗口,两者均是一种流控机制;滑动窗口是接收方的流控机制,拥塞窗口是发送方的流控机制。
本文介绍滑动窗口,接收方为TCP连接设置了接收缓存。当TCP连接接收到正确、按序的字节后,会将其放入到接收缓存中,相应的程序从缓存中接收数据。

下图是接收缓存的示意图,其中LastByteRcvd表示从网络中接收并已存入缓存的数据流的最后一个字节编号,LastByteRead是应用进程从缓存中读取的数据流的最后一个字节编号;
接收窗口(rwnd) = receive buffer - (LastByteRcvd - LastByteRead)
在这里插入图片描述

接收窗口,表示接收方当前可接收的数据容量的上限;接收方会将该信息同步给发送方,以使发送方基于该信息协调发送速度,以防止发送速度过快或者过慢而导致的资源损耗。
接收方、发送方均会维护该窗口信息,分别称为接收窗口(rwnd)和发送窗口(swnd);发送窗口(的大小),我们可以理解为接收窗口的一个快照,一个同步有时延的快照。由于他们在处理数据过程中像窗口一样在滑动,故统称为滑动窗口

ps:如果启用了SACK机制,接收方接收到的数据不连续的情况下,rwnd需要包含空隙的大小。RFC中并未明确规定对于乱序的数据包如何处理(丢弃或缓存),即使未启用SACK机制,某些实现可能也会缓存下来。

用途

  • 流量控制;防止发送方过快的发送数据,超出接收方的处理能力,无效的传输导致资源损耗;
  • 提高吞吐量:定义发送方可允许的最大在途流量(即连续发送的数据量),从而提高数据传输的吞吐量;(和拥塞窗口共同协作来控制发送速度)

实现方式

滑动窗口包括发送窗口(send window)和接收窗口(receive window),其实现涉及两个关键参数:窗口大小和确认机制;
窗口大小,表示可以连续发送或接收的数据量,通过动态调整窗口大小,来控制传输效率。
确认机制,接收方通过发送确认信息来告知发送方已经成功接收的数据范围。

发送窗口示意图如下:
在这里插入图片描述
在这里插入图片描述

接收窗口示意图如下:
在这里插入图片描述
在这里插入图片描述

名词解释:
在这里插入图片描述

窗口大小的通告过程

由于tcp是全双工通讯,通讯双方互为发送、接收方,在交互过程中均会通告其接收窗口的大小;
tcp header中,有两个参数和滑动窗口大小有关,它们是window和window scale;
window在每个报文中会进行通告;
window scale只会在syn报文中进行协商,但对自身(syn报文)不生效,只对后面的报文生效;发送方如果支持window scale机制,在发起syn请求时会携带该信息并填写不为0的值,当接收方在syn+ack报文中同样携带该参数且值不为0,说明双方均支持该机制,参数生效;

真实接收窗口大小 = Window * 2^window_scale;如果不支持window scale机制,则使用Window的值;
下图体现了window scale协商过程,也包含了窗口大小调整的现象;
在这里插入图片描述

调整和流控

下图是窗口大小调整的过程,当接收方来不及处理时,通过调整接收窗口的大小以达到限流的目的。
在这里插入图片描述

零窗口(zero window)

零窗口(Zero Window)是指在TCP通信中,接收端通知发送端其当前没有足够的缓冲区空间来接收更多的数据,从而将接收窗口设置为0的一种状态。

当接收端的滑动窗口大小变为0时,它会向发送端发送一个窗口更新报文段,其中包含了窗口大小为0的信息。

出现零窗口的原因可能是:

  1. 接收端的应用程序来不及处理接收到的数据;这可能是因为应用程序正在执行其他任务,或者因为应用程序本身的处理速度较慢。

  2. 接收端希望暂停数据接收;在某些情况下,接收端可能会主动要求停止数据传输,例如为了释放网络资源或进行其他操作。

当发送端接收到零窗口通告后,它会采取以下行动:

  1. 停止发送新的数据段,直到接收端重新打开窗口;

  2. 启用坚持定时器(Persist Timer),该定时器定期向接收端发送探测报文,询问是否可以继续发送数据。这些探测报文被称为“窗口探测”或“零窗口探测”。

零窗口状态是一个重要的TCP流量控制机制,通过这种方式,发送端可以避免在接收方拥塞时继续发送数据,导致更多的丢包和重传。

在这里插入图片描述

糊涂窗口综合症(Silly Window Syndrome)

糊涂窗口综合症(Silly Window Syndrome, SWS)是指一种低效率的数据传输现象。

它可以出现在接收、发送端的任何一方。当接收方可以通告一个小窗口,发送方可以选择发送少量的数据,这种情况下数据有效载荷率很低,大部分网络带宽被用于传输头部信息。
在这里插入图片描述

下图是一个接收方通告小窗口的示例:

在这里插入图片描述

糊涂窗口综合征通常可以通过以下方式解决:

  1. 发送端避免发送太小的数据段,例如通过Nagle算法合并小数据段;

  2. 接收端尽可能增大其接收窗口,以便能够处理更大的数据段;

  3. 使用TCP的延迟确认机制来减少不必要的确认消息。

参考资料

  • The TCP/IP Guide.
  • tcp rfc.
  • 《计算机网络*自顶向下方法》

http://www.niftyadmin.cn/n/5279220.html

相关文章

esp32-s3训练自己的数据进行目标检测、图像分类

esp32-s3训练自己的数据进行目标检测、图像分类 一、下载项目二、环境三、训练和导出模型四、部署模型五、存在的问题 esp-idf的安装参考我前面的文章: esp32cam和esp32-s3烧录human_face_detect实现人脸识别 一、下载项目 训练、转换模型:ModelAssist…

RocketMQ的Docker镜像部署(以及Dashboard的部署、ACL配置)

RocketMQ的Docker镜像部署(以及Dashboard、ACL) 准备 包含RocketMQ部署(NameServer、Broker)、Dashboard、ACL拉取镜像 RocketMQ$ docker pull apache/rocketmq:5.1.4Dashboard$ docker pull apacherocketmq/rocketmq-dashboard…

uni-app上传音频,图片步骤

在uni-app中,上传音频和图片通常需要借助小程序的API来完成。下面是一个简单的步骤: 上传图片 首先,你需要使用uni.chooseImage方法从相册或相机中选择图片文件。然后,利用选择的图片路径来调用小程序的uni.uploadFile方法进行上…

谈谈微服务的Ribbon知识点

Ribbon负载均衡 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。(负载均衡RestTemplate调用),在服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单。 Configuration…

Unity中Shader缩放矩阵

文章目录 前言一、直接相乘缩放1、在属性面板定义一个四维变量,用xyz分别控制在xyz轴上的缩放2、在常量缓存区申明该变量3、在顶点着色器对其进行相乘,来缩放变换4、我们来看看效果 二、使用矩阵乘法代替直接相乘缩放的原理1、我们按如下格式得到缩放矩阵…

Kafka集群架构原理(待完善)

kafka在zookeeper数据结构 controller选举 客户端同时往zookeeper写入, 第一个写入成功(临时节点), 成为leader, 当leader挂掉, 临时节点被移除, 监听机制监听下线,重新竞争leader, 客户端也能监听最新leader leader partition自平衡 leader不均匀时, 造成某个节点压力过大, …

系统活动报告器 :sar 优化性能 | 解读系统运行状态

sar:系统活动报告器 sar 是 System Activity Reporter 的缩写,是一个系统性能监视工具,用于收集、报告以及分析系统的活动信息。能够收集系统各种资源的使用情况,如CPU利用率、内存使用、磁盘I/O等,并将这些信息保存在…

【mysql】MySQL的binlog在数据仓库中的应用

在当今的大数据时代,数据仓库是一个不可或缺的部分。它是一个集中式存储和管理的平台,用于存储、管理和分析大量的数据,以支持决策制定和业务操作。在数据仓库的应用中,MySQL的binlog(二进制日志)扮演着重要的角色。 本文将探讨MySQL的binlog在数据仓库中的应用,包括以…