主页

索引

模块索引

搜索页面

常用

The Leaky Bucket Algorithm(漏桶算法)

//网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的2种算法
1.来水量可以不均匀,但出水量均匀直到到无水
2.超出桶容量的水,直接丢弃
https://img.zhaoweiguo.com/knowledge/images/algorithms/Leaky_bucket_analogy.png

The Token Bucket Algorithm(令牌桶算法)

  • 1.按指定速率增加令牌,超出容量的令牌丢弃

  • 2.过来数据流消耗桶中令牌

  • 3.若桶内有足够的令牌则让数据包输出,否则丢弃

https://img.zhaoweiguo.com/knowledge/images/algorithms/Token_bucket_anology.png

Nagle算法

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):

1. 如果包长度达到MSS,则允许发送;
2. 如果该包含有FIN,则允许发送;
3. 设置了TCP_NODELAY选项,则允许发送;
4. 未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
5. 上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

CORK算法

Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。但这二者都会避免发送小包,在这一点上是一致的。而且在Linux的实现上,Nagle和CORK也是结合在一起的。然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。

主页

索引

模块索引

搜索页面