打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
TC HTB流量控制
惠所勇
>《我的图书馆》
2010.06.13
关注
TC HTB流量控制
一
.
背景简介
最近几个月在参与一个软路由器的开发
.
该路由器的流量控制功能由
TCHTB
实现。下面写点总结性的文字,因水平有限,不对之处敬请各位及时指出。
TC
为
TrafficControl
的缩写,
HTB
顾名思义是一个层次式的过滤框架
,
我们可以通过配置
TC HTB
规则来实现流量控制
.
二
.
基本概念
TC
规则涉及到队列
(queue),
分类器
(class)
和过滤器
(filter)
三个概念
.
队列用来实现控制网络的收发速度
.
通过队列
,linux
可以将网络数据包缓存起来
,
然后根据用户的设置
,
在尽量不中断连接
(
如
TCP)
的前提下来平滑网络流量
.
需要注意的是,
linux
对接收队列的控制不够好,所以我们一般只用发送队列,即
“
控发不控收
”,
。
class
用来表示控制策略
.
很显然
,
很多时候
,
我们很可能要对不同的
IP
实行不同的流量控制策略
,
这时候我们就得用不同的
class
来表示不同的控制策略了
.
filter
用来将用户划入到具体的控制策略中
(
即不同的
class
中
).
正如前述
,
我们要对
A,B
两个
IP
实行不同的控制策略
(C,D),
这时
,
我们可
用
filter
将
A
划入到控制策略
C
,将
B
划入到控制策略
D
,
filter
划分的标志位可用
u32
打标功能或
IPtables
的
set-mark
功能来实
现。
三、应用过程
我们要实现这样的功能。局域网中的用户分为两类:特权用户和普通用户,对特权用户和普通用户的各应用的上行
/
下载实现独立的控制。设
eth0
为内网网络接口,
eth1
位外网网络接口。
i)
首先在
eth0
和
eth1
分别建立
qdiscA
和
qdiscB
。
qdiscA
控制外网数据注入内网的速度,因此是用来控制下行速度的;
qdiscB
控制内网数据灌入外网的速度,因此是用来控制上行速度的。示例指令如下。
tc qdisc add dev eth0 root handle 1:htb default 91
解释如下:无论是队列,还是
class
和
filter
都有
ID
之类的标志符,一般都有
parent,
注意
ID
具有接口本地性
,
不同的网络接口可以有相同的
ID
。对于这里因为
qdisc
在顶部,所以
parent
无,用
'root'
字样来标识
,ID
用
1:
来标志
,'default 91'
表示当某个
ip
流不满足任何已设定的
filter
规则时
,
将自动归入
class 91
中
.
更详细的指令规则说明请参考手册
.
ii)
然后在
qdisc
下建立两个
root class,
分别用来控制普通用户和特权用户的带宽
(
对于
eth0
是用来控制下行带宽
,
对于
eth1
是用来控制上行带宽的
).
示例指令如下
.
tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
解释如下
:rate
是指在带宽紧张的情况下的最大网络速度
,
当带宽空闲时
,class
可通过向其兄弟借用带宽而达到
ceil
大的网络速度
,
注意
,
借用表兄弟之间也可借用带框
.prio
用来指示借用带宽时的竞争力
,prio
越小
,
优先级越高
,
竞争力越强
.
iii)
接着针对不同的应用在各
rootclass
下设置不同的类
,.
示例如下
.
tc class add dev eth0 parent 1:30 classid 1:31 htbrate 0.5mbit ceil 2mbit prio 3
指令意义同
ii).
同时为了不使一个会话永占带宽
,
在叶子结点
(
即本文的各应用结点
)
添加随即公平队列
sfq.
tc qdisc add dev eth0 parent 1:31 handle 31:sfq perturb 10
iv)
接着添加过滤器
.
tc filter add dev eth0 parent 1: protocol ipprio 31 handle 31 fw flowid 1:31
v)
用
iptable
打标
iptables -t mangle -I FORWARD -i eth1-p tcp --sport %80 -d $IPaddr--j MARK --set-mark 31
iptables -t mangle -I FORWARD 2 -i eth1 -d $IPaddr--j RETURN
注意下行速率在
eth0
处控制
,
但打标应在进入
eth0
前进行
,
所以规则中出现了
'-i eth1'
字样
.
下行达标规则可类推之
.
四
.
遗留问题
.
有很多细节需要考虑
,
如上行控制与下行控制应比较独立
,
即上行控制时
,
对下行中局域网内用户上行的
ack
之类的包应不予限制
,
这个显然应在
iptable
之类的打标上做文章
,
但我实在没想出什么具体的打标策略
.
有哪位比较清楚
,
烦请告诉我
.
五
.
附图
.
整个应用中的规则示意图如下
.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
使用 linux TC 进行服务器流量控制
Linux下利用TC工具控制网络流量
Linux Htb队列规定指南中文版
OpenStack实现虚拟机IPv4/IPv6双栈带宽控制的方法
Linux 高级流控
Linux TC (traffic control)
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×