TCP 拥塞窗口原理

“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞

  • cwnd = i

  • 经过 1 RTT, cwnd = i+1

  • 2 RTT, cwnd = i+2

  • 3 RTT, cwnd = i+3

快速重传

TCP 有一个快速传输特性——在它的计时器到期之前重新传输丢失的段。 为了允许快速传输,我们需要为发送方和接收方设置一些规则。

  • 作为接收者,它应该始终发送它期望接收的序列号。 例如,当接收方接收到第 1 段时,它以 ACK2 响应,

  • 作为发送方,它应该忽略定时器并在收到 3 个重复的ACK 后立即开始重传丢失的段。

用一句话概况,就是发送端在收到3个重复无序的ACK时候,它假定数据包丢失并重传该数据包,而无需等待重传计时器到期。

而在此时,拥塞窗口的变化过程如下:

  • ssthresh设置为拥塞窗口的1/2

  • 拥塞窗口大小设置为ssthresh

  • 重新进入拥塞避免阶段

快速恢复

  • 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。

  • 每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发 Java开源项目【ali1024.coding.net/public/P7/Java/git】 送1个分组(如果新的cwnd允许发送)。

  • 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

算法

快速重传和快速恢复的目的是:快速恢复丢失的数据包。 如果没有快速重传和快速恢复这俩算法,那么tcp可能

Tahoe

Tahoe算法是TCP的早期版本。除了具备TCP的基本架构和功能外,引入了慢启动、拥塞避免以及快速重传机制。 在该算法中,快速重传机制策略如下:

  • ssthresh设置为拥塞窗口的1/2

  • 拥塞窗口大小设置为1

  • 重新进入慢启动阶段

Reno

Reno与Tahoe相比,增加了快速恢复阶段,也就是说,完成快速重传后,进入了拥塞避免阶段而不是慢 启动阶段。 Reno 在快速重传阶段,重新发送数据之后:

  • ssthresh设置为拥塞窗口的1/2

  • 拥塞窗口设置为之前的1/2

  • 进入快速恢复阶段

  • 在快速恢复阶段,每收到重复的ACK,则cwnd加1;收到非重复ACK时,置cwnd = ssthresh,转入拥塞避免阶段;

  • 如果发生超时重传,则置ssthresh为当前cwnd的一半,cwnd = 1,重新进入慢启动阶段。

Reno快速恢复阶段退出条件:收到非重复ACK。

NewReno

在Reno版本中,若同时有多个数据包丢失,则大部分必须等到TimeOut之后,才进行重传。这是因为在Reno中,同时有多个数据包丢失时,只要收到部分丢失数据的ACK,便退出快速恢复。而之所以能收到部分丢失数据的ACK,这是因为在快速重传阶段,只重新发送了部分丢失的数据。而在Reno结束快速恢复,进入拥塞避免阶段之后,对于其他未重新发送的数据包来说, 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 常常没有足够的重复ACK来触发快速重传机制。只好等等TimeOut,而TimeOut对于TCP性能有非常大的影响,在等待TimeOut这段时间,无法发送新的数据包,而在TimeOut之后,CWND被重新设置为1。

基于上述原因,NewReno优化了该机制,NewReno在收到部分丢失数据的ACK后,并不会退出快速恢复阶段,而是等待所有丢失的包都重新发送之后,才退出快速恢复阶段。这就使得NewReno在遇到多个数据包同时丢失时,不需要等待TimeOut,便可重新发送所有丢失的数据包,进而减小TimeOut对性能的影响。

SACK

除了NewReno的方法之外,要解决大量数据包丢失的问题,还有一个解决方案,就是让发送端知道,哪些数据包已经送达,哪些数据包已经丢失。 SACK修改在接收端发送重复的ACK时,同时在ACK中携带连续的已经收到的数据序列号范围,而连续数据序号范围与连续数据序号范围之间的间隔就是已经丢失的数据。

滑动窗口与拥塞窗口


共同点:提高网络性能。

不同点:

  • 流量控制:在TCP连接上实现对发送流量的控制,考虑点对点之间对通信量的控制,端到端,即:控制发送端的数据发送速率,使接收端可以来得及接收,保证网络高效稳定运行。

  • 拥塞控制:处理网络拥塞现象,考虑网络能够承受现有的网络负荷,全局性变量,涉及所有的路由器、主机以及与降低网络传输性能有关的因素。防止过多的数据注入到网络,使网络中的路由器或链路不致过载,确保通信子网可以有效为主机传递分组。

Q&A


1、在一个窗口内重复丢包会造成影响吗? 会。如果只丢一个包,那么收到非重复ACK时,就能确认完本窗口内所有的包。然后进入拥塞 避免阶段。这就是Reno想达到的。 而如果丢失多个包,那么收到非重复ACK时,不能确认完本窗口内所有的包。但是,也会退出快速恢复, 进入拥塞避免阶段。

这个时候可能会发生两种情况:

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

TCP 拥塞窗口原理_第1张图片

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

TCP 拥塞窗口原理_第2张图片

还有源码相关的阅读学习

TCP 拥塞窗口原理_第3张图片

edis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-tVfpMFL5-1650521757298)]

还有源码相关的阅读学习

[外链图片转存中…(img-VzYSjIVB-1650521757299)]

你可能感兴趣的:(Java,经验分享,面试,java)