首页 » 技术讨论 » 正文

ROS的流控原理

Queue 流控用于对网络接口数据流发送和接收数据进行控制。传输流量被控制在指定的范围值内, 即传输的流量只能小于或等于这个值, 反之超过的流量将会被丢弃或延迟发送。



流控执行两种方式:
丢弃所有超出的流量限制的数据包rate limiting (丢弃或整形流量) ,当 queue-size=0 100%流量被限制
延迟发送超出指定流量限制加入到队列中的数据rate equalizing (计划任务) ,当 queue-size=无限制( unlimited100%比例均衡发送
下面的视图让你进一步理解
rate limiting rate equalizing 的区别:

img1939

上图显示了所有传输流量超出了指定带宽的那部分被直接丢弃掉。

img1940
上图显示了当传输流量超出了指定带宽的那部分,将进入队列容器(
queue-size) 并延迟发送。注意:数据包被延迟只会在队列容器没有满的情况下,如果队列容器没有多余的空间缓存数据包,数据包同样会被丢弃。
RouterOS 队列容器可以通过/queue type 指定,每种类型的 queue type 有不同的队列长度大小,可以指定数据包和字节 (pfifo-limit, bfifo-limit, pcq-limit, pcq-total-limit, red-limit), 但所有的类型原则上是一样的,即 queue-size 决定数据包是被丢弃还是延迟发送。

img1941
每个队列都有
2 个速率限制:
CIR (约定信息速率 Committed Information Rate) – (RouterOS 中的参数为 limit-at) 最坏的情况下,无论如何都会将得到给定的的 CIR 传输量(假设我们能发送那么多的数据量)
MIR (最大信息速率 Maximal Information Rate) – (RouterOS 中的参数为 max-limit) 最好的情况下,如果有剩余带宽, 才能获得这个的带宽。


队列执行在
RouterOS 基于等级令牌桶 Hierarchical Token Bucket (HTB)HTB 允许创建等级队列结构并能指定队列直接的关系,在 RouterOS v6.0 之前等级结构能被指定在 4 个不同的位置

global-in 代表了所有输入接口(INGRESS 队列)。请注意在数据包过滤前与 global-in 相关的队列应用到路由器接的数据流。 global-in 排序就是在 mangle dst-nat 之后执行。
global-out 代表了所有普通的输出接口。附属于它的队列会在附属于特定接口的队列之前应用。
global-total 表了一个流经路由器的数据都能通过的虚拟接口。当把一个 qdisc 附属到 global-total时,限制需要在两个方向起作用。例如,如果我们设置一个为 total-max-limit 256000 限制,我们将得到 upload+download=256kbps(最大值)
<interface name> 明确指定的网络接口,在流量从这个接口发送出去时将被放入 HTB 队列
注意
v6.0 后取消了 global-in global-out 接口,使用 global 代替。


RouterOS 中有两种方式配置队列:
/queue simple 用于简单的队列配置,如直接对单个用户的上下行带宽控制,队列的时间计划任务。
/queue tree 为执行高级的队列任务,如全局的优先策略,用户组带宽控制,需从/ip firewall mangle标记数据包中调用。

发表评论