TCP的滑动窗口机制和流量控制

目录

滑动窗口

流量控制

拥塞控制


滑动窗口

  TCP除了保证可靠性之外,也希望能够尽可能高效的完成数据传输。滑动窗口就是一种提高效率的机制。以下是不引入滑动窗口的数据传输过程:

可以看到,主机A这边每次收到一个ACK才发送下一个数据。这个过程其实是比较低效的。

于是我们就引入了滑动窗口:

这样,就不是一次发送一条数据了,而是一次发送一组,再批量等待一组ACK。就把一条一条发送转化成批量发送了。就把等待时间重叠了,提高了效率。

不等待ack,批量发送多少数据,这个过程就是称为“窗口大小”。

分析:上述过程,收到了2001的ack,此时这个1001-2000的数据就得到了确认,标记成灰色了。接下来,当然要继续等待2001-5000的ack,与此同时,也发送一个新的数据,5001-6000。(此时要等待ack的数据还是四组数据)就像一个固定大小向后滑动的窗口一样。

注意:滑动窗口中,批量发送4组数据之后,不是等到4个都回来才继续发送新的数据,而是收到一个ack,就往后发一个新的。

问题:在滑动窗口中,收到的ack不一定是按照发送顺序返回的,有可能1001-2000和2001-3000的数据先发,但是3001-4000的数据的ack先返回了,这样该怎么办?

3001的意思是3001之前的数据已经收到了,这样滑动窗口就可以向后走两格

那如果3001之前的数据丢包了,怎么办?

有两种情况:(滑动窗口之下,搭配的丢包处理机制,是很高效的,称为快速重传

虽然主机A仍然在继续给B往后发送,接下来的每个数据,B都是再向A索要1001这个数据报。

A这边连续收到若干个1001这样的ack,就明白了,原来是1001-2000这个数据丢了,于是紧接着A就将1001-2000这个数据重传。B收到之后,会从7001开始发送ack。1001-2000的数据就像一块拼图,一但拼图凑齐,B就会从最新的7001开始发送。

因为对于B来说有一个接收缓冲区,数据报都是先存在接收缓冲区里的。当缓冲区存在某个缺口的时候,返回的ack,确认序号都是在索要缺口的数据。

超时重传和快速重传是否是冲突的? 当然不冲突。两者只是不同情况下采取的重传策略。快速重传相当于在滑动窗口下的特殊变种。

注:如果TCP传输的数据比较少,不频繁,此时就不会触发滑动窗口,仍然按照超时重传的方式来解决丢包问题。如果短时间传输大量数据,此时才能触发滑动窗口。此时才触发快速重传,按照ack反馈的次数来解决丢包问题。

重要结论:滑动窗口,说是提升效率的机制,更准确地说,是“亡羊补牢”的机制。TCP为了保证可靠性,牺牲了很多效率。引入滑动窗口,是让效率上的牺牲,变少一些,但是仍然是存在牺牲的。再如何滑动窗口,速度也不可能比UDP这种没有可靠机制的协议更快

流量控制

  滑动窗口的窗口大小是可变的。可以通过窗口大小,来控制发送方的发送速度。窗口越大,单位时间发的数据就越多,效率就越高。窗口越小,单位时间发的数据就越少。

通常情况下,肯定是希望尽可能高效的传输。但是高效的前提一定是可靠性

如果发送速度太快,接收方处理不过来,此时还可能引起丢包。

接收方根据自身的处理能力,反向制约发送方的速度,是双方达成一个“平衡”。这样的机制,就称为“流量控制”。

如何衡量接收方的处理速度?   接收方有一个接收缓冲区(阻塞队列)。

空闲空间大小,作为发送方发送数据的窗口大小。接收方给发送方返回ack,把这个数值告诉发送方,在ack报文中,在tcp报头里,指定一个字段,表示上述的空闲空间大小。

窗口拓展因子,就可以使窗口大小大于64kb。

发送方就可以按照上述窗口大小,决定下一轮数据发送的窗口大小了。

拥塞控制

拥塞控制和流量控制类似,都是和滑动窗口搭配的机制。流量控制是站在接收方的角度,影响发送方的速度。而拥塞控制是站在发送方的角度,影响接收方的速度

流量控制的时候,很容易定量的来衡量,接收缓冲区的剩余空间大小,用这个作为发送窗口大小。但是考虑中间结点,就复杂了。每次走的路径,每个设备的处理能力,繁忙程度,都不一样。

但是无论中间结构多复杂,tcp都会把它们视为一个整体,然后通过“实验”的方式,找到一个合适的窗口大小(发送速度)。具体流程如下

刚开始按照小的速度,小的窗口来发送数据。如果没有出现丢包(说明中间链路非常通畅),就可以增加速度,增加窗口大小。如果还是没丢包,仍然很通畅,就继续增加速度,继续增加窗口大小。.........增加到一定程度,发送速度非常快了,此时可能某个设备到达瓶颈,出现丢包了。此时,发送方立即减少窗口大小,继续发送,看是否还丢包。如果不丢包,再继续尝试加。如果丢包,就继续尝试减。这样就能找到一个合适的窗口大小的值,就可以不丢包,并且还能以比较快的速度完成传输。

由于网络是复杂的,也是多变的。按照上述方式,动态调整,随时适应网络中的变化。

拥塞控制的窗口,影响发送速度。流量控制窗口,也会影响发送速度。这俩窗口哪个小,就听那个的。

拥塞控制窗口大小动态变化是否有规律?

1)刚开始,以比较小的窗口,来传输数据。主要因为刚开始不知道网络是否拥堵,先试试看。

2)按照指数方式扩大窗口(*2)

这里慢启动说的“慢”说的是刚开始窗口大小比较小,传输速度慢。而不是窗口大小的变化速度慢(指数增长非常快的)。

3)指数增长的过程中,达到某个阈值,就要变成线性增长(+n)。

4)线性增长,也是增长,发送速度越来越快。增长到一定程度,就会出现丢包。此时,发送方大概就摸到了网络的大概能力是在啥样的水平。此时就会立即把窗口变小(发送速度减下去)。

5)缩小有两种方式

 1、直接缩到底(回到了最初慢启动的时候),接下来指数增长,线性增长。

 2、缩到出现丢包时,窗口大小一半这样的位置,接下来线性增长。

第一种方式比较低效,现在已经废弃了。第二种方式是当前实际使用的方式。

以上关于滑动窗口,希望对你有所帮助。

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

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

相关文章

为什么cca门限和tx 功率有关系

Cca是用来决定信道是否繁忙,好像只和收有关。 但是为什么和tx有关。 设想一下这个网路布局。 如果某个STA在决定是否发送的时候,是否不能只看收到的干扰多大,还应该“冒险”一下,如果自己的功率足够,那么就可以扛住干…

MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过 Results 注解,Result 注解,One 注解和 Many 注解组合完成复杂关系的配置。 注解说明Results代替的是标签 …

【csv-parse】使用parse方法的时候来转换为csv字符串时,会导致输出有乱码

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:前端bug记录 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进…

Vue3组件库开发项目实战——02项目搭建(配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest)

摘要:在现代前端开发中,构建一个高效、可维护且易于协作的开发环境至关重要。特别是在开发Vue3组件库时,我们需要确保代码的质量、一致性和文档的完整性。本文将带你从0搭建vue3组件库开发环境,以下是配置代码规范、格式化、CSS样…

扩散模型diffusion model

一 什么是扩散模型 1.1 现有生成模型 已经有大量的方法证明深度生成模型能够模拟人类的想象思维,生成人类难以分辨真伪的内容,主要方法如下: 1、GAN:用神经网络训练生成器和判别器 GAN 的主要思想: GAN 就是一个互搏的…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西,如果只是想要看懂乐谱的话,它是没什么意义的,就像我们要把 0,1,2,3,4,5。。。称为自然数,1,2,3,4,5称为正整…

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤: 1、确定采集目标:需要明确要采集的商品类别、筛选条件(如天猫、价格区间)、销量和金额等数据。例如,如果您想了解“小鱼零食”的销量和金额,您需要设定好价…

vueday1

1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 三元表达式、点语法、数组对应项&#xff0c;方法、点语法方法 1.使用的时候需要存在&#xff0c;需要在data里面声明&#xff0c;如果没有声明会报错 2.ifelse不能用 3.不能在标签属性中使用{{}}插值 <!DO…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

静态住宅IP优缺点总结

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时&#xff0c;一些通用性模块可以在不同的网络结构中重复使用&#xff0c;这简化了模型设计的过程&#xff0c;帮助我们加快了实验的迭代速度。 比如在视觉任务中&#xff0c;即插即用的特征融合模块可以无缝集成到现有网络中&#xff0c;以灵活、简单的方式提升神经…

7.STL中string的一些超常用函数 (附习题)

目录 1.find 2.atoi 3.to_string 4.getline 【leetcode 习题】 387.字符串中的第一个唯一字符 125. 验证回文串 1.find 1.查找第一次出现的目标字符串&#xff1a;说明&#xff1a;如果查找成功则输出查找到的第一个位置&#xff0c;否则返回-1&#xff1b; s1.find(s2…

宇宙(科普)

宇宙&#xff08;Universe&#xff09;在物理意义上被定义为所有的空间和时间&#xff08;统称为时空&#xff09;及其内涵&#xff0c;包括各种形式的所有能量&#xff0c;比如电磁辐射、普通物质、暗物质、暗能量等&#xff0c;其中普通物质包括行星、卫星、恒星、星系、星系…

【目标检测】YOLOv5|YOLOv8模型QT界面可视化部署

YOLO-Deploy-QT_Interface 最近笔者做了YOLO系列算法的部署工作,现做一个总结。主要工作是做了用于部署YOLOv5和YOLOv8的可视化QT界面,可实现图片、文件夹、视频、摄像头的ONNX与OpenVino部署,具体效果如下: 代码链接:https://github.com/Zency-Sun/YOLO-Deploy-QT_Inte…

Centos7 配置 DNS服务器

Centos 7 配置DNS服务器 环境描述&#xff1a; 一台服务器和一台用于测试的客户机 服务器IP&#xff1a;192.168.200.132 客户机IP&#xff1a;192.168.200.143 服务器配置 yum install bind bind-utils -y #安装软件包vim /etc/named.conf //编辑named主配置文件listen-on p…

【Linux】解析键盘组合键产生信号的完整过程:从硬件中断到信号发送

前言 每一个了解Linux的都知道这样一个知识&#xff0c;CtrlC组合键能够终止一个进程。 个人了解进程相关知识之后知道&#xff0c;一个进程被终止只会有有三种情况&#xff1a; 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码运行异常&#xff…

huggingface 笔记:pipeline

1 介绍 pipeline() 是使用预训练模型进行推理的最简单和最快速的方式。可以针对不同模态的许多任务直接使用 pipeline() 2 举例&#xff1a;情感分析 2.1 创建pipeline实例 from transformers import pipelineclassifier pipeline("sentiment-analysis") #首先创…

SystemC学习使用记录

一、概述 对于复杂的片上系统&#xff0c;在进行RTL编码前&#xff0c;需进行深入的系统级仿真&#xff0c;以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费&#xff0c;所进行的这些仿真要求在芯片的仿真模型上运行大量的软件&#xff0c…

跨境必看|TikTok账号运营的八大秘籍

国内的传统生意都是可以在抖音上做&#xff0c;那么也可以在TikTok 上重新做一遍。那该如何才能把握住这片巨大的蓝海&#xff0c;TikTok 账号的运营就成为了主要的关键了&#xff0c;对于TikTok账号运营的八大秘籍&#xff0c;大家一起看看是如何做的&#xff1f; 一、固定节…