TCP的拥塞控制

  1. 窗口机制

    通过调节窗口的大小实现对发送方数据速率的调整。检测整个网络的情况,当整个网络很拥堵,即使接收端的缓存足够大,发送端也要控制发送速度。这里引入了拥塞窗口,当网络很拥堵,拥塞窗口就要小一点。

    真正的发送窗口值:

    在这里插入图片描述

  2. 窗口调整的基本策略

    AIMD:加性增加,乘性减小。

    网络未发生拥塞时,逐渐“加性”增大窗口大小,当网络拥塞时“乘性”快速减小窗口大小。

  3. TCP拥塞控制算法:

    包括了慢开始、拥塞避免、快速重传和快速恢复4部分。

    • 慢开始

      目的:探测网络的负载能力或拥塞程度。

      算法:由小到大逐渐增大注入到网络中的数据字节,即:由小到大逐渐增大拥塞窗口数值。

    • 拥塞避免

      目的:让拥塞窗口cwnd缓慢地增大,避免出现拥塞。

      拥塞窗口cwnd增大:每经过一个往返时间RTT(不管在此期间收到了多少确认),发送方的拥塞窗口cwnd=cwnd+1。

      当网络出现拥塞时

      无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时):

      1. ssthresh = max (cwnd/2,2)

      2. cwnd = 1

      3. 执行慢开始算法

    • 快重传

      目的:让发送方尽早知道发生了个别报文段的丢失。

      发送方只要连续收到三个重复的确认,就立即进行重传(即“快重传”),这样就不会出现超时。

      快重传算法要求接收方立即发送确认,即使收到了失序的报文段,也要立即发出对已收到的报文段的重复确认。

      在这里插入图片描述

    • 快恢复

      当发送端收到连续三个重复的确认时,不执行慢开始算法,而是执行快恢复算法:

      1. 慢开始门限ssthresh=当前拥塞窗口cwnd/2;

      2. 乘法减小拥塞窗口。

        新拥塞窗口cwnd=慢开始门限ssthresh;

      3. 执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

  4. 拥塞控制算法的实现举例:

    在这里插入图片描述

    • 当TCP连接进行初始化时,将拥塞窗口值置为1(窗口单位不使用字节而使用报文段)。慢开始门限的初始值设置为16个报文段,即ssthresh=16。
    • 开始执行慢开始算法时,拥塞窗口cwnd=1,发送第一个报文段。
    • 发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1(每收到一个就加1,每收到两个就加2,以此类推,实际上拥塞窗口值变为原来的2倍),因此拥塞窗口cwnd随着往返时间RTT按指数规律增长。
    • ①当拥塞窗口cwnd增长到慢开始门限值ssthresh时,改为执行拥塞避免算法,拥塞窗口按线性规律增长。
    • ②当拥塞窗口cwnd=24时,网络出现了超时,发送方判断为网络拥塞。调整门限值ssthresh=cwnd/2=12,同时设置拥塞窗口cwnd=1,进入慢开始阶段。
    • ③按照慢开始算法,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1。当拥塞窗口值cwnd=ssthresh=12时,改为执行拥塞避免算法,拥塞窗口按线性规律增大。
    • ④当拥塞窗口cwnd=16时,发送方连续收到3个对同一个报文段的重复确认(记为3-ACK)。发送方改为执行快重传和快恢复算法。
    • ⑤执行快重传和快恢复算法:发送方调整门限值ssthresh=cwnd/2=8,设置拥塞窗口cwnd=ssthresh=8,开始执行拥塞避免算法。
  5. TCP拥塞控制流程图

    在这里插入图片描述


参考资料:《计算机网络(第8版)》—— 谢希仁。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值