TCP传输控制协议(4)--拥塞控制

拥塞控制

在前面说的流量控制指的是发送方和接收方端与端的调整,而拥塞是指网络中发生拥塞,该网络中所有主机发送的数据包大于网络吞吐量,拥塞控制就是为了防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。另外如果产生报文段的速度大于TCP下层发送数据包速度会发生本地拥塞。

慢启动算法和拥塞避免算法

如果一开始将大量的数据发送到网络中如果网络不能容纳这么多的包势必会造成网络拥塞,因此在发送时采用慢启动和拥塞避免算法进行发送(在发生丢包也会根据情况调用这两个算法,后面将)
TCP的拥塞制为发送端维护连个新的变量,cwnd拥塞窗口大小,和ssthresh慢启动门限,其中cwnd初始值设为1(单位为报文段可以发送的数据,实际为字节即可以发送的字节数),ssthresh为65535字节, 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半( cwnd和接收方通告窗口大小的最小值),但最少为2个报文段。
慢启动 发送cwnd个报文段然后再收到确认ack时cwnd变为2,当收到下一个ack时cwnd变为4,以指数的形式增长,直到大于ssthresh使用拥塞避免算法,另外发送方取拥塞窗口与通告窗口中的最小值作为发送上限。
拥塞避免 拥塞避免算法要求每次收到一个确认时将cwnd增加(1 个数据段的字节数/ cwnd) 即在一个往返时间内最多为cwnd 增加1个报文段(不管在这个RTT中收到了多少个ACK),其中RTT为连接往返时间,拥塞避免是加性增加其增加速度比较慢。

启动过程在TCP开始发送数据时,首先使用慢启动探测网络状况,当到达其值ssthresh时采用,拥塞避免的方式增加cwnd,如果在慢启动过程中,还未到达ssthresh发生了丢包,即当定时器超时,或者收到多次重复确认(一般为3次) 则判断拥塞发生,如果因为超时引发的则首先重发该段然后将cwnd设为1同时设置ssthresh重新开始慢启动,如果是因为重复确认应答则使用快速恢复的方法进行控制,

超时重传

超时重传,通过设置定时器控制重传,在设定的RTO(重传的超时时间)时间内如果没有收到发送报文回复将重传该报文,并且因为网络波动的不确定性这个值动态设置,通过RTT(连接往返时间)计算获得RTO值控制重传。当发生超时重传时TCP认为网络状况非常糟糕会进入慢启动。

快速重传和快速恢复

快重传算法首先要求接收方每收到一个失序的报文段就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),若是发送方接收到3个重复确认ACK即确认该包已经丢失运行快速恢复算法,不需要继续等待计数器超时,另外如丢失的是1025序号的包,每次传送1024个字节即此时这三个重复确认ACK其确认序号均为1025即请求1025序号的报文段,
快速恢复算法 快速重传与快速恢复经历了几个阶段Tahoe,Reno,NewReno,SACK这里解释后两个
NewReno这个算法是Reno算法的改进,没有使用SACK机制,该算法是在收到连续三个确认ACK时进入快速回复阶段,开始重传重复Acks指示的那个包。如果只有这一个包丢了,那么,重传这个包后回来的Ack会把整个已经被发送传输出去的数据均确认,如果没有则表示该窗口有多个包丢失需要重传,刚才接受的ack未确认进入重传之前发送的所有包则被称为局部ack(partia ack),如果收到partia ack继续重传partia ack没有确认的下一个报文段,直到收到的不是partia ack(即所有重传之前发送的报文段均已确认)结束快速恢复进入拥塞避免,另外设置recover其值为丢包时的最大发送序列号,通过这个判断回复的报文是否是partia ack

1、进入恢复阶段后,发送端重传被认定为丢失的报文,设置慢启动阈值(ssthresh)和拥塞窗口大小(cwnd)ssthresh = cwnd/2,cwnd = ssthresh + 3MSS。
2、收到一个重复ACK,cwnd=cwnd+MSS。
3、当收到partia ack时,发送端重传PACK所确认报文的下一个报文,如果拥塞窗口允许,继续发送新的数据包。假设这个partial ACK的ack number确认了nMSS的数据,那么更新cwnd=cwnd-nMSS,接着更新cwnd=cwnd+1。
4、当发送方收到Recovery point, 发送端认为拥塞中所有被丢弃的报文都已经被重传,拥塞结束,设置cwnd=ssthresh并退出快速恢复状态

注:在恢复阶段cwnd+MSS是因为每次收到一个重复ack表示在网络中有一个报文段离开即其网络可以容纳的报文段可以加1,

SACK即带选择确认的ACK其能够更好地确定发送哪个数据段来填补接收方的空缺,

pipe:TCP发送端发出的未被确认的数据报文数的估计值,网络中正在传输的分组数估计值
scoreboard:发送端保存,记录从SACK选项中得知的未被确认的分组

1、进入快速恢复阶段后,只有当pipe<cwnd时,发送端才发送新数据包或重传丢失数据包。
2、发送端每次新发送或重传一个数据包后,pipe=pipe+1(网络中报文数加一);发送端每收到一个重复的包含SACK选项的ACK包后(新的分组被接到),pipe=pipe-1(网络中报文数减一);
3、当发送端可以发送数据包时,重传scoreboard中指示的最后的数据包,如果计分板为空,则发送新的数据包;
4、当发送端收到partia ack,pipe=pipe-2。因为PACK表示两个数据包离开了pipe,一个是丢失的数据包,一个是重传的数据包;
5、当发送端收到recovery point后退出快速重传阶段,进入拥塞避免算法。
拥塞窗口cwnd就是表示整个网络中可以容纳发送方多少数据,整个拥塞控制就是一直在寻找这个值,pipe表示网络中容纳的报文估计值,当pipe<cwnd(cwnd - pipe >= mss可以发送一个报文段的长度)时表示网络中还可以容纳新的报文段,此时可以继续发送,scoreboard是通过SACK选项获得的丢失报文段(同时接收三次相同的SACK块,SACK选项会返回未接受报文段区间) 如果可以发送报文段,则重传如果记分板为空即需要重传的包已经重传完成,可以传送新的包,整个过程是为了使发送方不要一下重传所有包造成网络拥塞,而是在网络允许下重传。这种方法相较于NewReno可以连续重传多个丢失的报文,不需要等待下一个partia ack的到达,另外SACK是希望能够将拥塞控制和选择重发进行分离。

TCP的拥塞控制和流量控制伴随整个TCP阶段,另外拥塞控制还有很多算法,以上说的只是几个常用的算法。

参考:
《图解TCP/IP》[日]竹下隆史 / [日]村山公保 / [日]荒井透 / [日]苅田幸雄
《TCP/IP详解卷1:协议》 LawrenceBerkeley
《TCP/IP详解卷1:协议》第二版 Kevin R. Fall W. Richard Stevens

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值