当前位置: 首页 > news >正文

流量控制和拥塞控制的原理和区别

文章目录

  • 先介绍下重传机制和滑动窗口
    • 超时重传
    • 快速重传
    • SACK方法
    • Duplicate SACK
    • 滑动窗口
      • 发送方缓存窗口
      • 接收方缓存窗口
  • 流量控制
    • 小结
  • 拥塞控制
    • 慢开始算法
    • 拥塞避免算法
    • 快重传
    • 快恢复

先介绍下重传机制和滑动窗口

超时重传

重传机制的其中一个方式,就是发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文就会重发该数据。
TCP会在以下两种情况发送超时重传:

  • 数据包丢失
  • 确认应答丢失
    在这里插入图片描述
    RTT(往返时延):RTT是数据发送时刻到接收到确认的时刻的差值。
    在这里插入图片描述
    超时重传时间是以RTO表示,在重传情况下超过时间RTO会有哪些情况发生?
    在这里插入图片描述
    如果RTO较大,重发慢效率低。
    如果RTO较小,导致可能没有丢就重发,会增加网络堵塞导致更多超时。
    RTO值非常重要,超时重传时间RTO的值应该略大于报文往返RTT的值。

快速重传

不以时间驱动,以数据驱动重传。
在这里插入图片描述
快速重传的工作方式是当收到三个相同的ACK报文时会在定时器时期之前重传丢失的报文段。
快速重传面对的问题是重传一个还是重传所有,为了解决不知道该重传哪些报文,于是就有了SACK方法。

SACK方法

选择性确认。
在TCP头部字段里加一个SACK,可以将已收到的数据的信息发生给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,就可以只重传丢失的数据。
在这里插入图片描述

Duplicate SACK

使用SACK告诉发送方有哪些数据被重复接受了。
在这里插入图片描述
接收方发现数据是重复收到的,于是返回一个SACK=3000-3500,告诉发送方数据已被接收到了,因为ACK都到4000了说明4000以前都被接收了。
在这里插入图片描述
好处:
可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
可以知道是不是「发送方」的数据包被网络延迟了;
可以知道网络中是不是把「发送方」的数据包给复制了;

滑动窗口

下图传输的缺点:数据包的往返时间越长,通信的效率越低。
在这里插入图片描述
为了解决这个问题,TCP引入了窗口这个概念。窗口实际上就是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,此时数据就可以在缓存区清楚。
下图假设窗口大小为3个TCP段,那么发送方就可以连续发送3个TCP段,并且中途若有ACK丢失,可以通过下一个确认应答进行确认。

在这里插入图片描述
图中的 ACK 600 确认应答报文丢失,也没关系,因为可以通过下一个确认应答进行确认,只要发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。这个模式就叫累计确认或者累计应答
TCP中有个字段叫Window,也就是窗口大小。
这个字段就是接收端告诉发送端自己还有多少缓冲区可以接收数据,于是发送端就可以根据接受端的处理能力发送数据,而不会导致接收端处理不过来。

发送方缓存窗口

在这里插入图片描述
可用窗口耗尽,在未收到ACK确认前无法继续发送数据了。
在这里插入图片描述
下图,当收到之前发送的数据的ACK确认应答后,如果发送窗口的大小没有变化,则滑动窗口右移5个字节,因为有5个字节的数据被应答确认,接下来52到56字节又变成了可用窗口,后续也就可以发送52到56字节的数据了
在这里插入图片描述
SND.WND:表示发送窗口大小,由接收方指定
SND.UNA:是一个绝对指针,指向已发送但未确认的第一个字节的序列号
SND.NXT:也是一个绝对指针,指向未发送但总大小在接收方处理范围内的第一个字节
在这里插入图片描述

接收方缓存窗口

在这里插入图片描述

接收窗口和发送窗口大小相等吗?
约等于,不是一成不变的。当接收方的应用进程读取数据的速度非常快的话,接收窗口就会很快的空缺出来,通过TCP报文中的Windows字段告诉发送方新的接收窗口大小。

流量控制

发送方不能无脑发数据给接收方,考虑接收方处理能力。
TCP提供一种机制可以让发送方根据接收方的实际接收能力控制发送的数据量,这就是所谓的流量控制。
利用滑动窗口机制可以很方便在TCP连接上实现对发送方的流量控制。

建立TCP连接时B告诉A,我的接收窗口是400,主机A将自己的窗口也设置为400
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
主机A调整自己的发送窗口为300
在这里插入图片描述

在这里插入图片描述
发送窗口内序号201-300这100个字节数据的重传计时器超时了,主机A将它们重新封装成一个TCP报文段发送出去
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
主机A还可以发送100字节

在这里插入图片描述
主机B对收到601号以前的数据进行累计确认,并将窗口字段的值调整为0,对主机A进行流控

在这里插入图片描述
目前主机A不能再发送一般的TCP报文段了
在这里插入图片描述
主机A将最后的发送缓存中序号501-600的字节数据全部删除了
假设过一段时间,主机B的接收缓存又有一些存储空间。
在这里插入图片描述

在这里插入图片描述
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,如果持续计时器超时,就发送一个零窗口探测报文,仅仅携带一字节的数据,对方在确认这个探测报文段时,给出现在的接收窗口值,如果接受窗口仍然是0,那么收到这个报文段的一方就重新启动持续计时器,如果接受窗口不是0,死锁的局面就打破了。
在这里插入图片描述
零窗口探测报文丢失怎么办,它也有持续计时器,超时也会被重传。

小结

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方地流量控制。

  • TCP接收方利用自己的接收窗口大小来限制发送方发送窗口的大小。
  • TCP发送方收到接收方的零窗口通知后应启动持续计时器。持续计时器超时后就向接收方发送零窗口探测报文。

拥塞控制

在某段时间,若对网络中某一资源的需求超过该资源所能提供的可用部分,网络性能就要变坏。
若出现拥塞而不进行控制,整个网络的吞吐量随输入负荷的增大而下降
在这里插入图片描述
介绍四种拥塞控制算法的基本原理:

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

假定如下条件:
数据单方向传送,而另一个方向只传送确认。
接收方总是由足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定。
以最大报文段MSS的个数为讨论问题的单位,而不是字节为单位。

在这里插入图片描述

慢开始算法

慢开始是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢
在这里插入图片描述

拥塞避免算法

指数增长变为线性增长
在这里插入图片描述
在这里插入图片描述

快重传

有时,个别报文段会在网络中丢失,但实际上网络并未发送拥塞,这将导致发送方超时重传,并误认为网络发送阻塞,发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。
采用快重传算法可以让发送方尽早知道发送了个别报文段地丢失。
快重传就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。
要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认。即使收到了失序的报文段也要立即发出对已收到报文段的重复确认。
发送方一旦收到三个连续的重复确认,将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。
在这里插入图片描述
对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了阻塞(进而降低拥塞窗口cwnd为1).使用快重传可以使整个网络的吞吐量提高百分之20左右。

快恢复

发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法。

  • 发送方将慢开始门限ssthresh值和拥塞窗口值cwnd值调整为当前窗口的一半;开始执行快恢复算法。
  • 也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于ssthresh+3

在这里插入图片描述

相关文章:

流量控制和拥塞控制的原理和区别

文章目录先介绍下重传机制和滑动窗口超时重传快速重传SACK方法Duplicate SACK滑动窗口发送方缓存窗口接收方缓存窗口流量控制小结拥塞控制慢开始算法拥塞避免算法快重传快恢复先介绍下重传机制和滑动窗口 超时重传 重传机制的其中一个方式,就是发送数据时&#xf…...

金融机构断卡行动中外部数据

“断卡行动”,近几年逐渐走入大众视野,是国家在从根源上整治网络及金融犯罪层面的重大举措。相信很多朋友在日常生活中已经有所体会了,比如我们在办理电话卡及银行卡的时候要经过很多审核机制,同时发卡后还会限制卡片的一些转账等…...

携程总监的单元测试是怎么样写的?

大家都知道,开发软件的时候为代码编写单元测试是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 1. 保持测试…...

算法每日一题:P2089 烤鸡 -DFS练习

😚一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:每日算法学习 💬个人…...

Spring中的循环依赖是什么?如何解决它?

循环依赖是指两个或多个Bean之间相互依赖,导致它们无法被正确地初始化。在Spring中,当两个或多个Bean之间存在循环依赖时,Spring容器无法决定哪个Bean应该先初始化,因此会抛出BeanCurrentlyInCreationException异常,从…...

不良事件报告系统源码,PHP医院安全(不良)事件报告系统源码,在大型医院稳定运行多年

PHP医院安全(不良)事件报告系统源码,不良事件系统源码,有演示,在大型医院稳定运行多年。 系统技术说明 技术架构:前后端分离,仓储模式 开发语言:PHP 开发工具:VSco…...

MySQL 查询常用操作(3)——排序 order by

MySQL中常用的查询操作,首先是能直接从表中直接取出数据,接着能对查询结果做一些简单的处理,比如去重等,然后是根据条件查询数据,包括精准查询、模糊查询以及按照数据的某个范围或者指定多个指标进行查询,值…...

Android Jetpack 从使用到源码深耕【数据库注解Room 从实践到原理 】(二)

上文,我们通过一个简单的sqlite应用实例,引入了Room,知道了Room使用的便捷和好处。然后用Room的方式,重新实现了应用实例中的场景,在这个过程中,我们结合自己已有的知识体系,从使用代码入手,对Room的实现原理,进行了猜想和简单的验证。 Room实现原理,是否真如我们猜想…...

传统企业如何实现数字化转型?

近年来,围绕新产品新模式新业态,国家重点部署了7个方向,包括数字化管理、平台化设计、智能化生产、网络化协同、个性化定制、服务化延伸、新型智能产品等,均为市场价值大、发展潜力深、示范效应强的代表性、引领性领域。 因此&am…...

Linux修改密码报错Authentication token manipulation error的终极解决方法

文章目录报错说明解决思路流程排查特殊权限有没有上锁查看根目录和关闭selinux/etc/pam.d/passwd文件/etc/pam.d/system-auth文件终极办法,手动定义密码passwd: Have exhausted maximum number of retries for servic、ssh用普通用户登录输入密码正确但是登录时却提…...

ROS实践06 自定义消息类型

文章目录运行环境:思路:1.1 定义.msg文件1)功能包下新建 msg 目录,添加文件 Person.msg2)修改package.xml3)修改CMakeLists.txt2.1 自定义消息调用(C)1)编译后修改includePath2)发布方实现2.1修改CMakeLists.txt2.3运行…...

《剑指offer》——从尾到头打印链表

首先,拿到题之后,我们还是先从题目入手,只有掌握题干的意思,才能进行接下来的解题操作。 示例1 输入 : {1,2,3} 返回值:[3,2,1] 示例2 输入 :{67,0,24,58} 返回值:[58,24,0,67] 解题方法…...

Javaweb基础配置模板(mybatis+javaweb)

1.大纲规划图 本配置涉及的技术:mybatis,javaweb,json转换&#xff0c;分页查询等 2.导入相关的配置文件pom.xml 2.1 依赖文件 <dependencies> <!-- 测试依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifact…...

物联网 JS 前端框架开发 - 执行 js 程序

前言 此篇文章主要讲解如何在物联网操作系统OneOS上运行高级语言JS脚本程序。想想还是有点意思的&#xff0c;毕竟在IOT设备上&#xff0c;我们的固有想法是&#xff0c;他们性能很羸弱&#xff0c;可能就跑跑一些简单的C应用程序&#xff0c;没想到已经可以运行高级语言JS脚本…...

区块链概论

目录 1.概述 2.密码学原理 2.1.hash函数 2.2.签名 3.数据结构 3.1.区块结构 3.2.hash pointer 3.3.merkle tree 3.3.1.概述 3.3.2.证明数据存在 3.3.3.证明数据不存在 4.比特币的共识协议 4.1.概述 4.2.验证有效性 4.2.1.验证交易有效性 4.2.2.验证节点有效性 …...

MAC地址表安全

4.1.2MAC地址表安全 MAC地址表项类型包括:动态MAC地址表项:由接口通过报文中的源MAC地址学习获得,表项可老化。在系统复位、接口板热插拔或接口板复位后,动态表项会丢失。静态MAC地址表项:由用户手工配置并下发到各接口板,表项不老化。在系统复位、接口板热插拔或接口板复…...

处理CSV(python)

处理CSV&#xff08;python&#xff09;简介1. CSV和Python简介2. 文章内容简介一、用csv模块读取和写入CSV文件1. CSV模块2. 示例二、用pandas库读取和写入CSV文件1. pandas2. 示例三、处理CSV文件中的特殊情况1. 特殊情况及处理方法2. 示例简介 1. CSV和Python简介 CSV是一…...

【云原生】Kubernetes(k8s)之容器的探测

Kubernetes&#xff08;k8s&#xff09;之容器的探测一、探测类型及使用场景1.1、startupProbe&#xff08;启动探测&#xff09;1.2、readinessProbe&#xff08;就绪探测&#xff09;1.3、livenessProbe&#xff08;存活探测&#xff09;二、检查机制三、探测结果四、容器探测…...

看完这个你就牛了,自动化测试框架设计

一、引言 随着IT技术的快速发展&#xff0c;软件开发变得越来越快速和复杂化。在这种背景下&#xff0c;传统的手工测试方式已经无法满足测试需求&#xff0c;而自动化测试随之而生。 自动化测试可以提高测试效率和测试质量&#xff0c;减少重复性的测试工作&#xff0c;从而…...

Spring Cloud Alibaba全家桶(八)——Sentinel规则持久化

前言 本文小新为大家带来 Sentinel规则持久化 相关知识&#xff0c;具体内容包括&#xff0c;Sentinel规则推送三种模式介绍&#xff0c;包括&#xff1a;原始模式&#xff0c;拉模式&#xff0c;推模式&#xff0c;并对基于Nacos配置中心控制台实现推送进行详尽介绍~ 不积跬步…...

别再死记硬背了!用Python模拟超前进位加法器,直观理解其速度优势

用Python模拟超前进位加法器&#xff1a;从硬件原理到算法思维的跨越 在计算机科学和电子工程交叉领域&#xff0c;加法器是最基础却又最精妙的设计之一。传统教学中&#xff0c;我们往往通过抽象的电路图来理解超前进位加法器&#xff08;CLA&#xff09;的速度优势&#xff0…...

突破存储限制:群晖DSM7下Synology Photos自定义文件夹挂载实战

1. 为什么需要自定义文件夹挂载 很多群晖用户升级到DSM7后都会遇到一个头疼的问题&#xff1a;Synology Photos默认把所有个人照片都存放在/home/Photos目录下&#xff0c;而这个目录实际上位于/homes共享文件夹中。随着照片数量不断增加&#xff0c;/homes所在存储空间很快就会…...

从零到一:Android Studio集成Uniapp离线SDK打包实战

1. 环境准备&#xff1a;工具选择与版本匹配 第一次接触Uniapp离线打包时&#xff0c;最让我头疼的就是工具版本匹配问题。记得去年接手一个混合开发项目时&#xff0c;因为HBuilderX和SDK版本不兼容&#xff0c;整整浪费了两天时间排查问题。为了避免大家重蹈覆辙&#xff0c…...

打造便携式Kali Linux安全评估工具:OpenClaw USB定制全攻略

1. 项目概述&#xff1a;一个便携式安全评估工具的诞生 在安全研究、渗透测试或者应急响应的现场&#xff0c;你经常会遇到一个经典困境&#xff1a;目标环境可能是一台物理隔离的机器&#xff0c;或者是一台你无法安装任何软件的“干净”主机。你需要一个功能强大、即插即用的…...

VHD2VL终极指南:5分钟快速将VHDL转换为Verilog的免费工具

VHD2VL终极指南&#xff1a;5分钟快速将VHDL转换为Verilog的免费工具 【免费下载链接】vhd2vl 项目地址: https://gitcode.com/gh_mirrors/vh/vhd2vl 在FPGA和ASIC设计领域&#xff0c;VHDL转Verilog是许多工程师面临的共同挑战。手动转换不仅耗时费力&#xff0c;还容…...

如何在Mac上轻松导出微信聊天记录:WeChatExporter完整指南

如何在Mac上轻松导出微信聊天记录&#xff1a;WeChatExporter完整指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而焦虑&#xff1f…...

生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图

1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域&#xff0c;一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长&#xff0c;但核心非常明确&…...

Go语言SDK开发实战:为AI编程助手Cursor构建高效API客户端

1. 项目概述&#xff1a;一个为AI编程助手Cursor定制的Go语言SDK如果你和我一样&#xff0c;日常重度依赖Cursor这类AI编程助手来提升开发效率&#xff0c;同时又是个Go语言的忠实拥趸&#xff0c;那你肯定遇到过这样的场景&#xff1a;想用Go写个脚本&#xff0c;自动化处理一…...

faah:轻量级自动化任务编排器,简化运维与数据处理工作流

1. 项目概述&#xff1a;一个被低估的自动化利器最近在整理自己的自动化工具链时&#xff0c;又翻出了kiron0/faah这个项目。说实话&#xff0c;第一次看到这个仓库名&#xff0c;我也有点懵——“faah”&#xff1f;这名字听起来不像是一个典型的工具。但点进去之后&#xff0…...

Linux磁盘挂载与开机自启配置

Linux磁盘挂载与开机自启配置磁盘挂载是 Linux 存储管理中的基础操作。很多线上问题都与挂载配置有关&#xff0c;例如重启后数据盘没挂上、路径指向错误分区、应用因挂载点缺失而启动失败。中级阶段不仅要会临时挂载&#xff0c;更要理解永久挂载的配置方式和风险控制。一、先…...