Data字段表示TCP所需要传输的数据包。
3.1.3 TCP拥塞控制
为了对网络进行拥塞控制我们可以利用发送窗口调节发送端向网络注入分组速率,拥塞控制的目标是将网络中的分组数量文持在一定的水平之下。如果网络中的分组数量超过这个水平,网络的性能会出现急剧恶化[9]。
在早期的TCP协议中发送方建立连接后,数据包陆续不断的发送到网络上,一直到拥塞窗口大小达到接收方给出的最大接收窗口。当发送方和接收方出现在一个局域网时,这种方法是行得通的。但是,如果带宽是有限的,在传输数据过程中,就会产生非常严重的拥塞问题,有些路由器会对数据包进行缓存,但是若路由器缓存耗尽的时候,就会发生丢包,这样会大大地降低TCP的性能。
为了更好地在运输层进行拥塞控制,1999年公布的因特网建议标准[RFC 2581]定义了以下4种算法,即慢启动(slow-start)、拥塞避免(Congestion avoidance)算法、快速重传(fast retransmit)和快速恢复(fast recovery)算法。下面就介绍这些算法的要点。
(1) 慢启动
TCP发送方使用拥塞窗口(congestion window,cwnd)来表示滑动窗口的大小。慢启动算法是一个在连接上控制数据流发送速度的方法。主机开始发送数据时,由于我们这时并不清楚网络的状况,如果立即将较大的发送窗口中的全部数据字节都注入到网络,这时就有可能引起网络拥塞。实际经验证明,较好的方法是先试探一下,我们可以将拥塞窗口端口值逐渐增大[10]。
(2) 拥塞避免
拥塞避免算法是一种处理丢失报文的方法。一般情况,拥塞分为两种:一是当数据流从带宽很高的网络进入带宽较小的网络的时候,会发生拥塞。二是很多输入流一起到达了同一个路由器,且该路由器的输出带宽小于输入带宽时。
为了防止拥塞窗口cwnd的增长引起网络拥塞,还需要另一个状态变量,即慢启动门限ssthresh。慢启动门限ssthresh的用法如下:
当cwnd<ssthresh时,使用慢启动算法。
当cwnd>ssthresh时,改用拥塞避免算法。
当cwnd=ssthresh时,既可使用慢启动算法,也可使用拥塞避免算法。
(3) 快速重传
假定发送端发送了M1、M2、M3、M4共4个报文段[11]。接收端每收到一个报文段后都要立即发出确认ACK而不要等待自己发送数据时才将ACK捎带上。当接收端收到M1和M2后,就发出确认ACK2和ACK3。我们可以假设发生了网络拥塞致使M3丢失了。接收端下一个收到M4,会发现序号不对,但是还是会收下并且把它放在缓冲区中,同时发出确认,不过发出的确认信号是ACK3。这样,发送端发现问题,可能是网络出现了拥塞导致分组丢失,另一种可能是报文段M3尚留在网络中的某处,还要经过较长的时延才能到达接收端。发送端接着发送M5和M6。接收端收到了M5和M6后,也还要分别发出重复的ACK3。这样,发送端共收到了接收端的4个ACK3,其中三个是重复的。在快速重传算法中规定,只要发送端接连收到三个重复的ACK就可认为发生了分组丢失,这时应立即重新传送丢失的报文段M3而不必继续等待超时。不难看出,快速重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。
(4) 快速恢复
当发送方收到一个重复的ACK,根据TCP协议中的确认机制就表示有一个数据包离开了网络,使cwnd加1增加一个新数据进入网络中。其具体步骤如下:
1)当发送端收到连续三个重复的ACK时,就重新设置慢启动门限ssthresh。
2)把cwnd设置为ssthresh+3*SMSS,并重传丢失的报文段(加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络)。 基于OPNET的TCP协议研究与仿真(6):http://www.751com.cn/tongxin/lunwen_1272.html