论坛首页 Java企业应用论坛

流量控制中的拥塞避免算法

浏览 2939 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-15   最后修改:2009-02-16
转载请注明出处http://chillwarmoon.iteye.com
之所以要流量控制,有两个原因,一个是网络状况,再一个是接收方的缓存大小。对于网络状况来说,由发送方来看网络拥塞情况,然后通过发送方的拥塞窗口(congestion window aka cwnd)进行流量控制。对于接收方缓存来说,由接收方发给发送方的advertise window来进行流量控制,也就是由接收方的advertise window来进行控制流量。

congestion avoidance算法和slow start算法所解决的问题是不同的,前者是为了避免网络上的数据太多而在发送方控制发送速率的算法。后者是为了提高网络利用率,逐步增加回ack的速率的算法。然而这两个算法通常是相互交替使用的。如下:
1.设置cwnd为一个segment,ssthresh为65535 bytes
2.发送方发送的数据永远不超过cwnd与advertised window两者的最小值。
3.如果拥塞发生了(发送的数据在RTO之后,没有得到相应的ack,或者是在faste retrasmit算法之下,收到了接收方的多个针对于同一数据的ack),那么需要设置slow start threshold size(aka ssthresh)的值,设置为当前window的一半.因为流量控制是由发送方和接收方同时控制的,因此这个当前window的大小指cwnd和advertised window两者的最小值,但是至少为两个segment。也就是说ssthresh=1/2(min{cwnd,advertised window}).在设置ssthresh之后,还需要设置cwnd为one segment来准备slow start.
4.在接收方回ack之后,发送方根据cwnd和ssthresh的值来决定是进行congestion avoidance,还是进行slow start.如果cwnd<=ssthresh,则进行slow start,否则进行congestion avoidance.
congestion avoidance在每次接收到ack后,cwnd增加1/cwnd,在一个RTT内,无论收到多少个ack,仅增加一个segment;而slow start是在一个RTT内,每次接收一个ack,则给cwnd增加one segment。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics