TCP拥塞控制基础——Jacobson[88]

Jacobson【88】是当前TCP协议的拥塞控制算法的基石,其重要性不言而喻。

在其论文中提出的算法有:

(1) RTT 变化的预计

(2) 重传定时器的指数规避(exponential backoff)

(3) 慢启动

(4) more aggressive receiver ack policy

(5) 拥塞窗口的动态调整

 

以上算法建立于下面的准则之上:

The flow on a TCP connection should obey a 'conservation of packets' principle。

 也即数据包守恒准则。

A new packet isn't put into the network until an old packet leaves.

论文认为拥塞发送就是由于上述的准则被破坏,并提出了几种情况:

(1) 连接没有达到平衡

(2) 在old 数据包没有离开网络时就发送了new 数据包

(3) 网络路径上的资源限制致使无法达到平衡。

 

 

以下分析如何设计算法来修复上面的3个问题

 

慢启动-达到平衡

• Add a congestion window, cwnd, to the perconnection state.
• When starting or restarting after a loss, set cwnd to one packet.
• On each ack for new data, increase cwnd by one packet.
• When sending, send the minimum of the receiver's advertised window and cwnd.

第3条每个ack到达cwnd就加1,在一个RTT内,就增大一倍(后面的分析)

 

 

 

 

RTT计算

由于重传定时器的定时间隔依赖于RTT,所以RTT的正确与否决定重传的正确性。

在网络传输的过程中,RTT的值是变化的,所以需要及时更新。RFC793中的算法做出

改进。

 

拥塞避免

如果RTT无误的话,数据包丢失的原因要么是数据损坏,要么是传输路径发生拥塞。

如果TCP源端发现超时或收到3个相同ACK副本时,即认为网络发生了拥塞

算法:

• On any timeout, set cwnd to half the current window
size (this is the multiplicative decrease).
• On each ack for new data, increase cwnd by
1/cwnd (this is the additive increase).
• When sending, send the minimum of the receiver's
advertised window and cwnd.

cwnd在每次收到一个ACK时只增加1/cwnd个数据包,这样,在一个RTT内,cwnd将增加1

在实际中,慢启动和拥塞避免总是一起工作的。

对于每个连接维持2个变量:1)拥塞窗口大小cwnd 2)慢启动门限ssthresh

  1. 对于一个给点的连接,初始化cwnd为1,ssthresh为65535
  2. tcp输出数据包为cwnd和对方通告窗口的较小者;
  3. 发送拥塞时(发送方定时器超时或受到3个重复的ACK时)ssthresh设置为当前cwnd的一半。对于超时引起的拥塞,cwnd设置为1(报文段),进入慢启动;而对于重复ack的拥塞则设置cwnd为ssthresh+3*MSS。然后开始重传丢失的报文
  4. 当新的数据被确认后,就增加cwnd。如果cwnd小于或等于ssthresh,就执行慢启动算法,否则执行拥塞避免。慢启动一直持续到ssthresh为止。

你可能感兴趣的:(TCP拥塞控制基础——Jacobson[88])