TCP拥塞控制

一、引言

起初,TCP只有基于窗口的流控制,也就是滑动窗口协议。这是一种局部考虑的控制方式,只有发送方和接收方作为参与者,只考虑接收端的接收能力,而忽视了网络传输能力。

而后,拥塞控制机制被引入,这是一种侧重于整体的控制机制,考虑整个网络的传输能力,是一种全局控制机制。

拥塞控制机制的核心有四:慢启动、拥塞避免、快速重传和快速恢复。


二、慢启动和拥塞避免

发送方维护两个窗口,一个发送窗口和一个拥塞窗口cwnd(congestion window) ,最终允许发送的字节数是他们二者中的最小值。

注意:下文所说的cwnd的大小是指报文段的个数,其实际大小应该是字节数。

(1)当建立新的TCP连接时,cwnd初始化为1,源端按照cwnd的大小发送数据,每接收到一个ACK,cwnd就增加一个发送量,这样cwnd就随着回路响应时间RTT呈指数增长。

2)为了防止cwnd增长过大引起网络拥塞,设置一个慢启动门限ssthresh状态变量。ssthresh的用法如下:

当cwnd<ssthresh,使用慢启动算法

当cwnd>ssthresh,使用拥塞避免算法

当cwnd=ssthresh,慢开始与拥塞避免算法任意

拥塞避免算法让cwnd呈线性增长,即每收到一个ACK,cwnd加1。


3无论是在慢启动阶段还是拥塞避免阶段,只要判定为网络拥塞(根据是发生超时,在规定时间内没有收到ACK,虽然有可能是其他原因造成丢失,但是一律当做网络拥塞处理),则把慢启动门限ssthresh减半,cwnd设为1,然后执行慢启动算法


三、快速重传和快速恢复

快速重传要求接收端在接收到一个失序的报文段后立刻发送重复确认ACK,而不是等到自己发送数据时顺带发送ACK。如果发送端连续收到3个或3个以上重复ACK,则立即重传对方尚未收到的报文段,而不必等待重传计时器时间到期。
(1) 将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小
(2)每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送 1个分组(如果新的cwnd允许发送)。         (3) 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个

ACK应该是在进行重传后的一个往返时间内对步骤 1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值