预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

TCP拥塞控制 1引言Internet中拥塞控制的大部分工作是由TCP完成的,目前标准TCP协议的实现都包含了一些避免和控制网络拥塞的算法。当今Internet的可靠性和稳定性与TCP拥塞控制机制密不可分,而TCP的成功也要归功于其稳固的拥塞控制机制。随着应用要求的日益丰富和技术的不断发展,要想完全依赖实现在终端系统上的策略和算法很难满足服务质量(QoS)这样复杂的要求,为了解决相应的问题,相关网络技术逐渐转向网络的中间节点即路由器上,通过增强它们的功能来实现端到端无法达到的技术,从而达到有效的拥塞控制,保持网络的良好性能。2产生拥塞的原因当一个网络中出现太多报文分组的时候,网络的性能开始下降,这种情况称为拥塞。拥塞是一种持续过载的网络状态,此时用户对网络资源的需求超过了其固有的容量,这是产生拥塞的根本原因,而端到端之间却存在着直接的原因,主要有:1.存储空间相对不足。主要表现在理由器上,虽然增加存储空间有时可以缓解拥塞的产生,但有时候不但不能缓解拥塞,反而会加剧拥塞。2.带宽容量不足。低速链路对高速数据流的输入也会产生拥塞。3.链路与CPU的处理速度不匹配,造成处理能力弱,速度慢从而引起拥塞。3TCP的拥塞控制机制3.1加法增加乘法减少(AIMD)算法TCP作为Internet上使用最广泛的端到端传输协议,它的拥塞控制机制主要基于加法增加乘法减少(AIMD)算法,该算法定义了3个窗口变量:(1)拥塞窗口(cwnd):它限定了在拥塞控制中源端在一时间段里的最大数据传输量,是来自源端的流量控制。(2)通告窗口(awnd):接受端与源端建立连接后,接收端通告源端它的最大可接受速率,它是来自接受端的流量控制。(3)有效窗口(win):即源端发送数据的实际窗口大小,定义为win=min(cwnd,awnd)AIMD的工作过程可分为两步:(1)源端每收到一个来自接受端的ACK确认,拥塞窗口按cwnd=cwnd+MSS*(MSS/cwnd)(MSS为分组大小)增大,它所表示的实际意义是如果源端发送的分组都在最近的往返时间(RTT)内获得确认,源端就将cwnd加1,即加法增加思想。(2)当数据传送发生超时,TCP认为路线上出现拥塞,并开始减小源端的数据发送速率。每发生一次超时,源端就会重新计算拥塞窗口的值,公式如下: cwnd=cwnd/2 它表示发生一次超时,拥塞窗口将在原来基础上减小一半,即乘法减少思想。3.2TCP拥塞控制的四个阶段这是TCP拥塞控制的核心,也体现了TCP拥塞控制的基本思想,它分为启动阶段,拥塞避免,快速重传和快速恢复阶段。(1)启动阶段当连接刚建立或在发生一次超时的情况下,进入慢启动阶段。一个新的TCP连接建立后,cwnd被初始化为1,源端只被允许发送一个报文段。当发出的报文收到接受端的ACK确认后,cwnd加1,即增加一个报文段发送。在这个阶段中,cwnd随RTT呈指数增长。采用慢启动方法,可以防止TCP在启动一个新的连接时发送过多的数据而造成数据丢失和网络拥塞,同时,由于cwnd实际上以指数规律增长也就避免了单纯的AIMD算法造成的吞吐量增加过慢的问题。cwnd的无限增长必将引起网络拥塞,于是引入一个状态变量:慢启动阈值ssthresh。当cwnd<ssthresh时,TCP执行慢启动算法,cwnd随RTT呈指数增长;当cwnd>ssthresh是,则采用拥塞避免算法,减缓cwnd的增长速度。(2)拥塞避免阶段在拥塞避免阶段,当TCP探测到网络将要发生拥塞,并没有直接采用复位cwnd=1,重新开始慢启动的方法。因为一旦发生拥塞,需要很长的时间来恢复,而慢启动算法中cwnd的指数增长就显得有些激进,它很可能会加重网络拥塞。因此,在这个阶段,采用相对更保守的调节机制改变awnd的增长方式,使它由指数增长变成线性增长,具体过程如下:1.将慢启动阈值ssthresh设置为当前cwnd的一半,即ssthresh=cwnd/2;2.发生超时时,置cwnd=1,在cwnd<ssthresh条件下,TCP执行慢启动;3.awnd>=ssthresh时,执行拥塞避免算法,cwnd每收到一个ACK确认时,只增加1/cwnd个数据包这就使得cwnd随RTT呈线性增长。(3)快速重传和快速恢复阶段由于在拥塞避免阶段,当发生超时时,cwnd重新置1,进入慢启动,这将导致过大减小发送窗口尺寸,很大程度上降低了TCP连接的吞吐量。为了完善TCP的性能,又引入了快速重传和快速恢复机制。快速重传阶段,当源端收到3个或者3个以上的重复ACK确认,即认为发生了数据包丢失,此时将ssthresh设置为当前cwnd的一半,ssthresh=awnd/2,并重新传送丢失的数据包,进入快速恢复阶段。在快速恢复阶段,源端每收到一个重复的ACK,则cwnd加1;