TCP_滑动窗口介绍

简介

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.mzph.cn/news/237797.shtml

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

相关文章

决策树相关算法_ID3_C45_信息熵_剪枝

决策树算法的主要思想源于Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及由Breiman等人在1984年提出的CART算法,其主要优点是: 可读性;分类速度快。 决策树学习通常包括3个步骤: 特征选择;决策树…

推荐几个靠谱的视频素材网站,让你的作品更吸引人~

视频素材是视频制作的重要组成部分,它可以提升视频的质量,增加视频的吸引力,让你的视频更容易获得观众的喜爱和关注。如果你想往视频行业发展,或者只是想做一个视频自媒体,那么你一定会遇到一个问题:视频素…

应用在水箱液位检测中的电容传感芯片

水箱水位检测原理通常包括使用传感器来检测水位的变化。常见的传感器类型包括液位开关、液位计和液位传感器。液位开关是一种简单的传感器,它可以检测水位是否达到预定的高度。当水位升高时,开关会打开;当水位降低时,开关会关闭。…

2023年全球架构师峰会(ArchSummit北京站2023)-核心PPT资料下载

一、峰会简介 ArchSummit聚焦业界强大的技术成果,秉承“实践第一、案例为主”的原则,展示先进技术在行业中的典型实践,以及技术在企业转型、发展中的推动作用。旨在帮助技术管理者、CTO、架构师做好技术选型、技术团队组建与管理&#xff0c…

pip 常用指令 pip help 命令用法介绍

📑pip 常用命令归类整理 pip help 是一个用于获取 Python 包管理器 pip 的帮助信息的命令。它可以帮助我们了解 pip 的各种命令和参数的用法。 pip help 命令的参数主要包括 pip 的各种子命令,例如 install、uninstall、freeze、list 等。你可以使用 p…

MATLAB中var函数用法

目录 语法 说明 示例 矩阵方差 数组方差 指定方差权重向量 指定方差的维度 数组页的方差 排除缺失值的方差 方差和均值 var函数的功能是求取方差。 语法 V var(A) V var(A,w) V var(A,w,"all") V var(A,w,dim) V var(A,w,vecdim) V var(___,nanfla…

【HTML】使用js给input标签增加disabled属性

目录 1.常规text标签 2.radio标签 1.常规text标签 在JavaScript中,您可以通过修改元素的属性来给input标签增加disabled属性。这可以通过使用setAttribute方法来完成。以下是一个简单的例子: // 假设您的input元素的id是myInput var inputElement doc…

springboot(ssm智慧生活商城系统 网上购物系统Java系统

springboot(ssm智慧生活商城系统 网上购物系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0) 数…

2022复盘2023规划(技术篇)

2022复盘&2023规划(技术篇) 说明: 以下是我对我自身知识掌握度的分级解释 Lv0 简单了解技术点的应用场景 Lv1 前端: 掌握基础知识,能进行简单组件的开发与页面绘制; 后端: 掌握知识点基础&a…

力扣 | 136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入&#xff1a…

Fabric:使用GoLand+Fabric-SDK-Go操作Fabric网络

遇到bug, 未完待续!!! 写在最前 前序博客已经介绍了使用命令的方式在Fabric上创建通道以及部署执行链码的方法,但这个过程太繁琐,尤其是当Fabric网络中peer节点和组织Org过多时,需要频繁的更改环境变量。 Hyperledger Fabric官方提供了Fabri…

Ubuntu 22.04 LTS上安装Docker-ce

在Ubuntu 22.04 LTS上安装Docker-ce Docker是一个开源平台,用于自动化应用程序的部署、扩展和管理。它使用容器技术,使开发、测试和部署过程更加简化和可靠。本文将介绍在Ubuntu 22.04 LTS上安装Docker-ce的步骤。 步骤1:更新软件包列表 …

5~80V降5V 0.3A同步整流降压型DC-DC转换器-AH7550

AH7550是一种TEL:l86*4884*3702*高压、高效率的同步整流降压型DC-DC开关转换器,恒定120KHz开关频率,输出电流能力高达0.6A,AH7550支持5V~80V的宽输入操作电压范围,同时支持最大占空比90%输出,芯片内置环路补…

小型家用超声波清洗机适合清洗眼镜吗?小型超声波清洗机排行榜

在快节奏的现代生活中,我们的眼睛时常与各种物品接触,如眼镜、隐形眼镜等。为了保持眼睛的健康和舒适,定期清洗眼镜变得尤为重要。而随着科技的发展,小型家用超声波清洗机逐渐进入人们的视野,它能否成为我们清洗眼镜的…

学生备考护眼灯什么牌子好推荐?高性能护眼台灯推荐

作为一名电器测评师,对各类电器好物都了解得比较多,最近也会被很多的人询问护眼台灯哪个牌子好,问其原因才知很多的人有使用护眼台灯出现眼睛酸痛刺眼的现象,这是因为使用了不专业护眼台灯导致的,一般这类护眼台灯使用…

基于springboot的日记本系统源码+数据库+安装使用说明

之前写的SpringBoot日记本系统备受好评,考虑到还是有很多小伙伴不会部署,所以这一篇文章就单独来讲一下部署步骤吧。 需要资源 idea(破不破解都行) MySQL(最好5.7以上版本,最好8.0) Navicat…

Linux中一些知识积累(持续补充)

如何安装Eigen3库? 在linux中直接命令安装。Eigen/Dense 是 Eigen 库中的一个模块,提供了对密集矩阵(Dense Matrix)的支持。 sudo apt install libeigen3-devLinux 中VScode中运行C时,gdb 的Launch与Attach有什么区别…

C/C++ 获取系统时间time_t的使用

time_t:它通常是一个长整型(long int),用于表示从特定参考点(通常是 1970年1月1日00:00:00UTC)经过的秒数。这被广泛用作时间戳。 但是time_t获取的时间是一个长整型,可以通过ctime()函数将其转…

K8S 为什么关闭 SELinux 和交换内存

在学习搭建 K8S 环境和使用 K8S 时,所有教程必然会提到的事情就是关闭节点的 SELinux 和交换内存,如同自然规律一样。 那么为什么会有这样的要求呢? 交换内存 计算机的物理内存是有限的,而进程对内存的使用是不确定的&#xff…

js let 和 var 的区别

在 JavaScript 中,let 和 var 都是用来声明变量的关键字,但它们之间存在一些重要的区别: 作用域(Scope):var 在声明变量时具有函数级作用域,这意味着在函数内部用 var 声明的变量在整个函数内部…