(4)TCP拥塞处理 – Congestion Handling

2020-12-08  本文已影响0人  hedgehog1112

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)每收到一个ACKcwnd++; 线性上升

    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

上一篇下一篇

猜你喜欢

热点阅读