TCP 图解 网络拥塞和流量控制

news/2024/7/16 9:03:20

流量控制

流量控制的原因在于, 传输中接收端的接受能力是有限的, 如果发送的数据过多, 就会出现接受端缓冲区塞满, 数据被迫丢弃, 造成丢包问题, 浪费资源.

TCP协议中, 为了控制这种情况的出现, 引入了流量控制.

发送端和接收端, 互相在传输中, 协商缓冲区大小, 控制发送的数据量, 合理的利用网络资源.

  • 接收端在返回给发送端的响应中, 在TCP报头中放入自己的剩余缓冲区大小
  • 发送端根绝接收端发送给自己的缓冲区剩余大小, 动态的调整每次发送的数据的多少
  • 如果接收端的缓冲区已经满了, 就会返回给发送端一个缓冲区为0的报文, 发送端也就不会再发送了
  • 发送端每隔一段时间, 向接收端发送一个探测数据段来探测接收端的缓冲区是否可以进行接收了.如果缓冲区空间有了, 就继续发送

上面的几条概念, 就是整个流量控制的基本逻辑

此处借用 《图解TCP/IP》书中插图来说明
在这里插入图片描述

拥塞控制

拥塞控制产生的原因在于, 网络同时传输的资源是有限的, 虽然每个人都有自己的流量控制了, 但是当大家只想着自己的数据传输, 而不考虑别人, 如果同时发送的人过多, 就会超过网络传输的上限, 大家都不能正确的发送数据, 所以引入了流量控制.

TCP协议中为了解决问题, 引入了拥塞控制

  • 拥塞控制通过拥塞窗口和慢启动来实现
  • 拥塞窗口和发送数据的滑动窗口一样, 只是限制了发送数据的缓冲区大小
  • 慢启动是一个方法, 来动态的管理拥塞窗口

慢启动

在这里插入图片描述拥塞窗口一开始的大小是1个数据段(1个数据段是1460个字节,这个是以太网的标准),之后开始发送数据, 通过慢启动来动态调整拥塞窗口大小.

丢包重发有两种形式:
第一种: (丢包后, 发送端因为长时间没有收到接收端的响应, 就会重新发送数据, 超过3次, 表明发送超时)
第二种: (同样丢包了, 但是发送端重新发送了, 然后接收到了接收端的确认报文, 表明发送到了, 只不过多发送了几次, 这就是重复确认应答)

  • 拥塞窗口在慢启动时, 会先指数增长, 如果增长中发送数据, 出现数据的超时丢包, 就会设置一个拥塞阀值, 大小为当前拥塞窗口的1/2,并从最小拥塞窗口开始慢启动
  • 当有了拥塞阀值后, 拥塞窗口增长大小超过了拥塞阀值, 就会以线性增长, 而不会指数增长了.
  • 而当出现了重复确认应答后, 就会将拥塞阀值设置为1/2. 并将拥塞窗口设置为拥塞阀值+3个数据段, 然后再次进行慢启动.
  • 如此往复, 以为网络环境是冬天变化的,所以大小也是这样动态变化的.

http://www.niftyadmin.cn/n/3437279.html

相关文章

java中的双重校验锁_[Java学习] 单例模式饿汉式双检锁/双重校验锁中的volatile

双检锁/双重校验锁(DCL,即 double-checked locking)JDK 版本:JDK1.5 起是否 Lazy 初始化:是是否多线程安全:是实现难度:较复杂描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。ge…

JAVA常用类之包装类

JAVA语言包装类把基本数据类型转换为对象。每个JAVA基本类型在java.lang包中都有一个相应的包装类。 基本类型包装类booleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDouble包装类的构造方法 每个包装类都有几种重载形式,以Double…

通信时MTU的获得和路径MTU

由于以太网物理性质的限制,我们在IP层发送数据的时候, 如果发送向物理层的数据包大于物理层的限制, 就会发生错误. 该物理层限制就叫做MTU. 而在网络传输中, 每一条传输线路都有可能有自己不同的传输限制, 虽然路由器可以在IP层进行数据包分片传输, 但是有IP层进行的分片传输, …

Memory Pool 预习知识-Windows内存管理

<<这不是原创&#xff0c;是老文&#xff0c;Pankaj Garg写的&#xff0c;看后翻译了一下&#xff0c;原文可以在http://www.intellectualheaven.com/找到。>>1 介绍Windows 32位 x86 操作系统最多能访问4GB的物理内存。这是因为处理器的寻址总线是32条&#xff08…

java时间格式化错误_Java中日期格式化YYYY-DD的操作bug

写这篇博文是记录下跨年的bug。去年隔壁组的小伙伴就是计算两个日期之间间隔的天数&#xff0c;因为跨年的原因计算有误。当时测试组的小姐姐也没有模拟出来这种场景&#xff0c;导致上生产环境直接影响线上的数据。今天逛技术论论坛正好遇到Java日期的操作bug。1 yyyy 和 YYYY…

智能指针shared_ptr为什么会造成循环引用

循环引用是什么 循环引用是因为智能指针对象所管理的A类型的对象中, 含有指向该A类型对象的智能指针对象 可能会有点绕口, 请注意区分A类型的对象 和 智能指针对象 因为A类型对象 甲中的智能指针对象指向了另外一个A类型对象 乙, 而另外一个A类型对象 乙中的只能指针对象也指向…

MySQL 5.1.38

完全安装包http://mysql.isu.edu.tw/Downloads/MySQL-5.1/mysql-5.1.38-win32.msi包含了安装MySQL所需要的全部文件与配置向导以及可选组件&#xff0c;如基准套件和嵌入式服务器 基本安装包http://mysql.isu.edu.tw/Downloads/MySQL-5.1/mysql-essential-5.1.38-win32.msi只包…

【数据结构+算法】【模拟法】--- 螺旋矩阵填数

【题目描述】在一个n * n的矩阵中按照螺旋样式填入从1一直到n * n的一串整数&#xff0c;下面是当n 4时的矩阵&#xff1a;1 2 3 4 12 13 14 511 16 15 610 9 8 7 现在给出矩阵的边长n&#xff0c;直接输出该矩阵。【输入】一个整数&#xff0c;即矩阵的边长n。&#xff08;n …