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.
  • 《计算机网络*自顶向下方法》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis3系列课程8-带参数查询

简介 上节课内容中讲解了查询全部, 不需要带条件查, 这节我们讲讲 带条件查询 目标 1. 带一个条件查询-基本数据类型 2.带两个条件查询-连个基本数据类型 3.带一个对象类型查询 为了实现目标, 我们要实现 按照主键 查询某个学生信息, 按照姓名和年级编号查询学生信息 按照学生…

MyBatis中延迟加载,全局和局部的开启使用与关闭

文章目录 MyBatis中延迟加载,全局和局部的开启使用与关闭1、问题提出2、延迟加载和立即加载延迟加载立即加载 3、三种对应的表关系中的加载4、打开全局延迟加载(实现一对一的延迟加载)5、实现一对多的延迟加载(将上面设置的全局延…

渲染控制之条件渲染

目录 1、使用规则 2、更新机制 3、使用if进行条件渲染 4、if ... else ...语句和子组件状态 5、嵌套if语句 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。 1、使用规则 支持if、else和else if语句…

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

📑pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包,以及它们的版本号。 pip list 命令有以下参数 -o, --outdated:列出所有过时的包,即有新版本可用的包。-u, --uptod…

DPDK单步跟踪(3)-如何利用visual studio 2019和visual gdb来单步调试dpdk

准备工作 因为时间的关系,我想到哪说到哪,可能没那么高的完成度。 但其实有心的人,看到这个标题,就关了本文自己能做了。 why和how to build debug version DPDK,见前两篇。这里我们准备开始。 首先,你有一台linux机…

什么是“人机协同”机器学习?

“人机协同”(HITL)是人工智能的一个分支,它同时利用人类智能和机器智能来创建机器学习模型。在传统的“人机协同”方法中,人们会参与一个良性循环,在其中训练、调整和测试特定算法。通常,它的工作方式如下…

《软件方法(下)》8.2.4 类和属性的命名

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.2 建模步骤C-1 识别类和属性 8.2.4 类和属性的命名 8.2.4.2 关于DDD话语中的“通用语言” DDD(领域驱动设计)话语中有“通用语言(Ubiquitous L…

【JAVA面试题】什么是代码单元?什么是码点?

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 目录 目录 前言 思路 代码单元(Code Unit): 码点(Code Point): 作…

vscode | python | remote-SSH | Debug 配置 + CLIP4Clip实验记录

安装Extension 本地安装Remote-SSH、python 远程服务器上安装Python 难点:主机和远程服务器上安装Python扩展失败,可能是网络、代理等原因导致解决方法: 主机在官方网站下载Python扩展:https://marketplace.visualstudio.com/it…

RobotFramework 自动化测试实战进阶篇

工具 Robotframework, 采用PO设计模式 PO模型 PO模型即Page Objects,直译意思就是“页面对象”,通俗的讲就是把一个页面,或者说把一个页面的某个区域当做一个对象,通过封装这个对象可以实现调用。 PO设计的好处 代码复用&…

【沁恒蓝牙mesh】CH58x DataFlash 详解

本文主要介绍了 沁恒蓝牙芯片 CH58x 的 DataFlash 分区以及读写操作以及原理 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页:欢迎访问我的 Ethernet_Comm 博…

P3375 【模板】KMP

【模板】KMP 题目描述 给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​,若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同,则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了,其出现位置为 l l l。 现在请你求…

链表常见题型(1)

1.反转链表 1.1反转链表 如果我们想要反转链表,那应该有head的next指针指向空,其余结点的next指针反过来,指向它的上一个结点,那我们在执行该操作的时候就需要定义变量cur(current)表示我们当前遍历到的结点,变量pre(…

Linux应用程序管理(rpm yum 源码安装)

一.Linux应用程序基础 当我们主机安装Linux操作系统时候,也会同时安装一些软件或网络服务等等,但是随着系统一起安装的软件包毕竟他是少数的,能够实现的功能也是有限的,如果需要实现更丰富的功能,那就需要安装应用程序…

vue2 el-table 行按钮过多,按钮超出指定个数,显示为下拉菜单(简单的自定义组件)01

vue2 el-table 行按钮过多&#xff0c;按钮超出指定个数&#xff0c;显示为下拉菜单&#xff08;简单的自定义组件01&#xff09; 上图 优化前 按钮太多不美观 优化后 默认展示三个按钮 超出显示下拉菜单 上代码 封装按钮组件 OperateBtn.vue // OperateBtn.vue<templ…

【Linux】归档和备份

简介 计算机系统管理员的一个主要任务就是保护系统的数据安全&#xff0c;其中一种方法是通过时时备份系 统文件&#xff0c;来保护数据。即使你不是一名系统管理员&#xff0c;也经常会处理大量文件&#xff0c;在这里我们看看常见的管理文件集合命令。 压缩命令&#xff1a…

2016年第五届数学建模国际赛小美赛A题臭氧消耗预测解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 A题 臭氧消耗预测 原题再现&#xff1a; 臭氧消耗包括自1970年代后期以来观察到的若干现象&#xff1a;地球平流层&#xff08;臭氧层&#xff09;臭氧总量稳步下降&#xff0c;以及地球极地附近平流层臭氧&#xff08;称为臭氧空洞&#x…

十.MySQL数据类型精讲(二)

MySQL数据类型精讲 6.日期与时间类型6.1YEAR类型6.2DATE类型6.3TIME类型6.4DATETIME类型6.5TIMESTAMP类型6.6开发经验 7.文本字符串类型7.1CHAR与VARCHAR类型7.2TEXT类型 8.ENUM类型9.SET类型10.二进制字符串类型11.JSON类型12.空间类型13.小结及选择建议 6.日期与时间类型 日…

Gartner2023数据库魔力象限发布 阿里云依旧领导者 腾讯退出 EDB/Yugabyte进入

这是一个跨越数年的系列&#xff0c;历史文章参考&#xff1a; * 数据库魔力象限2022&#xff1a;阿里领先、腾讯再次进入 * 2021 藏在魔力象限中的数据库江湖 * Gartner云计算魔力象限2018 概述 Gartner云数据库魔力象限&#xff08;后简称“象限”或“MQ”&#xff09;一…

【数据结构之单链表】

数据结构学习笔记---003 数据结构之单链表1、什么是单链表?1.1、概念及结构 2、单链表接口的实现2.1、单链表的SList.h2.1.1、定义单链表的结点存储结构2.1.2、声明单链表各个接口的函数 2.2、单链表的SList.c2.2.1、遍历打印链表2.2.2、销毁单链表2.2.3、打印单链表元素2.2.4…