TCP拥塞控制
拥塞的基本概念
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫作拥塞(congestion),计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
用来衡量网络拥塞程度的指标
- 由于缓存溢出而丢弃的分组的百分比
- 路由器的平均队列长度
- 超时重传的分组数量
- 平均分组时延和分组时延的标准差
- ......
- 进行拥塞控制是需要付出代价的可能需要在节点之间交换信息和各种命令,以便选择拥塞控制的策略并实施控制,这样会产生额外开销。
- 可能需要预留一些资源用于特殊用户或特殊情况,这样就降低了网络资源的共享程度。
- 然而,为了确保网络性能的稳定,不会因为输入负载的增长而导致网络性能的恶化甚至出现崩溃,使用拥塞控制而付出一定的代价是值得的。
TCP拥塞控制的四种方法
慢开始算法 | 拥塞避免算法 |
---|---|
最开始的时候,将拥塞窗口cwnd设置为1,此后在到达慢开始门限ssthresh之前,每次都将拥塞窗口的大小翻倍,如果翻倍后大于ssthresh,那么就让cwnd=ssthresh | cwnd到达ssthresh后,改用拥塞避免算法,cwnd每个轮次线性增长1,当发生超时重传时,令ssthresh=cwnd/2,cwnd=1 |
快重传 | 快恢复 |
---|---|
发送方在接收到三个冗余的ACK确认后,就立即重发这个数据报,而不是等到计时器超时再重发 | 在发生快重传后,令ssthresh=cwnd/2,cwnd=ssthresh |
这里可以看到,在慢开始阶段如果出现超时重传或者冗余确认,处理方法是和拥塞避免阶段一样的
发送窗口、拥塞窗口、接收窗口的关系
swnd = min(cwnd,rwnd)
TCP拥塞控制与网际层拥塞控制的关系
路由器的尾部丢弃往往会导致一连串分组的丢失,这就使发送方出现超时重传,使TCP进入拥塞控制的慢开始状态,结果使TCP连接的发送方突然把数据的发送速率降低到很小的数值。更为严重的是,在网络中通常有很多的TCP连接(它们有不同的源点和终点),这些连接中的报文段通常是复用在网络层的IP数据报中传送。在这种情况下,若发生了路由器中的尾部丢弃,就可能会同时影响到很多条TCP连接,结果使这许多TCP连接在同一时间突然都进入到慢开始状态。这在TCP的术语中称为全局同步。全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多。
为了避免发生网络中的全局同步现象,在1998年提出了主动队列管理AQM。所谓“主动”就是不要等到路由器的队列长度已经到达最大值时才丢弃后面的分组,这样太被动了。应当在队列长度达到某个值得警惕的数值时(即当网络有了某些拥塞征兆时),就主动丢弃到达的分组。这样就提醒发送方放慢发送速率,因而有可能使网络拥塞的程度减轻,甚至不出现网络拥塞。AQM可以有不同实现方法,其中曾流行多年的就是随机早期检测RED(Random Early Detection)。