TCP滑动窗口

TCP滑动窗口(Sliding Window)

什么是滑动窗口?

TCP滑动窗口是TCP协议中的一种流量控制机制,用于调节发送方和接收方之间的数据传输速率,以避免网络拥塞和提高传输效率

滑动窗口机制允许发送方在不等待确认应答的情况下连续发送多个数据段,从而提高了网络的利用率。

TCP为什么使用滑动窗口?

我们都知道TCP是每发送一个数据包,都要进行一次ACK确认应答。当上一个数据包收到了ACK应答了再发送下一个。

为解决这个问题,TCP引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。

那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。

窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

假设窗口大小为3个TCP 段,那么发送方就可以「连续发送」3个TCP段,并且中途若有 ACK 丢失,可以通过「下一个ACK进行确认」。

在这里插入图片描述

图中的ACK 600确认应答报文丢失,也没关系,因为可以通过下一个确认应答进行确认,只要发送产收到了ACK 700确认应答,就意味着700之前的所有数据「接收方」都收到了。这个模式就叫累计确认。

发送方的滑动窗口

在这里插入图片描述

#1 是已发送并收到 ACK确认的数据:1~31 字节
#2 是已发送但未收到 ACK确认的数据:32~45 字节
#3 是未发送但总大小在接收方处理范围内(接收方还有空间):46~51字节#4 是未发送但总大小超过接收方处理范围(接收方没有空间):52字节以后

在下图,当收到之前发送的数据3236字节的ACK确认应答后,如果发送窗口的大小没有变化,则滑动窗口往右边移动5个字节,因为有5个字节的数据被应答确认,接下来5256字节又变成了可用窗口,那么后续也就可以发送52~56 这5个字节的数据了。

窗口大小如何确定?

TCP头里有一个字段叫Window,也就是窗口大小。

这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来

所以,通常窗口的大小是由接收方的窗口大小来决定的
发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。

窗口大小计算

TCP滑动窗口方案使用三个指针来跟踪在四个传输类别中的每一个类别中的字节。其中两个指针是绝对指针(指特定的序列号),一个是相对指针(需要做偏移)。

  • SND.WND:表示发送窗口的大小(大小是由接收方指定的)
  • SND.UNA(Send Unacknoleged):是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。
  • SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号,也就是 #3 的第一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 SND.UNA 指针加上SND.WND 大小的偏移量,就可以指向 #4 的第一个字节了。

那么可用窗口大小的计算就可以是:

可用窗口大小=SND.WND-(SND.NXT-SND.UNA)=20-(46-32)=6

接收方的滑动窗口

在这里插入图片描述

接收窗口相对简单一些,根据处理的情况划分成三个部分:

  • #1 + #2)是已成功接收并确认的数据(等待应用进程读取)
  • #3 是未收到数据但可以接收的数据
  • #4 未收到数据并不可以接收的数据

其中三个接收部分,使用两个指针进行划分:

  • RCV.WND:表示接收窗口的大小,它会通告给发送方。
  • RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号,也就是 #3的一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 RCV.NXT 指针加上 RCV.WND 大小的偏移量,就可指向 #4 的第一个字节了。

接收窗口和发送窗口的大小是相等的吗?
并不是完全相等,接收窗口的大小是约等于发送窗口的大小的。

因为滑动窗口并不是一成不变的。比如,当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。那么新的接收窗口大小,是通过TCP报文中的Window字段来告诉发送方。那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系,

出现“空洞“如何处理?

  1. 假设有一组数据通过TCP传输,TCP先将其分成若干段,假设有四个段seg1,seg2seg3,seg4,依次发送出去,此时假设接收端接收到了seg1、seg2、seg4;
  2. 此时接收端的行为是回复一个ACK包说明已经接收到,并将seg4进行缓存(保证顺序,产生一个seg3的hole空洞)
  3. 发送端收到ACK之后,就会将对应的数据包变为已确认状态,这个时候窗口向右移动;
  4. 假设接收端通告的WindowSize仍然不变,此时窗口右移,产生一些新的空位,这些是接收端允许发送的范畴:
  5. 对于丢失的seg3,如果超过一定时间,TCP就会重新传送**(重传机制)**,重传成功会seg3、seg4一块被确认,不成功,seg4也将被丢弃。
    新的空位,这些是接收端允许发送的范畴:
  6. 对于丢失的seg3,如果超过一定时间,TCP就会重新传送**(重传机制)**,重传成功会seg3、seg4一块被确认,不成功,seg4也将被丢弃。

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

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

相关文章

main中的int argc, char* argv[],命令行调用函数时输入参数用的

int argc:表示命令行参数的数量。argc 至少为1,因为第一个参数总是程序的名称。char* argv[]:是一个字符指针数组,用于存储每个命令行参数的字符串。argv[0] 是程序的名称,argv[1] 是第一个参数,依此类推。…

Vue 批量注册组件实现动态组件技巧

介绍 Vue 动态组件的应用场景很多,可应用于动态页签,动态路由等场景,其核心原理是批量注册。在Vue2和Vue3中实现原理相同,只是语法略有差异。 Vue2 实现 基于 webpack require.context() 是webpack提供的一个自动导入的API 参数1:加载的文件目录 参数2&#xff…

仓储管理系统-综合管理(源码+文档+部署+讲解)

本文将深入解析“仓储管理系统-综合管理”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 仓储管理系统-综合管理是一个全面的仓库管理解决方案,旨在通过集成多种功能模块来优化仓库操作和管理流程。该系统提供了…

xxl-job 是如何注册、注销、维持存活态

我们通过源码发现,xxl-job主要是由客户端发起的注册和存活上报(心跳检测)的; 主要是执行器在启动时,会初始化一个线程,每隔30秒请求调度中心接口,维护存活状态; 注册接口/上报接口:/api/regis…

Ps:OpenColorIO 设置

Ps菜单:编辑/OpenColorIO 设置 Edit/OpenColorIO Settings 在专业的图像编辑和色彩管理工作流程中,准确的色彩呈现和转换至关重要。OpenColorIO(OCIO) 是一种开源的色彩管理框架,广泛应用于影视、动画和视觉特效行业。…

如何抓取某大学网站专业录取分数

当我们在浏览器中浏览网页时,网页上显示的数据实际上已经被加载到浏览器内存中,只是以一种可视化的方式呈现出来。那么是否有一种简便的方法可以将这些数据从网页中提取出来,并保存为表格格式呢? 这是某大学的专业分数录取情况数…

举例理解LSM-Tree,LSM-Tree和B+Tree的比较

写操作 write1:WAL 把操作同步到磁盘中WAL做备份(追加写、性能极高) write2:Memtable 完成WAL后将(k,v)数据写入内存中的Memtable,Memtable的数据结构一般是跳表或者红黑树 内存内采用这种数据结构一方面支持内存…

JAVA开源项目 微服务在线教育系统 计算机毕业设计

博主说明:本文项目编号 T 060 ,文末自助获取源码 \color{red}{T060,文末自助获取源码} T060,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

深入浅出《钉钉AI》产品体验报告

1. 引言 随着人工智能技术的迅猛发展,企业协同办公领域迎来了新的变革。钉钉作为阿里巴巴集团旗下的企业级通讯与协同办公平台,推出了钉钉AI助理,旨在提高工作效率,优化用户体验。本报告将对钉钉AI助理进行全面的产品体验分析&am…

揭开基础动销方案的神秘面纱

在如今竞争激烈的市场大环境下,产品实现有效动销可谓是企业生存发展的关键所在。而基础动销方案,正是推动产品销售的重要利器。 基础动销方案到底是什么呢?它指的是企业为促进产品销售,运用一系列营销手段和策略,提升产…

YOLO v5 Series - Image Comparison

图像相似度 Image Similarity 图片差异度 Image Dissimilaritypuzzle-diff pacman -S autoconf automake base-devel libtool pacman -S mingw-w64-x86_64-libgdautogen /opt/admin/libpuzzle>./configure configure: loading site script /etc/config.site che…

sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!

Less-5 上来先进行查看是否有注入点,判断闭合方式,查询数据列数,用union联合注入查看回显位,发现到这一步的时候,和前四道题不太一样了,竟然没有回显位??? 我们看一下源…

InnoDB引擎

6.1 逻辑存储结构 InnoDB的逻辑存储结构如下图所示: 6.2 架构 6.2.1 概述 MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下面是InnoDB架构图,左侧为内存结…

C#与C++交互开发系列(二十二):跨进程通信之使用基于HTTP协议的REST风格的API

1. 前言 REST API(Representational State Transfer Application Programming Interface)是一种基于HTTP协议的通信方式,广泛用于网络服务和分布式应用程序之间的通信。通过REST API,可以让C#和C应用程序进行跨进程、甚至跨平台的…

想让三维模型与实时视频融合?这款软件值得一试

视频融合,是指将视频数据投影到地理特征表面,并通过相应姿态参数控制投影效果的一种三维展示方式,实现了三维模型与实时视频的融合。 四维轻云是一款轻量化的地理空间数据管理云平台,支持地理空间数据的在线管理、编辑以及分享。…

汉化版WinHex和CFF Explorer下载及程序脱壳后修复,重建引入表,修改程序PE文件(附下载链接)

前言 现有一个加壳程序,要求对程序脱壳,需要修复脱壳后的程序 使用PEiD查壳,显示为NsPack 1.4 -> Liuxingping [Overlay] * 先定位程序的OEP,使用od打开程序,看到有压入栈的操作 进行查找,查找命令序列…

STM32F407简单驱动步进电机(标准库)

配置 单片机型号:STM32F104ZGT6 步进电机:YK28HB40-01A 驱动器:YKD2204M-Plus 接线方式: pu:接对应的产生PWM的引脚,这里接PF9,对应TIM14_CH1通道! pu-:接单片机的G…

linux-DNS解析

dns解析 dns:域名系统,将域名和ip地址互相映射的一个分布式的数据库,方便用户访问互联网。 ip地址:是所有设备和网站在互联网上的唯一地址,通信一定是ip和ip之间的通信。 dns解析:根据域名在互联网当中找…

光伏电站容量计算方法科普

光伏电站的容量计算是设计和评估光伏系统性能的关键步骤。通过了解光伏电站的容量,我们可以预估其发电量,优化系统设计,并确保系统能满足电力需求。本文将详细介绍几种常见的光伏电站容量计算方法,并特别介绍小程序“光伏一点通”…

采集opc da 转 profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 应用条件 2 4 查看OPC DA服务器的相关参数 2 5 配置网关采集opc da数据 4 6 用profinet IO协议转发数据 6 7 在服务器上运行仰科OPC DA采集软件 9 8 案例总结 11 1 案例说明 在OPC DA服务器上运行OPC DA client软件查看OPC DA服务…