TCP拥塞控制
为什么要进行拥塞控制?
防止因为网络中出现大量数据包而导致网络瘫痪,因此当发现异常时要减缓包发送的速率。
怎么判断TCP需要减缓发送数据包?
当网络拥塞的时候会发生啥?考虑对于一个中间路由器,当传送的包的数量超过了它的存储队列的长度,那那些多余的包会被丢弃掉。所以当出现丢包时,TCP很重视这一问题,会立即进入到拥塞控制。
几个概念:
拥塞窗口(congestion window)cwnd:由算法控制。
发送端实际窗口大小W为接收端通知窗口awnd和cwnd的较小者:
W = min(cwnd, awnd)
在外数据值:已发送但是还没有收到对应ACK的数据。
慢启动阀值(slow start threshold)ssthresh:cwnd超过了它就进入拥塞避免阶段。
在没有丢包的情况下,记住上一次最大的操作窗口估计值,即记录TCP最优窗口估计值的下界。
它的初值可以任意指定。当出现重传时,它的计算方式如下:
ssthresh = max(在外数据值/2, 2*SMSS)
拥塞控制的算法:
慢启动
当一个新的TCP连接建立或检测到由重传超时(RTO)导致的丢包时,需要执行慢启动。
目的:让TCP在使用拥塞避免前尽可能得到一个相对较大的cwnd值。
步骤
1、初始时,cwnd等于1。
2、此时能发送1个包,当发送并接收到ACK后,cwnd会增加到2,然后会发送2个包,当收到这两个包的ACK后,cwnd会增大到4,以此类推,成指数式增加。k轮后,W(发送窗口大小)的值会变为2^k。(当ACK是延时ACK时,即使没有收到ACK,cwnd也会以指数形式增加,只不过前面会加一个系数,使得增幅不大。)
3、当cwnd比ssthresh大时,进入拥塞避免状态。
拥塞避免
在拥塞避免状态下,每接收到一个新的ACK,cwnd会作如下更新:
cwnd(t+1) = cwnd(t) + SMSS * SMSS / cwnd(t)
当发生丢包时,有3种方法来处理,分别是Tahoe、快速恢复和Reno。
ssthresh的改变都如下面算式:
ssthresh = max(在外数据值/2, 2*SMSS)
1、Tahoe
若检测到丢包,不论由于超时还是快速重传,都会进入到慢启动状态。
有丢包发生时,Tahoe简单地将cwnd减为1。
2、快速恢复
若为快速重传,会执行以下行为:
1、ssthresh = max(在外数据值/2, 2SMSS)
2、启用快速重传算法,将cwnd设为(ssthresh + 3SMSS)
3、每接收一个重复ACK,cwnd值暂时增加1SMSS
4、当接收到一个好的ACK,将cwnd重设为ssthresh,取消快速恢复
上面第2步和第3步构成了快速恢复。
3、NewReno
快速恢复带来的问题是:当一个传输窗口有多个数据包丢失时,一旦其中一个包重传成功共,发送方就会接收到一个好的ACK,这样快速恢复阶段中cwnd窗口的暂时膨胀就会停止,而事实上丢失的其他数据包可能并未完成重传。导致出现这种状况的ACK称为局部ACK(partial ACK)。
它记录了上一个数据传输窗口的最高序列号(即恢复点)。仅当接收到序列号不小于恢复点的ACK,才停止快速恢复阶段。
采用选择确认机制的TCP拥塞控制
速率减半:在一个RTT时间内,每接收到两个重复ACK,TCP发送方可发送一个新数据包。
待写。。
伪RTO处理——Eifel响应算法
待写。。。
高速环境下的TCP
当网速达到1Gb/s时,传统的拥塞控制算法不能达到很好的性能,因为慢启动阶段表现的比较慢。
待写。。。
基于延迟的拥塞控制算法
待写
缓冲区膨胀
待写
ECN
待写
与TCP拥塞控制相关的攻击
待写