上一篇文章我们说了阻塞控制的原理,在本篇文章中我们将结合实际说一说TCP阻塞控制的原理.
TCP必须使用端到端拥塞控制而不是网络辅助的拥塞控制,因为lP层不向端系统提供显式的网络拥塞反馈。拥塞控制的过程是源主机不断试探网络传输能力的过程,它使用的算法也适用于很多其他控制过程,这是我们学习这一节课的目的之一。
TCP采用的方法是让发送方根据所感知到的网络拥塞,来限制其向一个TCP连接发送数据的速率。如果一个TCP发送方没有感知到拥塞,它就会增加其发送速率;如果感知到拥塞,则降低其发送速率。
在大多数操作系统中使用TCPReno拥塞控制算法。
TCP连接的每一端都由一个接收缓存、一个发送缓存和几个控制变量组成。
TCP拥塞控制机制使用一个控制变量,即拥塞窗口(congestionwindow)来表征网络的拥塞情况。拥塞窗口表示为CongWin,它对一个发送方能发送的速率进行了限制。发送方这边通过限制未被确认的数据量,不超过CongWin与RcvWin中的最小值,来限制发送速率。
发送窗口=min{CongWin,RcvWin}
因为TCP报文段的编号使用字节流顺序,拥塞窗口自然也就使用字节为单位。
在每一个往返时延(RTT)的起始点,上面的限制条件允许发送方发送CongWin个字节的数据,在该RTT结束时发送方接收到确认报文。因此,这时的发送速率大概是CongWin字节/秒。通过调节CongWin的值,发送方就能调整它向连接中发送数据的速率。
TCP发送方通过“丢包事件”感知在它与目的地之间的路径上出现的拥塞。
TCP发送方的“丢包事件”定义为:要么出现超时,要么收到来自接收方的3个冗余ACK。
当出现拥塞时,这条路径上的某台路由器的缓存会溢出,导致数据报丢弃。丢弃的数据报接着会引起发送方的丢失事件(要么超时要么收到3个冗余ACK),发送方就认为在路径上出现了拥塞。
在没有出现丢包事件的情况下,TCP的发送方将收到先前未确认报文段的确认.TCP将这些确认的到达作为一切正常的标志,并增加拥塞窗口的大小(及其传输速率)。
TCP发送方在感知到拥塞时,为调节其发送速率采用了某种算法。这个算法就是拥塞控制算法,TCP拥塞算法包括三个主要部分:
1加性增、乘性减
2慢启动
3对超时事件的反应。
算法对CongWin控制变量的调整是以MSS(MaximumSegmentSize,最大报文段长度)字节为单位进行的。
1加性增、乘性减
拥塞控制的基本思想是,当出现丢包事件时,让发送方降低其发送速率(通过减小拥塞窗口的大小)。因为通过该相同拥塞路由器的其他TCP连接也很可能出现丢包事件,所以它们也可能会通过减小其拥塞窗口值来降低其发送速率。整体作用结果是所有通过这一拥塞路由器的发送源来降低它们的速率,从而减轻了路由器的拥塞程度。
TCP采用了一种“乘性减”的方法,即每发生一次丢包事件就将当前的拥塞窗口值减半。CongWin值的会减小,但是不会降到低于1个MSS。
没有拥塞时,TCP缓慢地增加其拥塞窗口的大小。
即每次它收到一个确认后就把CongWin增大一点,其目标是在每个往返时延内Congwin增加一个MSS(在拥塞避免阶段这样工作)。无论何时一个新的确认到达,将它的Congwin增加一个MSS大小的字节数。
总之,当TCP发送方感受没拥塞时就加性地增加其发送速率,当觉察到拥塞时(通过丢包事件)就乘性地减小其发送速率。所以这个算法常常被称为加性增、乘性减算法。
TCP拥塞控制协议的线性增长阶段被称为避免拥塞。Congwin值重复地经历一种升降循环,即重复地线性增长,然后又突然降至其当前值的一半(当发生丢包事件时),这使得TCP连接的CongWin变化呈锯齿形状。
2.慢启动
当一个TCP连接开始时,CongWin的值初始置为1个MSS,这就使得初始发送速率大约为MSS/RTT。
TCP发送方在初始阶段不是线性地增加其发送速率,在慢启动阶段,每当一个传输的报文段被确认后,CongWin的值就增加1个MSS,由于TCP一次发送多个报文段进入网络,从而使发送方的发送速率在经过一个RTT时间后成倍增长。TCP发送方以指数速度增加其发送速率,直到发生一个丢包事件为止,此时CongWin将被降为一半,然后就会像上面所讲的那样线性地增长。因此,在这个慢启动的初始化阶段期间,TCP发送方以慢速率(因此叫慢启动〕发送,但是以指数增加的速度快速增加其发送速率。
3.对超时事件作出反应
即对因超时而检测到的丢包事件做出的反应与对因收到3个冗余ACK而检测到的丢包事件做当的反应是不同的。
收到3个冗余ACK后,TCP将拥塞窗口减小一半,然后线性地增长。
但是超时事件发生时,TCP发送方进入一个慢启动阶段,即它将拥塞窗口设置为1MSS,然后窗口长度以指数速度增长。拥塞窗口持续以指数速率增长,直到CongWin达到超时事件前窗口值的一半为止。此后,CongWin以线性速率增长,就像收到3个冗余ACK一样。
TCP通过维持一个称为阈值(Threshold)的变量来确定慢启动将结束并且拥塞避免将开始的窗口长度。变量Threshold初始化时被设置为一个很大的值。每当发生一个丢包事件时,Threshold值就会被设置为当前CongWin值的一半。
TCF发送方在一个超时事件发生后就进入慢启动阶段。在慢启动阶段中,CongWin值以指数速率快速增长,直至CongWin达到Threshold为止。当CongWin达到Threshold时,TCP就进入拥塞避免阶段,在该阶段中,CongWin如前所述线性地增长。
结合上述文字再配合图会更清晰:
网友评论