TCP中窗口和滑动窗口的含义以及流量控制

news2025/1/20 10:45:09

一.窗口

        

         在TCP中由于要保证可靠性,所以每发送一条数据后,都需要接收方返回一条应答报文,要是我们每发送一条数据,发送方就等待接收应答报文,收到之后再去发送下一条数据,这样我们就会花费大量的时间在等待应答报文上,效率是很低下的

        所以TCP中有了窗口的概念,TCP在发送数据的时候会一次性发送一组数据,发送这一组数据的过程中不用等待ACK(应答报文),就直接往接收方发,而窗口大小就是我们发送这一组数据的大小,如上图,当窗口大小为4000个字节(四个段)时,我们在发送序号为1-4000的信息就直接发送给接收方即可,不需要等待接收方返回ACK(应答报文),在发送好一组数据以后,我们再等待ACK(应答报文),相当于使用一份等待时间,等待四个ACK(应答报文)

        窗口能不能无限大呢

        当我们的窗口越大,此时批量发送的数据就越多,效率就越高,那我们的窗口能不能及其的大呢,这样效率不就非常高了吗?答案是不行,因为窗口要是过于大,批量发送的数据就会很多,就不知道要到什么时候才去等待ACK(应答报文)了,就相当于完全不必等ACK(应答报文),此时就和不可靠传输差不多了,而TCP的特点就是可靠传输,并且如果窗口过于大,批量发送的数据过于多,接收方能不能处理得过来,中间的网络设备能不能承受住,都是未知数

二.滑动窗口

        

         滑动窗口,是一个形象的比喻,实际上就是批量发送数据,这样可以缩短等待时间,提高一定的效率(缩短不代表没有,仍然需要一定的时间等待ACK(应答报文),所以传输效率不会比UDP高)

        如上图,我们在发送一组数据后,等待ACK(应答报文)时,我们需要等待4个段的应答报文都获得了才去发送下一段数据吗,很显然,不需要,由于ACK(应答报文)的发送是有顺序的,所以我们肯定会先接收到当前组中,第一段的ACK(应答报文),当我们收到第一段的ACK(应答报文)后便可以发送下一段数据了,这样我们就保证了一直等待的都是4个段的ACK(应答报文),一段一段的向后推进,就像一个滑动窗口一样。

        在滑动窗口中出现丢包应该怎么办?

        1.ACK(应答报文)丢包

        ACK(应答报文)丢包即使不做任何处理也是正确的,如上图,当1-1000序号的数据发送后,接收方返回的1001的确认序号( ACK(应答报文))出现了丢失,但后面1001-2000序号的数据发送后,接收方返回的2001的确认序号( ACK(应答报文))没有出现丢失,而2001的确认序号就表名在2001之前的数据都已经成功接收,其中就包括了1-1000的数据,所以即使 ACK(应答报文)出现了丢失后面的 ACK(应答报文)也能确认之前的数据被成功接收

        所以在滑动窗口中  ACK(应答报文)丢包即使不做任何处理也是正确的

        2.传输的数据丢包

        

         如上图,在滑动窗口批量传输数据时,1001-2000这段数据出现了丢包,此时接收方就没有收到1001-2000这段数据,所以接收方之后返回的确认序号( ACK(应答报文))都是1001,就像是提醒发送端“我想要的是1001这个数据”一样

        当发送端连续收到多次“1001”这样的应答,就会将对应的1001-2000的数据重新发送

        此时接收端收到了1001后,再次返回的确认序号( ACK(应答报文))就是7001了,因为2001-7000的数据接收端之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中

        这种机制叫做“高速重发控制”,也叫“快重传”

        流量控制(滑动窗口的补充)

        

         我们知道,滑动窗口越大,批量传输的数据越多,传输效率越高,但是窗口也不能无限大,窗口要是太大了,就有可能使接收方处理不过来,或者使传输的中间链路处理不过来,这样就会出现丢包,就得重传了,反而还影响了效率

        流量控制就是给滑动窗口“踩踩刹车”,避免窗口太大,导致接收方处理不过来

        流量控制就是根据接收方的处理能力来限制发送方的发送速度(窗口大小)

        那我们如何衡量接收方的处理能力呢?通过接收方的接收缓冲区剩余空间大小来进行衡量,

接收缓冲区剩余空间大小越大,说明接收方的处理能力越强,发送方的发送速度(窗口大小)就可以越大,反之亦然

        发送方如何知道接收方的处理能力呢?接收方接收到数据后都会给发送方发送ACK(应答报文),所以我们将接收方的接收缓冲区剩余空间大小通过ACK(应答报文)反馈给发送方,作为发送方下一次发送数据窗口大小的依据

        如上图,发送端发送了1-1000的数据,接收端返回的ACK(应答报文)不仅有确认序号1001,还有接收端接收缓冲区的剩余空间大小3000字节,发送端收到ACK(应答报文)以后,便知道了接收端接收缓冲区还有3000字节的剩余空间大小,于是发送了1001-4000共3000字节的数据给接收端,当接收端返回的接收缓冲区剩余空间大小为0时,发送端就会不停的发送一个无意义的数据作为探测信号,去获取接收端接收缓冲区剩余空间大小,当不为0时,便可以继续传输数据。

        滑动窗口并不是TCP就一定涉及

        如果通讯双方大规模的传输数据,那么肯定就是滑动窗口

        如果通讯双方传输数据的规模比较少,这个时候就不会用滑动窗口了,依然按照之前的发一个数据就等待一个ACK(应答报文)的方式工作

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

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

相关文章

数据结构-->栈

💕休对故人思故国,且将新火试新茶,诗酒趁年华💕 作者:Mylvzi 文章主要内容:详解链表OJ题 前言: 前面已经学习过顺序表,链表。他们都是线性表,今天要学习的栈也是一种线…

设计模式-观察者模式(观察者模式的需求衍变过程详解,关于监听的理解)

目录 前言概念你有过这样的问题吗? 详细介绍原理:应用场景: 实现方式:类图代码 问题回答监听,为什么叫监听,具体代码是哪观察者模式的需求衍变过程观察者是为什么是行为型 总结: 前言 在软件设计…

变道超车?中国首架电动垂直起降飞行器即将首飞,载人是亮点

根据御风未来的官方消息,他们的首架全国产电动垂直起降飞行器Matrix 1已经顺利完成了各项地面测试,并且即将迎来首次试飞。这款飞行器采用纯电能源,不需要跑道即可起降,并且具备智能化全自主飞行能力,无需飞行驾驶员操…

C++--红黑树

1.什么是红黑树 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因…

java.net.BindException Address already in use: NET_Bind解决

java.net.BindException Address already in use: NET_Bind 两种解决方法 两种解决方法 (1) kill 占用此端口的线程 查看报错的端口 netstat -ano | findstr 16825tasklist | findstr 1092 如果占用的程序不重要直接kill taskkill /f /pid 16825 (2) 修改启动端口 找一个没…

系统架构设计师-信息安全技术(2)

目录 一、安全架构概述 1、信息安全所面临的威胁 二、安全模型 1、安全模型的分类 2、BLP模型 3、Biba 模型 4、Chinese Wall模型 三、信息安全整体架构设计 1、WPDRRC模型 2、各模型的安全防范功能 四、网络安全体系架构设计 1、开放系统互联安全体系结构 2、安全服务与安…

typedef

t y p e d e f typedef typedef 声明&#xff0c;简称typedef&#xff0c;是创建现有类型的新名字。 比如&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n;scanf("%lld",&n);printf("%lld"…

共定位数据和环境准备

共定位数据和环境准备 一、数据准备 如果需要做eqtl-GWAS的共定位&#xff0c;则需要按照药靶教程中&#xff0c;将eqtl数据放在smr目录内 如果是纯GWAS-GWAS的共定位&#xff0c;涉及到本地数据的&#xff0c;需要将其整理成模板SNP的格式&#xff0c;并且需要chr&#xff0c…

CASAIM与哈尔滨工业大学达成航空航天关键零部件自动化智能测量系统合作,助力航空航天特种复合新材料性能分析

近期&#xff0c;CASAIM与哈尔滨工业大学在航空航天关键零部件自动化智能测量系统展开全面合作&#xff0c;为后续进行航空航天特种复合新材料性能分析提供可靠的试验数据。 哈尔滨工业大学是隶属于工业和信息化部的全国重点大学&#xff0c;是国家“985工程”“211工程”“双…

【Ubuntu】从Graylog到Grafana Loki:构建更强大的网络设备管理和监控系统

在将Graylog部署到生产环境时&#xff0c;我们遇到了一些问题&#xff0c;其中最主要的是无法安装MongoDB并且无法随时重启机器去修改BIOS设置来修复问题 【WARNING: MongoDB 5.0 requires a CPU with AVX support, and your current system does not appear to have that! 】。…

云服务 Ubuntu 20.04 版本 使用 Nginx 配置SSL证书和nginx从HTTP跳转到HTTPS

1.云服务申请免费的SSL证书 2.从云服务SSL证书下载到本地解压上传到服务器 3.配置Nginx下的 nginx.cof 文件 4.开放安全组&#xff0c;内部与外部 5.测试配置与跳转是否成功 1.云服务申请免费的SSL证书 1.1.登录云平台找到SSL证书 注意&#xff1a;博主这里是腾讯云&#x…

程序员如何利用公网远程访问查询本地硬盘【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…

OJ练习第151题——克隆图

克隆图 力扣链接&#xff1a;133. 克隆图 题目描述 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 示例 分析 对于一张图而言&#xff0c;它的深拷贝即构建一张与原图结构&#xff0c;值均一样的图&#xff0c;但是…

光伏发电系统的并网接入点选择及接入方案

1.并网方式及接入点选择 (1))并网点与接入点定义 1)并网点。对于有升压站的分布式电源&#xff0c;并网点为分布式电源升压站中压侧母线或节点&#xff0c;对于无升压站的分布式电源&#xff0c;并网点为分布式电源的输出汇总点。图1中所示A1、B1点分别为分布式电源A、B的并网…

工业视觉相机镜头选型方法

一、相机选型 1、首先&#xff0c;根据检测需求确定选用黑白/彩色、面阵/线阵相机&#xff0c;接口类型一般选择GigE 2、确定检测精度要求&#xff08;最小特征尺寸mm&#xff09;、视野范围&#xff0c;一个测量精度对应几个像素数&#xff08;一般取3-5&#xff09; 3、计…

【山河送书第七期】:《强化学习:原理与Python实战》揭秘大模型核心技术RLHF!

《强化学习&#xff1a;原理与Python实战》揭秘大模型核心技术RLHF&#xff01; 一图书简介二RLHF是什么&#xff1f;三RLHF适用于哪些任务&#xff1f;四RLHF和其他构造奖励模型的方法相比有何优劣&#xff1f;五什么样的人类反馈才是好反馈&#xff1f;六如何减小人类反馈带来…

Matplotlib数据可视化(四)

1.在绘图中显示公式 在Matplotlib中可以使用LaTex的命令来编辑公式&#xff0c;只需要在字符串前面加一个r即可。 示例1&#xff1a; import numpy as np import matplotlib.pyplot as plt plt.xlim([1,4]) plt.ylim([1,3]) plt.text(2,2,r$ \alpha \beta \pi \lambda \omeg…

新榜 | CityWalk本地生活商业价值洞察报告

如果说现在有人问&#xff0c;最新的网络热词是什么? “CityWalk”&#xff0c;这可能是大多数人的答案。 近段时间&#xff0c;“CityWalk”刷屏了各种社交媒体&#xff0c;给网友们带来了一场“城市漫步”之旅。 脱离群体狂欢&#xff0c;这个在社交媒体引发热议的词汇背后又…

【leetcode】232. 用栈实现队列

1.使用两个栈结构构建队列 我们需要自定义栈及其相关操作 栈结构遵循后入先出的原则&#xff0c;队列结构遵循先入先出的原则 构建具有两个栈结构的队列&#xff0c;栈pushST用于数据的插入&#xff0c;栈popST用于数据的删除 为栈结构动态开辟空间并初始化栈结构 //定义一个具…

object获取的两种方式/Object.keys使用/解构赋值

object获取的两种方式&#xff1a; data() {return {abj: {aa: {A: 1}}}},created() {console.log(this.abj.aa) //第一种console.log(this.abj["aa"]) //第二种}, Object.keys使用/解构赋值&#xff1a; return {footList: [],abj: {aa: {A: 12,AA:22},bb: {…