谈谈TCP/IP 拥塞控制

       最近在看《tcp/ip详解》,记录一下我对拥塞控制的理解吧。
       当发送方向网络中注入大量的报文段时,容易发生拥塞,从而造成网络的性能和吞吐量的下降,这时就需要拥塞控制。在拥塞控制最主要由发送方的拥塞窗口(cwnd)来控制(当然也得考虑对端接收窗口(rwnd)的大小),这个窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,所以TCP的拥塞控制的核心就是要选取最合适的cwnd值,从而使得网络吞吐量最大化且不产生拥塞。
       于是首先提出了"慢启动"算法:具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小。这实际是一种指数增长的方式,起点低,增长速度却不慢,很快会占满整个带宽。
       在此基础上,提出了"拥塞避免"算法,它定义了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。这时每收到一个报文段的确认,cwnd增加1/cwnd报文段,这也意味着在一个RTT时间内,cwnd最多增加1个报文段单元,从而使cwnd改为线性增长方式。
那么当拥塞发生时,拥塞避免算法具体如何作出改变的呢。
首先,如何探测发生了拥塞?
1.定时器超时溢出,这时拥塞避免执行如下操作:
.把ssthresh降低为cwnd值的一半
.把cwnd重新设置为1
.重新进入慢启动过程
2.收到连续三个相同的ACK,这时拥塞避免不用等待定时器超时,执行快速重传和恢复,如下:
.把ssthresh设置为cwnd的一半
.把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)
.重新进入拥塞避免阶段
       最后引用书上的话总结一下:拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值