【JavaEE初阶】 TCP滑动窗口与流量控制和拥塞控制

news/2024/5/17 20:22:38 标签: java-ee, php, java, 网络, TCP

文章目录

  • 🎄为什么出现滑动窗口
  • 🎋滑动窗口丢包问题
    • 🚩情况一:数据包已经抵达,ACK被丢了。
    • 🚩情况二:数据包就直接丢了
  • 🌲流量控制(安全机制)
  • 🌳拥塞控制(安全机制)
  • ⭕总结

🎄为什么出现滑动窗口

了解确认应答策略的人都知道,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候。
在这里插入图片描述
那我们就想,既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)。
在这里插入图片描述

举个例子吧

就相当于你要去买饭,买的有肉夹馍、饺子、炒饭,且三家店铺相隔不远
这时候你有两种买饭策略

  1. 先买好肉夹馍、再买好饺子,再买好炒饭
  2. 先去肉夹馍店里面说:老板,要一个肉夹馍,一会儿来取。然后你又去饺子店:老板,要一个饺子,一会儿来取。然后你又去炒饭店:老板,要一个炒饭,一会儿来取。

这时候你就相当于把三份饭的等待时间都都放在了一起,减少了总体的等待时间,提升了效率

而我们这里的窗口就相当于你一次能带饭的数量,TCP的窗口大小表示的是:

  • 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000
    个字节(四个段)。

  • 发送前四个段的时候,不需要等待任何ACK,直接发送;

  • 收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;
    在这里插入图片描述

  • 操作系统内核为了维护这个滑动窗口,需要开辟 ==发送缓冲区 ==来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉(后面丢包是会有作用)

  • 窗口越大,则网络的吞吐率就越高;

问题来了,如果出现了丢包,如何进行重传?

🎋滑动窗口丢包问题

我们这里分为两种情况来讨论

🚩情况一:数据包已经抵达,ACK被丢了。

发送的数据包已经抵达,回应报文ACK却丢了
在这里插入图片描述
这种情况下,部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认;

这是因为ACK应答报文上的确认序列号表示的是,该字节序以前的报文一全部到达,请下一条报文从该字节序开始。

就比如上图中的1001丢了,但是收到了2001,也就代表2000以前的数据已经全部收到了。所以此时是否收到1001已经无所谓了

🚩情况二:数据包就直接丢了

比如下属情况,1-1000的数据包丢了
在这里插入图片描述

  • 当某一段报文段丢失之后,发送端会一直收到 1001 这样的ACK,就像是在提醒发送端 “我想要的是 1001” 一样;

  • 如果发送端主机连续三次收到了同样一个 “1001” 这样的应答,就会将对应的数据 1001 -2000 重新发送;

  • 这个时候接收端收到了 1001 之后,再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中;

举个例子

一个班需要按照学号排好去打疫苗,需要四个人一组,班长在清点人数时,从前面往后清理人数,遇到1号没来,就会在清点她组内后面三个人的时候让组内人赶快叫她来,在三个人呼喊下终于来了,这时候通知班长人来了,班长已经点到7号了,这时候也就证明前面的人都已经到了

这种机制被称为 “高速重发控制”(也叫 “快重传”)

那么我们如何设置窗口的大小呢?这就不得不提到我们下面讲的两种机制:流量控制、拥塞控制

我们的窗口大小就是由这两个决定的,两者取最小

详细机制介绍如下所示:

🌲流量控制(安全机制)

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制(Flow Control)

  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段,通过ACK端通知发送端;

  • 窗口大小字段越大,说明网络的吞吐量越高;

  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;

  • 发送端接受到这个窗口之后,就会减慢自己的发送速度;

  • 如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

在这里插入图片描述

接收端如何把窗口大小告诉发送端呢?

我们的TCP首部中,有一个16位窗口字段,就是存放了窗口大小信息;

那么问题来了,16位数字最大表示65535,那么TCP窗口最大就是65535字节么?

实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是 窗口字段的值左移 M位;

🌳拥塞控制(安全机制)

虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据。但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题。

因为网络上有很多的计算机,两台计算机中通信要经过很多台交换机和路由器的转发才会最终到达,中间这些机器的处理能力是不确定的。可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。

TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;

  • 此处引入一个概念程为拥塞窗口

  • 发送开始的时候,定义拥塞窗口大小为1;

  • 每次收到一个ACK应答,拥塞窗口乘以2;

  • 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口;

在这里插入图片描述
像上面这样的拥塞窗口增长速度,是指数级别的。“慢启动” 只是指初使时慢,但是增长速度非常快

  • 为了不增长的那么快,因此不能使拥塞窗口单纯的加倍。

  • 此处引入一个叫做慢启动的阈值

  • 当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长
    在这里插入图片描述

  • TCP开始启动的时候,慢启动阈值等于窗口最大值;

  • 在每次超时重发的时候,慢启动阈值会变成原来最大窗口的一半,同时拥塞窗口置回1

注意:

  • 少量的丢包,我们仅仅是触发超时重传;大量的丢包,我们就认为网络拥塞;

  • TCP通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;

拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案

⭕总结

关于《【JavaEE初阶】 滑动窗口与流量控制和拥塞控制》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!


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

相关文章

【LLM_03】自然语言处理基础_1

一、自然语言处理基基本任务和应用1、自然语言处理的基本任务2、搜索引擎的基本工作原理3、知识图谱的构建4、应用 二、词表示与语言模型1、词表示2、上下文3、语言模型4、神经网络在语言模型的应用 三、神经网络1、神经网络基本组成元素2、如何训练神经网络3、计算图的概念4、…

华为校招机试 - 最优高铁城市修建方案(20220529)

题目描述 高铁城市圈对人们的出行、经济的拉动效果明显。每年都会规划新的高铁城市圈建设。 在给定城市数量、可建设高铁的两城市间的修建成本列表、以及结合城市商业价值会固定建设的两城市建高铁。 请你设计算法,达到修建城市高铁的最低成本。注意,需要满足城市圈内城市…

浅谈Elasticsearch监控和日志分析

Elasticsearch 监控和日志分析 Elasticsearch 是一个分布式搜索引擎,它提供了全文搜索、结构化搜索、分析等功能。在实际应用中,监控和日志分析是确保 Elasticsearch 集群稳定、高效运行的关键。本文将详细讲解 Elasticsearch 的监控和日志分析功能&…

重写history.pushState添加自定义事件

1. 添加自定义事件的方法 var event new CustomEvent(xxx, { detail: {...略}); 注意要dispatch一下: window.dispatchEvent(event); 2. 使用自定义事件 // 监听路由变化 window.addEventListener("my-popstate", ev > { console.log(&…

ubuntu22.04 x86环境上使用QEMU搭建arm虚拟机

1、安装qemu及相关依赖 apt-get -y install qemu apt-get -y install bridge-utils apt-get -y install vnc4server apt-get -y install qemu-kvm apt install -y qemu-system-arm apt-get -y install libvirt0 apt-get -y install libvirt-daemon apt-get -y install l…

【tg】 5 :线程切换

manager 可以切到 其他类的其他线程去执行。线程切换 先通过 networkmgr 线程 执行 ,但是传递了Manager 自己的线程 进去。在networkmgr 的network线程中,获取到stats数据,然后扔给 manager的线程thread ,去posttask 还行这个task里调用了mediamanager 的perform ,在media…

STM32F4X SDIO(九) 例程讲解-SD卡擦除、读写

STM32F4X SDIO (九) 例程讲解-SD卡擦除、读写 例程讲解-SD卡擦除、读写SD卡擦除CMD32:ERASE_WR_BLK_START命令发送命令响应 CMD33:ERASE_WR_BLK_END命令发送命令响应CMD38:ERASE命令响应 CMD13:SD_CMD_SEND_STATUS命令发送命令回应 SD卡读数据CMD16:SET_…

【腾讯云 HAI域探秘】探索AI绘画之路:利用腾讯云HAI服务打造智能画家

目录 前言1 使用HAI服务作画的步骤1.1 注册腾讯云账户1.2 创建算力服务器1.3 进入模型管理界面1.4 汉化界面1.5 探索AI绘画 2 模型参数的含义和调整建议2.1 模型参数的含义和示例2.2 模型参数的调整建议 3 调整参数作画的实践和效果3.1 实践说明3.2 实践效果13.3 实践效果23.4 …