计算机网络--拥塞控制

引言:

TCP与UDP各有各的优缺点,相比于UDP,TCP具有拥塞控制与滑动窗口机制等功能,这里先给自己整理一哈拥塞(se)控制

为什么要用拥塞控制:

因为由于一些原因(接收过多的报文,超过路由器的处理能力)路由器可能会丢弃一些报文,然而定时器这个时候就会处于超时状态,发送端就会重新发送报文,这样反而会恶性循环,加重路由器的拥塞。那么为了控制这种情况设计人员在TCP的加入了拥塞控制功能。

分析有哪些方法可以解决这种情况:

  1. 在发生拥塞的时候,路由器进行流量限制
  2. 发送端减慢自己发送报文的速度
    显然,TCP协议是利用第二种,控制发送端的发送报文速率进行拥塞控制的。

几个名词的认识:

  1. Sender window = Min {rwnd, cwnd}–发送窗口–缓存
  2. rwnd: receiver’s advertised window (接收方宣告窗口)—— a receiver-side limit——流量控制
  3. cwnd: congestion window(拥塞窗口) —— a sender-side limit(反映了网络的拥塞状况)——拥塞控制
  4. 慢启动和拥塞避免
  5. 快速重传和快速恢复
  6. ssthresh:人为设置的阈值

拥塞控制的过程:

  1. 建立一条新的TCP连接以后,执行慢启动:
    ···初始状态cwnd=1(1个最大报文段)
    ···发送方只允许发送1个TCP报文段(因为发送窗口=1)------慢启动实际并不慢,每过1个RTT,cwnd就翻倍,呈2的指数增长(当窗口为1时发送一个报文,经过一个RTT后,窗口大小加1为2,当窗口大小为2时发送两个报文,经过一个RTT时,窗口加2,是每当收到一个报文窗口就加1,以此类推)

    ·等待ACK(即接收端接收报文后会返回一个指定报文)
    ···每收到1个ACK,
    ···发送窗口向右滑动1个报文段的长度
    ···cwnd+1 发送方连续发送2个报文段
    ···直到发送窗口大小=ssthresh(慢启动阈值)
    计算机网络--拥塞控制

  2. ·在慢启动阶段,拥塞窗口以指数形式增长,要避免发生拥塞,当拥塞窗口达到某个值后,必须减慢拥塞窗口的增长规律
    ·当发送窗口大小=ssthresh时,发送方进入拥塞避免阶段
    ·在这个阶段中,只有当窗口中所有报文都确认后,拥塞窗口+1
    ·实质上:每收到1个ACK,cwnd=cwnd+1/ cwnd
    ·当RTT较大时,可以认为是每隔一个RTT,拥塞窗口cwnd+1 à 加性增加(Addictive Increase)
    ·拥塞避免直到出现重传定时器超时,即发生拥塞

  3. ·推测拥塞:超时重传–因为重传定时器超时
    ·ssthresh(慢启动阈值)设置为当前cwnd(拥塞窗口)的一半
    ·即ssthresh = [cwnd / 2]
    ·cwnd(拥塞窗口)= 1
    ·重新执行慢启动:也就是说如果还出现报文超时,那么ssthresh就要一直减半1,但是我好像记得书上有一个公式计算RTT和阈值的,书暂时不在身边网上也找不到,如果记得我我在补上。

  4. ·如果不是超时,而是连续收到3个ACK,处理方式是:
    ·ssthresh(慢启动阈值)设置为当前cwnd(拥塞窗口)的一半–这个与上面的操作是一样的
    ·cwnd=当前阈值–但是这里就与上面不同了,而是设置为当前慢启动阈值,连续收到3个ACK,说明1个报文段可能丢失了,但后面的几个报文段又安全到达
    ·开始拥塞避免阶段

    计算机网络--拥塞控制