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的值是变化的,所以需要及时更新。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