小白笔记
TCP拥塞控制(TCP是典型的端到端的拥塞控制)
TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果一个TCP发送方感知从它到目的地之间的路径没什么拥塞,则TCP发送方增加其发送速率,如果感知有拥塞则降低其发送速率。
但是这种方法提出了三个问题。第一,一个TCP发送方如何限制它向其连接发送流量的速率呢?第二,一个TCP发送方如何感知从它到目的地之间的路径上存在拥塞呢?第三,当发送方感知到端到端的拥塞时,采用何种算法来改变其发送速率呢?
TCP拥塞控制:机制
·端到端的拥塞控制机制
·路由器不向主机有关拥塞的反馈信息
·路由器的负担较轻
·符合网络核心简单的TCP/IP架构原则
·端系统根据自身得到的信息,判断是否发生拥塞,从而采取动作
拥塞控制的几个问题:
·任何检测拥塞: ·轻微拥塞 ·拥塞
·控制策略
·在拥塞发送时如何动作,降低速率
·轻微拥塞,如何降低
·拥塞时,如何降低
·在拥塞环节时如何动作,增加速率
1.TCP拥塞控制:拥塞感知
发送端如何探测到拥塞?要么出现超时,要么收到来自接收方的3个冗余ACK。
1)某个端超时了(丢失事件):拥塞
·超时时间到,某个段的确认没有来
·原因1:原理拥塞(某个路由器缓冲区没空间了,被丢弃)概率小
·原因2:出错被丢弃了(各级错误,没有通过校验,被丢弃)概率小
·一旦超时,就认为拥塞了,有一定误判,但是总体控制方向是对的
2)有关某个段的3次重复ACK:轻微拥塞
·段的第1个ack,正常,确认绿段,期待红段
·段的第2个重复ack,意味这红缎的后一段收到了,蓝段乱序到达
·段的第2,3,4个ack重复,意味着红段的后第2,3,4个段收到了,橙段乱序到达,同时红段丢失的可能性很大(后面3个段都收到了,红段都还没到)
·网络这时还能够进行一定程度的传输,拥塞但全款要比第一种好
2.TCP拥塞控制:速率控制方法 如何控制发送端发送的速率?
TCP连接的每一端都是由一个接收缓存、一个发送缓存和几个变量组成。运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口。拥塞窗口表示为cwnd,它对一个TCP发送方能向网络中发送流量的速率进行了限制。特别是,在一个发送方中未被确认的数据量不会超过cwnd(拥塞窗口)与rwnd(接收缓存中的空闲空间)中的最小值。
·维持一个拥塞窗口的值:CongWin
·CongWin是动态的,是感知到的网络拥塞程度的函数
·超时或者3个重复ACK,CongWin减少
·超时时:CongWin降为1MSS,进入SS阶段然后再倍增到CongWin/2(每个RTT),从而进入CA阶段
·3个重复ack:CongWin降为CongWin/2,CA阶段
·否则(正常收到ack,没有发送以上情况):CongWin跃跃欲试增加
·SS阶段:加倍增加(每个RTT)
·CA阶段:线性增加(每个RTT)
·发送端限制已发送但是未确认的数据量(的上限):LastBytesent-LastByteAcked<=CongWin
·从而粗略地控制发送方往网络中注入的速率
联合控制的方法:
·发送端控制发送但是未确认的量同时也不能够超过接收窗口,满足流量控制要求
·SendWin=min(CongWin,RecvWin)即拥塞窗口、缓冲区空闲尺寸两者的最小值
·同时满足拥塞控制和流量控制要求
3.用什么算法来改变发送速率呢?用TCP拥塞控制算法
该算法包括3个主要部分:1)慢启动 2)拥塞避免 3—)快速恢复。慢启动和拥塞避免时TCP的强制部分,两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式,慢启动比拥塞避免能更快第增加cwnd的长度(不要被名称所迷惑!)
拥塞控制策略:
·慢启动
·AIMD:线性增,乘性减少
·超时时间后的保守策略
TCP慢启动:
在慢启动状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加1个MSS。如图,TCP向网络发送第一个报文段并等待一个确认。当该确认到达时,TCP发送方将拥塞窗口增加一个MSS,并发送出两个最大长度的报文段。这两个报文段被确认,则发送方对每个确认报文将拥塞窗口增加一个MSS,使得拥塞窗口变为4个MSS,并这样下去。这一过程每过一个RTT(往返时间),发送速率就翻番。一次,TCP发送速率起始慢,但是慢启动阶段以指数增长。
·连接建立,CongWin=1MSS(·如MSS=1460bytes&RTT=200mesc 则初始速率=58.4kbps)
·可用带宽可能>>MSS/RTT(应该尽快加速,到达希望的速率)
·当连接开始时,指数型增加发送速率,知道发送丢失事件
·启动初值很低
·但是速度很快
·当连接开始时,指数性增加(每个RTT)发送速率直到发送丢失事件
·每个RTT,CongWin加倍
·每收到一个ACK时,CongWin加1(why)
·慢启动阶段:只要不超时或3个重复ack,一个RTT,CongWin加倍
·总结:初始速率很慢,但是加速却是指数性的
·指数增加,SS(慢启动)时间很短,长期来看可以忽略
然后一定会堵塞,怎么办?改进:
什么时候应该将指数性增长变成线性?
·在超时之前,当CongWin变成上次发生超时的窗口的一半
实现:
·变量:Threshold
·出现丢失,Threshold设置成CongWin的1/2
TCP拥塞控制:AIMD
乘性减:
丢失事件后将CongWin将为1,将CongWin/2作为阈值,进入慢启动阶段(倍增直到CongWin/2)
加性增:
当CongWin>阈值时,一个RTT如没有发生丢失事件,将CongWin加1MSS:探测
拥塞避免:
一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半,即距离拥塞可能并不遥远!因此,TCP无法每过一个RTT在将cwnd的值翻番,而是采用了一种较为保守的方法,每个RTT只将cwnd的值增加一个MSS,而不是MSS翻倍。
但是何时应当结束拥塞避免的线性增长(每RTT 1MSS)呢?与慢启动一样,cwnd的值被设置为1个MSS,当丢包事件出现时,ssthresh的值被更新为cwnd值的一半。接下来进入快速恢复状态。
快速恢复:
在快速恢复中,对于引起TCP进入快速恢复状态的确实报文段,对收到每个冗余的ACK,cwnd的值增加一个MSS。最终,当对丢失报文的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。如果出现超时事件,快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态,当丢包事件出现时,cwnd的值被设置为1个MSS,并且ssthresh的值设置为cwnd值的一半。
总结:TCP拥塞控制
·当Conwin<Threshold,发送端处于慢启动阶段(SS),窗口指数性增长
·当Congwin>Threshold,发送端处于拥塞避免阶段(CA),窗口线性增长
·当收到三个重复的ACKs,Threshold设置成Congwin/2,Congwin=Threshold+3
·当超时事件发生时timeout,Threshold=Congwin/2Congwin=1MSS,进入SS阶段