TCP拥塞控制和网络层采取的策略有密切联系。 重传会使TCP连接的发送端认为在网络中发生了拥塞。于是在TCP的发送端就采取了拥塞控制措施, 但实际上网络并没有发生拥塞。 网络层的策略对TCP拥塞控制影响最大的就是路由器的分组丢弃策略。
“先进先出”FIFO处理规则
路由器的队列通常都是按照“先进先出”FIFO (First In First Out) 的规则处理到来的分组。
当队列已满时,以后再到达的所有分组(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃。这就叫做尾部丢弃策略 (tail-drop policy)。
路由器的尾部丢弃往往会导致一连串分组的丢失, 这就使发送方出现超时重传,使TCP进入拥塞控制的慢开始状态,结果使TCP连接的发送方突然把数据的发送速率降低到很小的数值。
更为严重的是,在网络中通常有很多的TCP连接, 这些连接中的报文段通常是复用在网络层的IP数据报中传送的。
在这种情况下,若发生了路由器中的尾部丢弃,就可能会同时影响到很多条TCP连接,结果使这许多TCP连接在同一时间突然都进入到慢开始状态。这在TCP 的术语中称为全局同步 (global syncronization)。
全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多。
主动队列管理AQM
1998年提出了主动队列管理AQM (Active Queue Management)。
所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组。这样就太被动了。应当在队列长度达到某个值得警惕的 数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组。提醒发送方放慢发送速率, 会有可能减轻网络拥塞甚至不出现拥塞。
AQM 可以有不同实现方法,其中曾流行多年的就是随机早期检测RED (Random Early Detection)。
随机早期检测RED
使路由器的队列维持两个参数:队列长度最小门限THmin和最大门限Thmax 。 RED对每一个到达的分组量,都先计算当前平均队列长度LAV 。
(1) 若平均队列长度小于最小门限THmin,则将新到达的分组放入队列进行排队。
(2) 若平均队列长度超过最大门限THmax,则将新到达的分组丢弃。
(3) 若平均队列长度在最小门限THmin和最大门限THmax 之间,则按照某一概率p将新到达的分组丢弃。
当LAV<Thmin时,丢弃概率p = 0。
当LAV >Thmax时,丢弃概率p= 1。
当THmin <LAV <THmax时, 0 <p <1 。
在RED的操作中,最难处理的就是丢弃概率p的选择,因为p并不是个常数。例如,按线性规律变化,从0变到 pmax。
多年的实践证明,RED的使用效果并不太理想。 2015年公布的RFC 7567已经把RFC 2309列为陈旧的, 并且不再推荐使用RED。
对路由器进行主动队列管理AQM仍是必要的。 AQM实际上就是对路由器中的分组排队进行智能管理,而不是简单地把队列的尾部丢弃。 现在已经有几种不同的算法来代替旧的RED,但都还在实验阶段。