• 网络——TCP拥塞控制


    在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞(congestion)。
    若出现拥塞而不进行控制,那么整个网络的吞吐量将随着输入负荷的增大而下降。

    四种拥塞控制算法:
    慢开始(slow-start)
    拥塞避免(congestion avoidance)
    快重传(fast retransmit)
    快恢复(fast recovery)

    发送方发送TCP数据报文段;接收方发送TCP确认报文段。

    慢开始和加法增大

    1 发送方维护一个叫拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。

    • 拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些。
    • 判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)。

    2 发送方将拥塞窗口作为发送窗口swnd,即 swnd=cwnd
    3 发送方还要维护一个慢开始门限ssthresh状态变量:

    • 当cwnd < ssthresh时,使用慢开始算法
    • 当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法
    • 当cwnd = ssthresh时,既可使用慢开始算法,也可以使用拥塞避免算法

    在这里插入图片描述

    当重传计时器超时,判断网络很可能出现了拥塞(网络拥塞时cwnd=24),进行以下工作:
    1 将ssthresh值更新为发生拥塞时cwnd值的一半(ssthresh=12);
    2 将cwnd值减少为1,并重新开始执行慢开始算法;
    当慢开始算法执行到拥塞窗口值增大到新的慢开始门限值(ssthresh=12)时,就停止使用慢开始算法,转而执行拥塞避免算法

    “慢开始”是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢;
    “拥塞避免”也并非指能够完全避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使得网络比较不容易出现拥塞

    快重传和快恢复

    在这里插入图片描述
    采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。
    1 所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。

    • 这就要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
    • 即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
    • 发送方一旦收到3个连续的重复确认,就将响应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传
    • 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%

    2 发送方一旦收到3个重复确认,就知道现在只是丢失了个别报文段。于是不启动慢开始算法,而是执行快恢复算法;

    • 发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半;开始执行拥塞避免算法。
    • 也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3

    在这里插入图片描述

    真题嗅探

    【例】(2009年39题)一个TCP连接总是以1KB的最大段长发送TCP段,发送方只有足够多的数据要发送。当拥塞窗口为16KB时发生了超时,如果接下来4个RTT(往返时间)内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是_____。
    A 7KB
    B 8KB
    C 9KB
    D 16KB
    【分析】
    在这里插入图片描述
    「当拥塞窗口为16KB时发生了超时」,此时拥塞窗口cwnd值更新为1,慢开始门限值ssthresh值更新为发生拥塞时cwnd值的一半,即就是ssthresh=16/2=8;接下来会执行慢开始算法,经过第一个RTT,cwnd=2;经过第二个RTT,cwnd=4;经过第三个RTT,cwnd=8;此时达到了门限值ssthresh的值8,开始执行拥塞避免算法,经过第四个RTT,cwnd=9。

    【例】
    在这里插入图片描述
    这里不用等到t4,在t3时刻客户端已经收到了三个重复冗余的ack_seq,则会立即重新发送ack_seq=100的报文

    更多内容可参考:TCP的流量控制和拥塞控制

  • 相关阅读:
    【日常系列】LeetCode《18·二叉树3》
    嵌入式开发环境Vscode开发STM32单片机程序
    传输层-传输控制协议(TCP)
    ※基本数据类型的包装类、String类、String增强类StringBuilder和StringBuffer、BigDecimal类、Math类
    劳务派遣怎么交社保
    基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)
    Fork() 函数:“父” 与 “子” 进程的交互(进程的创建)
    金色年华里的爱之旅-无忧交友
    【uni-app】开发问题汇总
    HTTPS的工作流程
  • 原文地址:https://blog.csdn.net/vavid317/article/details/126002544