拥塞是由于一个或多个交换节点(如路由器)的数据报过载,出现严重的时延。当系统出现轻度拥塞时,路由器的队列中有大量的数据报排队等待路由;系统严重拥塞时,数据报的总数超过了路由器的容量,路由器只能丢弃数据报。由于TCP采用了超时重传机制,因此,如果拥塞不加以控制,可能导致大量的报文重传,并再度引起大量的数据报丢弃,直到整个网络瘫痪。这种现象称为拥塞崩溃(congestion collapse)。
为了避免拥塞崩溃,TCP必须在拥塞发生时减少传输。由于互联网往返时延波动很大,因此必须设计有效的避免拥塞的算法。
目前,TCP主要通过滑动窗口机制来控制发送的数据量,窗口的大小通过以下公式来确定:
许可的窗口=Min(通知窗口,拥塞窗口)
其中,通知窗口已经在TCP流量控制和TCP数据报格式两节中有过介绍,根据接收方的接收能力来确定,防止接收方数据过载。拥塞窗口则根据报文超时的情况动态调整,用于避免网络交换节点数据报过载。显然,TCP许可的窗口大小应该同时满足两个窗口的要求,因此,取两个窗口大小的较小值。
那么,拥塞窗口的大小是如何确定的呢?
TCP标准采取了三种技术来确定拥塞窗口的大小,避免拥塞。这三种技术分别是慢启动、拥塞避免和加速递减。
慢启动是指当启动一个新的连接或者在拥塞后重新发送报文段时,以一个报文段作为拥塞窗口的初始值,以后每次收到一个确认之后,将拥塞窗口增加一倍;
拥塞避免是在慢启动技术的基础上,增加一个拥塞窗口的增加条件。当拥塞窗口的大小达到上次拥塞时窗口大小的一半时,以后窗口中所有的报文段都确认后,窗口大小增加1,而不是1倍;
加速递减是指一旦发现丢失报文段,立即将拥塞窗口的大小减半,直到窗口大小为1。对于保留在发送窗口中的报文段,其超时定时器的时限增加1倍。
下面的动画反映了TCP三种拥塞控制技术的应用方法: