TCP拥塞控制算法(Tahoe/Reno/Newreno)

TCP拥塞控制算法(Tahoe/Reno/Newreno)TCP拥塞控制算法(Tahoe/Reno/Newreno)前言TCP(TransmissionControlProtocol),传输控制协议,是目前__Internet__上最重要的一个通信协议之一,其作用是对数据的传输进行一定的控制;而拥塞控制算法又是TCP中最重要的一个算法之一,接下来我们先来了解一下基本概念,再来详细介绍3个协议中的拥塞控制算法以及他们之间的区别。前期知识储备及名词…

大家好,又见面了,我是你们的朋友全栈君。

TCP拥塞控制算法(Tahoe/Reno/Newreno)

前言

TCP(Transmission Control Protocol),传输控制协议,是目前__Internet__上最重要的一个通信协议之一,其作用是对数据的传输进行一定的控制;而拥塞控制算法又是TCP中最重要的一个算法之一,接下来我们先来了解一下基本概念,再来详细介绍3个协议中的拥塞控制算法以及他们之间的区别。

前期知识储备及名词解释

拥塞:
拥塞是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。可以想象在网络中出现了拥塞会造成多么严重的后果。

滑动窗口协议:Sliding Window Protocol,属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。

拥塞窗口(cwnd):congestion window,当前端在一个RTT内能发送的窗口大小。

接收窗口&&发送窗口:例如,A向B发送数据,B的接收窗口大小会通过ACK返回给A,A的就会选择拥塞窗口和对端的接收窗口中小的一个作为发送窗口的门限值(最大)。

RTO:Retransmission Time Out,超时重传

RTT:Round-trip time,往返时间

ACK:Acknowledgement,我们知道TCP是一个具有可靠性的协议,发送方给接收方发送数据,每收到一个数据包,接收方就会给发送方发送一个确认tcp报文,置ACK为1(ACK是TCP报文中flags之一)
MSS:maximum segment size,最大报文段长度


Tahoe

Tahoe是TCP的最早版本,其主要有三个算法去控制数据流和拥塞窗口。

  • Slow Start(慢启动)
    ssthresh:slow start thresh,慢启动门限值)
    cwnd的值小于ssthresh时,TCP则处于slow start阶段,每收到一个ACK,cwnd的值就会加1。
    仔细分析,其实慢启动并不慢,经过一个RTT的时间,cwnd的值就会变成原来的两倍,实为指数增长。
  • Congestion Avoidance(拥塞避免)
    cwnd的值超过ssthresh时,就会进入Congestion Avoidance阶段,在该阶段下,cwnd以线性方式增长,大约每经过一个RTT,cwnd的值就会加1
  • Fast Retransmit(快重传)
    按照拥塞避免算法中cwnd的增长趋势,迟早会造成拥塞(一般通过是否丢包来判断是否发生了拥塞)。
    如果中网络中发生了丢包,通过等待一个RTO时间后再进行重传,是非常耗时的,因为RTO通常设置得会比较大(避免伪重传:不必要的重传)。
    快重传的思想是:只要发送方收到了三个重复的ACK(如果不了解三个重复ACK如何产生,请温故一下滑动窗口协议),就会立马重传,而不用等到RTO到达(如果没有3个重复的ACK而包丢失了,就只能超时重传);
    并且将ssthresh的值设置为当前cwnd的一半,而cwnd减为1,重回slow start阶段。

Reno

除了包含Tahoe的三个算法,Reno多了一个Fast Recovery(快速恢复)算法。

当收到三个重复的ACK或是超过了RTO时间且尚未收到某个数据包的ACK,Reno就会认为丢包了,并认定网络中发生了拥塞。
Reno会把当前的ssthresh的值设置为当前cwnd的一半,但是并不会回到slow start阶段,而是将cwnd设置为(更新后的)ssthresh+3MSS,之后cwnd呈线性增长。

NewReno

NewReno是基于Reno的改进版本,主要是改进了快速恢复算法。

Reno提出的快速恢复算法提高了包丢失后的吞吐量和健壮性,但缺陷是它只考虑了只丢失一个包的情形,只要丢失了一个包,就被认为是发生了一次拥塞。

在实际的网络中,一旦发生拥塞,会丢弃大量的包。如果采用Reno算法,它会认为网络中发生了多次拥塞,则会多次将cwndssthresh减半,造成吞吐量极具下降,当发送窗口小于3时,将无法产生足够的ACK来触发快重传而导致超时重传,超时重传的影响是非常大的。

在只丢失一个数据包的情况下,NewRenoReno的处理方法是一致的,而在同一个时间段丢失了多个包时,NewReno做出了改进。
Reno快速恢复算法中,发送方只要收到一个新的ACK就会退出快速恢复状态而进入拥塞避免阶段,Neweno算法中,只有当所有丢失的包都重传并收到确认后才退出。
NewReno中,添加了恢复应答判断功能,使得TCP终端可以区分一次拥塞丢失多个包还是发生了多次拥塞。

先了解两个概念:部分应答(PACK)、恢复应答(RACK)
记TCP发送端快速恢复阶段中接收到的ACK报文(非冗余ACK)为ACKx
记在接收到ACKx时TCP终端已发出的序列号(SN)最大的报文是PKTy

  • 如果ACKx不是PKTy的应答报文,则称报文ACKx为部分应答(Partial ACK,简称PACK);
  • 如果ACKx恰好是PKTy的应答报文则称报文ACKx为恢复应答(Recovery ACK,简称RACK)。

NewReno通过以上两种确认应答来判断是否退出快速恢复阶段。
如果收到的PACK并不会退出快速恢复阶段,直到收到RACK(所有丢失的包都被重发且被接受方收到了)才会退出。

总结

以上根据历史发展顺序介绍了TCP的不同版本以及他们之间的区别。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152782.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • spss19安装许可证代码_spss许可证不存在怎么办

    spss19安装许可证代码_spss许可证不存在怎么办联系我们官网:三维逆向网(www.3vnx.com)公众号:软件小秘书(rj-xms)QQ:609201757VX:dyc392001Spss23软件(Win64)下载链接:https://pan.baidu.com/s/1_cK8CxP9brmgw_dkBKwzoQ提取码:rb63Spss23软件(Win32)下载链接:https://pan.baidu.com/s/1pTkQwq…

    2025年6月8日
    3
  • kettle工具 学习

    kettle工具 学习背景:项目需要从客户的数据库迁移一批人口数据,大约240w条。所以我们需要一款工具帮助我们实现数据快速搬运,数据过滤,以得到符合我们使用的安全数据。

    2022年10月10日
    2
  • msdos分区是什么_msdos_partition

    msdos分区是什么_msdos_partition硬盘分区及格式化本例要求熟悉硬盘分区结构,使用fdisk分区工具在磁盘/dev/vdb上按以下要求建立分区:采用默认的msdos分区模式1、第1个分区/dev/vdb1的大小为200MiB2、第2个分区/dev/vdb2的大小为2000MiB3、第3个分区/dev/vdb3的大小为1000MiB,完成分区后4、能够配置开机自动挂载/dev/vdb2分区…

    2022年8月11日
    8
  • vue动态生成表单_vue element 表单验证

    vue动态生成表单_vue element 表单验证前几天接了一个需求,需要动态生成一个表单数据,然后提交,提交完数据后。通过编辑按钮进入时,需要进行数据回填。没生成表单前的状态单机生成表单生成表单根据选择方式展示不同的表单元素如果从编辑页进入该页面有数据的话,进行数据回填样式同第三点相似,这里不再说明思路:请输入标题,请选择类型为父组件;请选择方式为子组件;根据请选择方式出来的内容为孙子组件难…

    2025年6月11日
    3
  • jdbc事物描述_jdbc获取表结构

    jdbc事物描述_jdbc获取表结构数据库事务数据一旦提交,就不可回滚那些操作会导致数据的自动提交?DDL操作一旦执行,都会自动提交-. set autocommit = false不起作用DML默认情况下,一旦执行就会自动提交-. 可以设置set autocommit = false关闭连接的时候会自动提交 Connection connection = DriverManager.getConnection(url, user, password); connection.setAutoCommit

    2022年8月8日
    8
  • 学分查询与统计软件使用说明

    学分查询与统计软件使用说明

    2021年10月7日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号