TCP的拥塞控制 (一)

拥塞控制不一样于流量控制,拥塞控制是在拥塞发生时,发送方根据必定的反馈,主动调节本身的发送速率,以防止拥塞恶化的行为。算法

1.   网络拥塞

路由器是网络中的关键组件,其内部有必定量的缓冲区,用于缓存来不及转发(forward,或称transmit)出去的packet。若是将网络当作一个总体,那么一个网络的链路容量(link capacity)就取决于网络中的路由器的缓冲区大小。链路容量越大,整个网络可容纳的outstanding(即在网络中propagate)packet就越多。缓存

当网络中的packet较少时,每一个packet进入路由器,会较快被转发出去,几乎没有延迟。而当网络中的packet过多时,路由器来不及转发,大量的packet就会在路由器中排队,等待转发(FIFO),此时packet就有较长的延迟,当缓冲区满时,后进来的packet甚至会被丢弃(lost packet)。这就是拥塞现象(congestion)网络

2.   Duplicate ACK

TCPAcknowledgement机制可知,receiver期待能按序地(in sequence)接受下一个packet。当out-of-order packet(乱序包)发生时,receiver(虽然会缓存乱序包)不会将错就错地回复乱序的包,而是坚持请求以前期待的包。receiver会在对应的ACK中指明未接受的packet中序号最小的一个(也就是一直期待的packet),而不是与错误的packet的相邻的下一个。这样以来,receiver每收到一个乱序包,都会发送一个与上一个ACK内容相同的ACK,直到收到所期待的packet为止,这就造成了重复ACK(duplicate ACK)spa

重复ACK是网络拥塞状况的一个体现,当重复ACK出现时,说明出现了乱序包或者丢包,而乱序包和丢包又是网络拥塞所致使的,所以重复ACK越频繁,网络拥塞越严重。orm

在对网络拥塞的影响程度上,乱序包和丢包是不一样的。前者仅仅意味着packet不是按序到达receiver,被跳过的packet极可能会在后面陆续到达,然后者意味着packet不会再到达了,由于已经在网络上被丢弃了。ci

能够看出,对于乱序包,sender是不须要作任何处理的,而对于丢包,sender须要负责重传丢失的packetsender为了有针对性地处理两种状况,首先要采起必定的机制区分两种状况。统计发现,乱序包形成的重复ACK通常都是1~2个,而丢包形成的重复ACK则是3个及以上。所以,sender能够根据收到的重复ACK的个数,判断是否发生了乱序包或者丢包。路由

3.   Retransmission Timeout

TCP可靠传输的核心是重传机制。当一个packet没有被receiver接收到时,sender须要重传该packet,直到receiver接收到packet为止。it

触发重传有两种状况,且都与ACK有关。最经典的触发重传的状况是超时。当sender发送一个packet以后,即开启timer,等待对应的ACK,若是在timer结束前收到ACK,则认为paceket发送成功,不然认为发送失败,继而进行重传。能够看出timer的超时时间(RTO, Retransmission Timeout)是触发重传的关键,那么sender是如何合理地设置RTO的呢?很显然,RTO是与当前网络环境相关的一个变量,须要实时计算获得。联想到RTT,能够猜想RTORTT存在必定的联系,事实上RTO就是基于SRTT(smoothed RTT)计算获得的,二者存在线性关系。每当发送一个新的packet时,timer就被设置为当前RTO,以后每隔500ms更新一次,当收到相应的ACK时,timer就被中止,不然直到timer递减到0并触发重传。计算RTO的具体算法参考RFC6298io

4.   拥塞控制

Congestion Control不一样于Flow ControlCongestion Control是在拥塞发生时,sender根据必定的反馈,主动调节本身的发送速率,以防止拥塞恶化的行为。ast

sender会根据两种现象探测拥塞的发生:

若是收到来自receiver3个重复ACK(算上原始ACK,实际上有4个相同的ACK),则认为发生了拥塞,而且知道ACK中指明的即为lost packet

若是ACK超时(超过RTO仍未收到ACK),也认为发生了拥塞,而且这种状况说明拥塞更加严重(由于连重复ACK都没收到)

TCP引入了两个变量:rwndcwnd,用于拥塞控制。rwndreceiver的接收窗口(receive window)的大小,也是它所建议的sender的发送窗口的大小,此变量最初目的是用于flow control中,协调双方的发送/接收速率。cwndsender的拥塞窗口的大小,sender所能发送的packet被限制在该窗口内,考虑到Flow Control里的发送窗口,sender最终的发送窗口被定义为min{cwnd, rwnd},所以LastByteSent – LastByteAcked  <= min{cwnd, rwnd}.

cwndrwnd的单位是MSS(maximum segment size),表示TCP容许的最大单个报文的长度,不包括TCP头部信息。

能够粗略地认为发送窗口的大小就是cwndTCP通常在一个 RTT内,将发送窗口里的packet所有发送出去,所以发送速率为cwnd/RTT。所以,sender调节本身的发送速率实际上就是调整cwnd的大小。

相关文章
相关标签/搜索