一、拥塞控制原理
拥塞控制方法
-
端到端拥塞控制
- 没有来自网络的显示反馈
- 端系统系统延迟和丢失时间推断是否有拥塞
- TCP采用这种方法
-
网络辅助的拥塞控制
- 路由器提供给端系统以反馈信息
- 单个bit位置,显示有拥塞(SNA,DECbit TCP/IP ECN,ATM)
- 显示提供发送端可以采用的速率
- 路由器提供给端系统以反馈信息
二、TCP拥塞控制
发送方的TCP拥塞机制跟踪一个额外的变量,即拥塞窗口(congestion window),表示为cwnd,它对TCP发送方能够向网络中发送流量的速率进行控制。
TCP拥塞窗口的长度与流量控制接收窗口长度相结合(滑动窗口):
在一个发送方中,未被确认的数据量不能超过cwnd和rwnd(recive window)的最小值
LastByteSend – LastByteAck <= min{cwnd,rwnd}
拥塞判断
TCP采用端到端的拥塞控制,通过发送方的“丢包事件”来定义:确认超时或收到来自接收方的3个冗余ACK。
TCP发送方通过如下原则确定发送速率使得网络既不会阻塞,又能充分利用可用带宽:
-
一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率
丢失可能是由于网络节点的缓存队列满了导致的丢失,也可能是由于请求头bit错位,服务端没法解析导致的丢失。
对于后者,概率本来就很小,加之TCP网络减速后还有相应的策略探测进行加速
-
一个确认报文段段指示网络正在向接收方交付发送方的报文,因此,当对先前发送的未确认报文段确认到达时,能够增加发送方的速率。
确认的到达是一切顺利的隐含指示,表示该网络不拥塞,可以适当增加拥塞窗口长度
-
带宽探测。给定ACK指示源到目标路径无拥塞,丢包或者冗余ACK指示路径拥塞,TCP调节其传输速率的策略是增加其速率以响应到达的ACK,除非出现拥塞事件才减小传输速率。
TCP拥塞控制算法
该算法主要包含3部分:慢启动、拥塞避免、快速恢复。其中慢启动和拥塞避免是TCP的强制部分,两者的区别在于收到ACK时,增加cwnd长度的方式
-
慢启动
当TCP连接建立后,第一次发送数据时,cwnd的值通常设置为一个MSS的较小值,收到一个ACK确认后,拥塞窗口长度就增加一个MSS,发送两个MSS长度的报文段,这两个报文段再收到两个ACK后,每个确认报文都会使发送方拥塞窗口再增加一个MSS,变成4个MSS,并这样依次下去。慢启动过程,拥塞窗口长度的增长是指数形式。
当出现拥塞时(超时/冗余ACK),TCP策略:
-
超时
慢启动出现了超时的情况后,cwnd将被置1,重复慢启动的过程,但在这次慢启动的过程中有一个慢启动阈值ssthresh=原cwnd/2,该值表示如果发送速率达到该值后,发送速率不能再以指数形式增长了,而要采用保守的策略,结束慢启动并且TCP转移到拥塞避免模式
-
冗余ACK
如果慢启动出现了3次冗余ACK,则说明当前通道即将阻塞,则将cwnd置为原来的1/2,然后结束慢启动,TCP执行快速重传,进入快速恢复状态
-
-
拥塞避免
一旦进入拥塞避免模式,cwnd的值大约为上次拥塞时cwnd值的一半,即距离拥塞用不遥远了!。这时不能再采用每过一个RTT就将cwnd翻倍的策略,而是要采用一种保守的策略,每过一个RTT,就将cwnd的长度值增加一个MSS。
具体实现(通用方式):假设MSS是1460字节,cwnd是14600字节,则在要给RTT内发送10个报文段,每个到达的ACK增加1/10MSS的拥塞窗口长度,对所有的10个报文确认后,则增加一个MSS长度的拥塞窗口
当拥塞避免出现超时,则重新计算拥塞阈值,然后进入慢启动过程
当拥塞避免出现了丢包(收到三个冗余ACK)的情况,cwnd的值会加上三个MSS,然后将ssthresh的值记录为cwnd的一半,然后进入快速恢复模式
-
快速恢复
对于引起TCP进入快速恢复状态的冗余ACK,对于收到的每个冗余的ACK,cwnd的值都增加一个MSS。当收到三个冗余的ACK后,进入快速恢复状态,将ssthresh设置为cwnd的一半,重复类似拥塞避免的操作。如果在快速恢复出现了超时,则执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态:cwnd的值被设置成1,并将ssthresh设置为cwnd的一半。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153689.html