(4)TCP拥塞处理 – Congestion Handling
1、背景:TCP用Sliding Window做流控(Flow Control),要依赖连接发送端和接收端,不知道网络中间发生什么。ps:伟大协议仅做流控不够,流控只是网络模型4层以上事,TCP要知道整个网络上事。
2、拥塞处理:TCP通过timer 采样RTT 并 计算RTO,如网络延时突然增加,TCP只有重传数据,导致负担更重,更大延迟丢更多包,恶性循环,拥塞发生,把路让出来,不去抢路
RTT: 发数据包——收对应ACK,花费时间
RTO: 发数据包——启动重传定时器到期,花费时间
3、概要:四个算法:1)慢启动;2)拥塞避免;3)拥塞发生;4)快速恢复
一、慢热启动算法 – Slow Start
刚加入网络的连接,一点点提速,不要地把路占满
1、慢启动的算法(cwnd Congestion Window):
1)连接建好,初始化cwnd = 1,表明可传一个MSS大小数据(cwnd 初始10个MSS)
2)每收到一个ACK,cwnd++; 线性上升
3)每过一个RTT,cwnd = cwnd*2; 指数上升
4)还有ssthresh(slow start threshold)上限,cwnd >= ssthresh进入“拥塞避免算法”
ps:cwnd跟MSS值来变,如MSS< 1095,cwnd = 4;如MSS>2190,cwnd=2;其它情况3
如网速很快,ACK返回快,RTT短,慢启动就不慢
二、拥塞避免算法 – Congestion Avoidance
一般ssthresh是65535字节,达到这值后,算法(线性上升):
1)收一个ACK时,cwnd = cwnd + 1/cwnd
2)过一个RTT时,cwnd = cwnd + 1
可避免增长过快,导致网络拥塞,慢慢增加调整,到网络最佳值
三、拥塞时算法
丢包时两种情况:
1)等RTO超时,重传数据包(太糟糕,反应强烈)
sshthresh = cwnd /2 cwnd 重置为 1 进入慢启动过程
2)Fast Retransmit算法,收到3个duplicate ACK开启重传,不等到RTO超
TCP Tahoe实现和RTO超时一样
TCP Reno实现:1.cwnd = cwnd /2 2.sshthresh = cwnd 3.进入快速恢复算法——Fast Recovery
RTO超时后,sshthresh变cwnd一半,如cwnd<=sshthresh时丢包,sshthresh减半,cwnd指数增涨爬到这时,就成慢慢线性增涨。TCP怎么通过强烈震荡快速而小心,找到流量平衡点
四、快速恢复算法 Fast Recovery
在没有SACK支持下改进Fast Recovery算法
1)sender收3个Duplicated Acks,进入Fast Retransimit模式,重传重复Acks指示的包。
2)如只丢这一个,重传回的Ack,会把整个发的数据ack回来。如没有,说明包丢了,叫这个ACK为Partial ACK(部分ack)
3)Sender发现Partial ACK,sender知道有多个包被丢,继续重传sliding window里未被ack的第一个包。直到收不到Partial Ack,结束Fast Recovery
“Fast Recovery变更”:激进同时延长Fast Retransmit和Fast Recovery过程
http://www.52im.net/forum.php?mod=viewthread&tid=515