[Linux][网络][TCP][四][流量控制][拥塞控制]详细讲解

目录

  • 1.流量控制
  • 2.拥塞控制
    • 0.为什么要有拥塞控制,不是有流量控制么?
    • 1.什么是拥塞窗口?和发送窗口有什么关系呢?
    • 2.怎么知道当前网络是否出现了拥塞呢?
    • 3.拥塞控制有哪些算法?
    • 4.慢启动
    • 5.拥塞避免
    • 6.拥塞发生
    • 7.快速恢复


1.流量控制

  • 发送方不能无脑的发数据给接收方,要考虑接收方处理能力

  • 如果一直无脑地发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费

  • 为了解决这种现象发生,TCP提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制

  • 假设以下场景:客户端是接收方,服务端是发送方假设接收窗口和发送窗口相同,都为200,假设两个设备在整个传输过程中都保持相同的窗口大小,不受外界影响

  • 根据下图的流量控制,说明下每个过程:

    • 客户端向服务端发送请求数据报文
      • **说明:**本次例子是把服务端作为发送方,所以没有画出服务端的接收窗口
    • 服务端收到请求报文后,发送确认报⽂和80字节的数据,于是可用窗口Usable减少为120字节,同时SND.NXT指针也向右偏移80字节后,指向321,这意味着下次发送数据的时候,序列号是321
    • 客户端收到80字节数据后,于是接收窗口往右移动80字节, RCV.NXT也就指向321,这意味着客户端期望的下⼀个报文的序列号是 321,接着发送确认报⽂给服务端
    • 服务端再次发送了120字节数据,于是可用窗口耗尽为0,服务端无法再继续发送数据
    • 客户端收到120字节的数据后,于是接收窗口往右移动120字节, RCV.NXT也就指向441,接着发送确认报文给服务端
    • 服务端收到对80字节数据的确认报文后, SND.UNA指针往右偏移后指向321,于是可用窗口Usable增大到80
    • 服务端收到对120字节数据的确认报文后, SND.UNA指针往右偏移后指向441,于是可用窗口Usable增大到200
    • 服务端可以继续发送了,于是发送了160字节的数据后, SND.NXT指向601,于是可用窗口Usable减少到40
    • 客户端收到160字节后,接收窗口往右移动了160字节, RCV.NXT也就是指向了601,接着发送确认报文给服务端
    • 服务端收到对160字节数据的确认报文后,发送窗口往右移动了160字节,于是SND.UNA指针偏移了160后指向601,可用窗口Usable也就增大至了200

请添加图片描述

  • 接收端将自己可以接收的缓冲区大小放入TCP首部中的"窗口大小"字段,通过ACK端通知发送端
  • 窗口大小字段越大, 说明网络的吞吐量越高
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端
  • 发送端接受到这个窗口之后,就会减慢自己的发送速度
  • 如果接收端缓冲区满了, 就会将窗口置为0,这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端

2.拥塞控制

0.为什么要有拥塞控制,不是有流量控制么?

  • 前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么
  • ⼀般来说,计算机网络都处在⼀个共享的环境,因此也有可能会因为其他主机之间的通信使得网络拥堵
  • 在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时TCP就会重传数据,但是⼀重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大
  • 所以,TCP不能忽略网络上发生的事,它被设计成⼀个无私的协议,当网络发送拥塞时,TCP会自我牺牲,降低发送的数据量
  • 于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络
  • 为了在「发送方」调节所要发送数据的量,定义了⼀个叫做「拥塞窗口」的概念

1.什么是拥塞窗口?和发送窗口有什么关系呢?

  • 拥塞窗口cwnd是发送方维护的⼀个的状态变化,它会根据网络的拥塞程度动态变化的
  • 前面提到过发送窗口swnd和接收窗口rwnd是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是**swnd = min(cwnd, rwnd)**,也就是发送窗口和接收窗口中的最小值
  • 拥塞窗口cwnd变化的规则
    • 只要网络中没有出现拥塞,cwnd就会增大
    • 但网络中出现了拥塞,cwnd就减少

2.怎么知道当前网络是否出现了拥塞呢?

  • 只要「发送方」没有在规定时间内接收到ACK应答报文,也就是发生了超时重传,就会认为网络出现了拥塞

3.拥塞控制有哪些算法?

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

4.慢启动

  • TCP在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是⼀点⼀点的提高发送数据包的数量, 如果一上来就发大量的数据,这不就是给网络添堵吗?
  • 慢启动的算法记住⼀个规则就行:当发送⽅每收到⼀个ACK,拥塞窗口cwnd的大小就会加1
  • 这里假定拥塞窗口cwnd和发送窗口swnd相等,下面举个例子:
    • 连接建立完成后,⼀开始初始化cwnd = 1,表示可以传⼀个MSS大小的数据
    • 当收到⼀个ACK确认应答后,cwnd增加1,于是⼀次能够发送2个
    • 当收到2个的ACK确认应答后, cwnd增加2,于是就可以比之前多发2个,所以这⼀次能够发送4个
    • 当这4个的ACK确认到来的时候,每个确认cwnd增加1,4个确认cwnd增加4,于是就可以比之前多发4个,所以这⼀次能够发送8个
    • 可以看出慢启动算法,发包的个数是指数性的增长

请添加图片描述

  • 那慢启动涨到什么时候是个头呢?
  • 有⼀个叫慢启动门限ssthresh(slow start threshold)状态变量
    • cwnd < ssthresh时,使⽤「慢启动算法」
    • cwnd >= ssthresh时,就会使⽤「拥塞避免算法」

5.拥塞避免

  • 前⾯说到,当拥塞窗口cwnd「超过」慢启动门限ssthresh就会进入拥塞避免算法
  • ⼀般来说ssthresh的大小是65535字节
  • 进入拥塞避免算法后,它的规则是:每当收到⼀个 ACK 时,cwnd增加1/cwnd
  • 接上前面的慢启动的例子,现假定ssthresh为8:
    • 当8个ACK应答确认到来时,每个确认增加1/8,8个ACK确认cwnd⼀共增加1,于是下次能够发送9个MSS大小的数据,变成了线性增长
    • 可以发现,拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了⼀些
    • 就这么⼀直增长着后,网络就会慢慢进⼊了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。当触发了重传机制,也就进入了「拥塞发生算法」
      请添加图片描述

6.拥塞发生

  • 当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:

    • 超时重传
    • 快速重传
  • 发生超时重传的拥塞发生算法

    • ssthresh和cwnd的值会发生变化:
      • ssthresh设为cwnd/2
      • cwnd重置为1
    • 接着,就重新开始慢启动,慢启动是会突然减少数据流的
      • ⼀旦「超时重传」,马上回到解放前。但是这种方式太激进了,反应也很强烈,会造成网络卡顿
        请添加图片描述
  • 发生快速重传的拥塞发生算法

    • 还有更好的方式,前⾯讲过「快速重传算法」。当接收⽅发现丢了⼀个中间包的时候,发送三次前⼀个包的ACK,于是发送端就会快速地重传,不必等待超时再重传
    • TCP认为这种情况不严重,因为大部分没丢,只丢了⼀小部分,则ssthresh和cwnd变化如下:
      • cwnd = cwnd/2 ,也就是设置为原来的⼀半
      • ssthresh = cwnd
      • 进⼊快速恢复算法

7.快速恢复

  • 快速重传和快速恢复算法⼀般同时使用,快速恢复算法是认为,你还能收到3个重复ACK说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈
  • 正如前⾯所说,进⼊快速恢复之前, cwnd和ssthresh已被更新了
    • cwnd = cwnd/2 ,也就是设置为原来的⼀半
    • ssthresh = cwnd
  • 然后,进入快速恢复算法如下
    • 拥塞窗口**cwnd = ssthresh + 3**(3的意思是确认有3个数据包被收到了)
    • 重传丢失的数据包
    • 如果再收到重复的ACK,那么cwnd增加1
    • 如果收到新数据的ACK后,把cwnd设置为第⼀步中的ssthresh的值,原因是该ACK确认了新的数据,说明从duplicated ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进⼊拥塞避免状态

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

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

相关文章

【XR806开发板试用】阻塞式串口发送与接收教程

本文基于wsl2搭建的ubuntu18.04 vscode编辑器 很奇怪啊&#xff0c;找了半天居然没人发串口的教程&#xff0c;于是只能自己试一试了&#xff0c;在此发一个阻塞式的串口发送与接收的教程。并且&#xff0c;感谢.ACE彭洪权大佬在我配置环境遇到几十个报错的时候帮我远程搭建环…

校园论坛系统基于PHP的校园管理系统毕设校园好感度系统 校园文化建设系统APP小程序H5前后端源码交付支持二开,一次付款,终生使用

APP小程序H5前后端源码交付&#xff0c;支持二开&#xff0c;一次付款&#xff0c;终身使用&#xff0c;免费更新系统本身源码。 校园社交网络系统开发是一个复杂且综合性的项目&#xff0c;旨在为学生、教师和管理人员提供一个互动、分享和交流的平台。以下是一个关于校园社交…

燃料电池发电系统详解

目录 前言 组成结构 系统参数 常见问题 参考资料 前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 组成结构 燃料电池发电系统&#xff0c;由多个子系统和子模块组成&#xff0c;示例如下&#xff1a; 燃料处理系统&#xff08;fuel processing system&#xf…

使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)

前言 YY&#xff1a;国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手&#x1f60e;&#x1f622;&#xff0c;2 Cores&#xff0c;4G RAM 还是阔以的&#xff0c;既然买了&#xff0c;那不能不用呀&#x1f6a9;&#xff0c;之前一直想着搭建个 k8s 集群玩…

详解MySQL常用的数据类型

前言 MySQL是一个流行的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;以满足不同数据处理和存储的需求。理解并正确使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。本文将详细介绍MySQL中的数据类型&#xff0c;包括数值类型、字符…

[法规规划|数据概念]金融行业数据资产和安全管理系列文件解析(3)

“ 金融行业在自身数据治理和资产化建设方面一直走在前列。” 一直以来&#xff0c;金融行业由于其自身需要&#xff0c;都是国内开展信息化建设最早&#xff0c;信息化程度最高的行业。 在当今数据要素资产化的浪潮下&#xff0c;除了行业自身自身数据治理和资产化建设方面&am…

清华大模型ChatGLM3在本地Tesla P40上也运行起来了

正文共&#xff1a;999 字 14 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们之前部署了ChatGLM3&#xff08;清华大模型ChatGLM3部署初体验&#xff09;&#xff0c;但是运行体验比较差&#xff0c;主要就是因为Tesla M4的显存只有4 GB&#xff0c;无法支撑项目运行。为此…

PyCharm怎么安装Comate与使用示范

目录 简单介绍Comate 安装步骤详解 Comate使用示范详解 使用总结 简单介绍Comate Baidu Comate智能编码助手是一款基于文心大模型打造的编码辅助工具&#xff0c;具备多重优势&#xff0c;包括代码智能、应用场景丰富、创造价值高、广泛应用等。它能帮助开发者提升编码效率…

数仓开发中期:理论巩固

一、数仓以及商业智能&#xff08;Data Warehousing and Business Intelligence, DW/BI&#xff09;系统 1.1数据操作和数据获取的区别 对所有组织来说&#xff0c;信息都是其最重要的财富之一。信息几乎总是用作两个目的:操作型记录的保存和分析型决策的制定。简单来说&…

关于vs2019 c++ STL 中容器的迭代器的 -> 运算符的使用,以 list 双向链表为例

&#xff08;1&#xff09;如下的结构体 A &#xff0c;若有指针 p new A() &#xff1b;则可以使用 p->m &#xff0c; p->n 解引用运算符。 struct A { int m ; int n; } 对于 STL 中提供的迭代器&#xff0c;提供了类似于指针的功能。对迭代器也可以使用 -> 运算…

ElasticSearch知识点汇总

1、ES中的​​​​​​​倒排索引是什么。 倒排索引&#xff0c;是通过分词策略&#xff0c;形成了词和文章的映射关系表&#xff0c;这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤&#xff1a; 心跳检测&#xff1a; 每个节点…

docker安装elasticsearch:7.17.21

docker安装elasticsearch:7.17.21 下载对应版本的docker镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.21启动容器 docker run --name elasticsearch-test -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -t docker.elastic.…

学习通下载PDF资源

今天突然发现&#xff0c;学习通的pdf资源居然是没有下载入口的&#xff0c;这整的我想cv一下我的作业都搞不了&#xff0c;于是我一怒之下&#xff0c;怒了一下。 可以看到学习通的pdf资源是内嵌在网页的&#xff0c;阅读起来很不方便&#xff0c;虽然他内置了阅读器&#xf…

如何做好一个活动策划?

活动策划的关键要素是什么&#xff1f; 首先&#xff0c;要明确一个概念:做活动就是走钢丝&#xff0c;没有保险的高空走钢丝!因为&#xff0c;活动没有“彩排”&#xff0c;只有现场"直播”! 无论什么类型的活动&#xff0c;人数是50人还是2000人&#xff0c;也不论预算…

Linux网络编程(一) 网络基础

一、一些概念 1.1、局域网与广域网 局域网&#xff1a;局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网&#xff1a;又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。 1.2、IP IP地址本质就是…

某制造公司屋顶分布式光伏发电案例分享--分布式光伏电力监控系统解决方案

安科瑞薛瑶瑶18701709087/17343930412 ★分布式光伏监控系统 分布式光伏监控电力系统遵循安全可靠、经济合理原则&#xff0c;满足电力系统自动化总体规划要求&#xff0c;且充分考虑光伏发电的因素&#xff0c;对分布式光伏发电、用电进行集中监控、统一调度、统一运维、满足…

苍穹外卖项目---------收获以及改进(5-6天)

①HttpClient 核心作用&#xff1a;在java编码中发送http请求 第一步&#xff1a;引入依赖 第二步&#xff1a;使用封装一个工具类 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.co…

向各位请教一个问题

这是菜鸟上的一道题目&#xff0c;单单拿出来问问大家&#xff0c;看看能不能解惑 &#xff0c;谢谢各位&#xff01; 题目25&#xff1a;求12!3!...20!的和 解题思路&#xff1a;这个题不知道为什么我用DEV C 5.11显示出来为0.000000&#xff0c;可能版本有问题&#xff1f;&a…

【JVM】内存结构

内存结构 Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机启动而创建&#xff0c;随着虚拟机退出而销毁。另外一些则是与线程一一对应的&#xff0c;这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。 线程私有…

Agent AI智能体:我们的生活即将如何改变?

你有没有想过&#xff0c;那个帮你设置闹钟、提醒你朋友的生日&#xff0c;甚至帮你订外卖的智能助手&#xff0c;其实就是Agent AI智能体&#xff1f;它们已经在我们生活中扮演了越来越重要的角色。现在&#xff0c;让我们一起想象一下&#xff0c;随着这些AI智能体变得越来越…