TCP的拥塞控制算法之一:慢启动算法、拥塞避免算法

news/2024/5/16 22:14:39/文章来源:https://blog.csdn.net/meihualing/article/details/112687251

目录

什么是拥塞控制,为什么需要拥塞控制

慢启动

拥塞避免


 

什么是拥塞控制,为什么需要拥塞控制

       拥塞通常是指从随着网络中的主机增加其发送速率并因为网络的原因使网络变得十分拥挤,此时会经常发生丢包现象,导致网络的传输效率急剧降低。分组的超时重传重复收到的分组确认ACK报文,通常被作为网络拥塞的标志

        通常局域网近似于理想网络,最大带宽大小固定,几乎无抖动,几乎不会因为网络原因丢包,几乎不会发生乱序。在这种网络下,通常不会发生拥塞,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口(滑动窗口协议)大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。

        但是如果不是局域网(比如广域网)的情况下,在发送方和接收方之间存在多个路由器和一些速率较慢的链路,有时还会出现某些链路断开或者各种原因导致的路由路径切换,就有可能出现一些问题。比如中间突然出现一段速率慢的链路导致中间路由器必须要缓存分组,但其缓存的能力有限,耗尽存储器的空间后必须丢弃报文。那么这种情况下,我们就需要引入拥塞控制算法,来避免拥塞的发生。

        在TCP里,使用三个窗口进行流量控制,分别是:

  • 接收窗口rwnd(receive window)
  • 发送窗口swnd(send window)
  • 拥塞窗口cwnd(congestion window)

        这3个窗口的定义与关系可以参见文章:TCP的三个窗口

       TCP协议除了用swnd和rwnd进行流量控制外,还引入了cwnd来进行拥塞控制。

        另外TCP的拥塞控制算法包括4大算法,分别是:

  • 慢启动
  • 拥塞避免
  • 拥塞发生
  • 快速恢复

慢启动

        TCP是一个“无私”的协议,当它检测到拥塞发生时,它就会主动降低发送速度,以避免拥塞变得更加严重,主动来帮助网络恢复正常状态。为了避免拥塞,TCP在最开始的阶段:先将拥塞窗口cwnd设置1个mss长度,然后有一个以指数形式增长的过程称为慢启动。

         在文章TCP的三个滑动窗口,swnd, cwnd, rwnd中,我们已经知道, 发送窗口swnd的大小是由cwnd拥塞窗口和接收方的rwnd接收窗口大小(swnd= min[rwnd, cwnd])中比较小的那个值来决定的。

        本文章中为了简单讨论慢启动的模型,我们提出二个假设

  • 发送窗口swnd完全由网络的拥塞程度决定                

          我们假设接收端主机的缓冲区足够大或者说接收端主机的处理能力足够快,使得接收窗口总是足够大,进而可以得出,发送窗口swnd的大小就完全是由拥塞窗口cwnd的大小来决定,即完全由网络的拥塞程度决定。

  • 以MSS的个数做为cwnd的单位

         并且我们假设需要发送的TCP报文足够大并且MSS设置成了合适的值,那么使得TCP报文总是以一个MSS的长度来发送任意一个报文,并且不会产生IP分片。这们我们就可以用MSS的个数来取代字节个数来做为CWND的窗口大小的单位。

         理解二个概念:

  • 初始cwnd
  • 慢启动门限ssthresh

TCP刚刚开始传输数据时,会从一个较小的cwnd开始,然后逐步增长到sshthresh的过程称为慢启动,这个慢启动过程中的增长算法很简单:发送方每从网络上收到一个 ack,拥塞窗口 cwnd的值就会加 1

如图所示,

1,发送方最开始(横坐标1)时,只发送1个数据包到接收方---------cwnd的大小为1(纵坐标)

2,当发送方收到第1次发送的1个数据包的ACK后,将cwnd的大小加1成2(1+1=2),再发送2个数据包给接收方(横坐标2)

3,当发送方收到第2次发送的2个数据包的2个ACK后,将cwnd的大小加2成4(1+1+2=4),再发送4个数据包给接收方(横坐标3)

4,当发送方收到第3次发送的4个数据包的4个ACK后,将cwnd的大小加4成8(1+1+2+4=8),再发送4个数据包给接收方(横坐标3)

5,依此类推,直到cwnd>ssthresh,则结束慢启动过程进入到拥塞避免阶段

 我们可见在慢启动阶段cwnd是以指数的形式增长的,直到拥塞窗口大小大于门限值为止。

拥塞避免

当TCP经过慢启动阶段,wnd>ssthresh时,就开始使用拥塞避免算法来进行拥塞控制,这个阶段cwnd以线性方式增长,每次收到前面发出去的所有包时,cwnd = cwnd + 1(实际是每收到一个ACK, cwnd = cwnd + 1/cwnd),线性增长直到检测到拥塞发生。

见横坐标从6开始的,每一轮cwnd就加1。

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

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

相关文章

Spring Boot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除

一、整个 Quartz 的代码流程基本基本如下:首先需要创建我们的任务(Job),比如取消订单、定时发送短信邮件之类的,这是我们的任务主体,也是写业务逻辑的地方。创建任务调度器(Scheduler),这是用来调度任务的,主要用于启动…

【数据结构与算法】二分查找 移除元素

今日任务 数组理论基础 704.二分查找 27.移除元素 1.数组理论基础 (1)数组是存放在连续内存空间上的相同类型数据的集合。 注意: 数组下标都是从0开始的数组内存空间的地址是连续的 (2)正因为数组在内存空间的…

(考研湖科大教书匠计算机网络)第四章网络层-第四节:IP数据报的发送和转发过程

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:概述二:举例三:路由器可以隔离广播域本节对应视频如下 【计算机网络微课堂(有字幕无背景音乐版)】&…

记一次OOM

1,问题描述: 新上了一版代码之后,上游服务请求我们服务失败,报错:“服务不可用”,发现注册中心上服务掉线,查询日志:发现oom:Java heap space,GC overhead limit exceeded。 容易…

【R语言(二):Nomogram(诺莫图/列线图)绘制 / R语言逻辑回归分析】

R语言(二):Nomogram(诺莫图/列线图)绘制 1、基本概念 Nomogram,中文常称为诺莫图或者列线图。简单的说是将Logistic回归或Cox回归的结果进行可视化呈现。它根据所有自变量回归系数的大小来制定评分标准,给每个自变量的每个取值水平一个评分&…

Mysql使用规范(纯技术和实战建议)

1、事务隔级别: (强制):Repeatable-Read(重复读),且不能在会话操作时临时开启隔离级别。 注: Repeatable-Read(重复读)隔离级别解决不了幻读。 可用 show variables l…

内存泄漏检测组件 -- hook

目录 hook malloc与free出现的问题 builtin_return_address(N) C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 hook malloc与free出现的问题 #define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> #include <stdlib.h> /****…

上采样学习

最近邻 简单来说就是x方向和y方向分别复制 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import numpy as np import torch from cv2 import cv2 from torch import nndef numpy2tensor(x: np.ndarray) -> torch.Tensor:"""(H,W) -> (1, 1, H, W)(H,W…

迁移案例实操:MySQL迁移到DM8由于有248张表存在datetime字段类型,使用dts迁移到达梦报不支持数据类型【附数据对比工具】

本文主要记录MySQL数据迁移到DM8上遇到MySQL源端表存在datetime数据类型时&#xff0c;并且包含datetime数据类型的表达上百张的的情况下&#xff0c;如何完成数据迁移的完整步骤。 1. 解决方法 将MySQL源端表的是datetime数据类型的字段修改为varchar(30)。 2. 处理步骤 &a…

以before为例 完成一个aop代理强化方法案例

观看本文 首先 您需要做好Spring aop的准备工作 具体可以参考我的文章 java Spring aop入门准备工作 首先 我们创建一个包 我这里叫 Aop 然后在Aop包下创建一个类 叫 User 参考代码如下 package Aop;public class User {public void add(){System.out.println("add....…

javaEE 初阶 — 流量控制与拥塞控制

文章目录1. 流量控制2. 拥塞控制TCP 工作机制&#xff1a;确认应答机制 超时重传机制 连接管理机制 滑动窗口 1. 流量控制 流量控制是一种干扰发送的窗口大小的机制&#xff0c;滑动窗口&#xff0c;窗口越大&#xff0c;传输的效率就越高&#xff08;一份时间&#xff0c;…

Python-第六天 Python数据容器

Python-第六天 Python数据容器一、数据容器入门1.数据容器二、数据容器&#xff1a;list(列表)1.列表的定义2.列表的下标&#xff08;索引&#xff09;3.列表的常用操作&#xff08;方法&#xff09;4.练习案例:常用功能练习5.list&#xff08;列表&#xff09;的遍历5.1 列表的…

Java基础面试题——JavaWeb专题

文章目录1.HTTP响应码有哪些2.Forward和Redirect的区别&#xff1f;3.Get和Post请求的区别4.介绍下OSI七层和TCP/IP四层的关系5.说说TCP和UDP的区别6. 说下HTTP和HTTPS的区别7.说下HTTP、TCP、Socket的关系是什么&#xff1f;8. 说下HTTP的长链接和短连接的区别9.TCP原理10. Co…

【CS224W】(task2)传统图机器学习和特征工程

note 和CS224W课程对应&#xff0c;将图的基本表示写在task1笔记中了&#xff1b;传统图特征工程&#xff1a;将节点、边、图转为d维emb&#xff0c;将emb送入ML模型训练Traditional ML Pipeline Hand-crafted feature ML model Hand-crafted features for graph data Node-l…

SpringBoot 文件上传后查看404的问题和解决404后需要访问两次才能查看的问题

文件上传、图片上传的实现见这个&#xff1a; SpringBootVue 实现头像上传功能_Teln_小凯的博客-CSDN博客 在实现上面的功能后&#xff0c;发现查看图片的时候提示404&#xff0c;解决这个方法如下&#xff1a; 1、配置资源静态文件映射 第一个参数是页面请求的地址&#x…

【Big Data】Hadoop--MapReduce经典题型实战(单词统计+成绩排序+文档倒插序列)

&#x1f34a;本文使用了3个经典案例进行MapReduce实战 &#x1f34a;参考官方源码&#xff0c;代码风格较优雅 &#x1f34a;解析详细 一、Introduction MapReduce是一个分布式运算程序的编程框架&#xff0c;核心功能是将用户写的业务逻辑代码和自身默认代码整合成一个完整的…

C语言指针剖析(初阶) 最详细!

什么是指针&#xff1f;指针和指针类型野指针指针运算指针和数组二级指针指针数组什么是指针&#xff1f;指针是内存中一个最小单元的编号&#xff0c;也就是地址。1.把内存划分为一个个的内存单元&#xff0c;一个内存单元的大小是一个字节。2.每个字节都给定唯一的编号&#…

交通部互通互联码的根证书规则

引言 为了更好的服务交通互通互联码而更新这篇文章。 中金根证书其实是可以自己生成的。 代码内调整 中心公钥索引要保证自己的唯一性。 此处的唯一&#xff0c;是要保证在机具侧的唯一&#xff0c;因为他要根据这个索引去查找证书以及公钥。 提供根公钥给机具侧 生成的公钥…

【项目】CRM系统中基础模块,异常处理封装,非法请求拦截处理办法

CRM基础模块登录功能密码修改退出登录全局异常处理封装非法请求拦截大家好&#xff0c;我是小冷 上一篇介绍了CRM是什么&#xff1f;以及CRM系统有哪些模块组成。需要详细的地址点击&#xff1a;地址 接下来继续介绍CRM系统的具体模块逻辑信息 基础模块 每个系统都有自己的基础…

深度解读Webpack中的loader原理

一、前言 webpack 是一个现代 JavaScript 应用的静态模块打包器。那么 webpack 是怎样实现不同种类资源模块加载的呢&#xff1f; 没错就是通过 loader。loader 用于对模块的源代码进行转换。loader 可以使你在 import 或加载模块时预处理文件。 我们带着下面几个问题&#…