首先,咱们来看一下tc,TC(Traffic Control)命令,是linux自带的告警流控命令。Linux操做系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是经过在输出端口处创建一个队列来实现流量控制。通常只能限制网卡发送的数据包,不能限制网卡接收的数据包,因此能够经过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。html
限速场景,须要对当前设备的发包作限制。(其实原本想在接收包时作限制,可是tc只能对发包限制,收包限制不住)当前ens8端口为10GE光口,带宽能够达到1250MB/s。咱们先限制总的网络流速为10000Mbit/s,而后再建立子类,将子类限制流速为100Mbit/s,最后再使用iptables命令将发包的端口与子类关联,达到对端口限速的目的。具体操做以下:linux
#查看现有的队列 tc -s qdisc ls dev eth0 #查看现有的分类 tc -s class ls dev eth0
#清理iptables Mangle规则
iptables -t mangle -F
#清理ens8上原有的队列类型
tc qdisc del dev ens8 root #建立队列 tc qdisc add dev ens8 root handle 1:0 htb default 1 #添加一个htb队列,绑定到eth0上,命名为1:0 ,默认归类为1 #handle:为队列命名或指定某队列 #建立分类 tc class add dev ens8 parent 1:0 classid 1:1 htb rate 10000Mbit #为ens8下的root队列1:0添加一个分类并命名为1:1,类型为htb,带宽为10000M #rate: 是一个类保证获得的带宽值.若是有不仅一个类,请保证全部子类总和是小于或等于父类. #建立一个子分类 tc class add dev ens8 parent 1:1 classid 1:10 htb rate 100Mbit ceil 100Mbit #为1:1类规则添加一个名为1:10的类,类型为htb,带宽为100M
#ceil: ceil是一个类最大能获得的带宽值.
#为了不一个会话永占带宽,添加随即公平队列sfq.
tc qdisc add dev ens8 parent 1:10 handle 10: sfq perturb 10
#perturb:是多少秒后从新配置一次散列算法,默认为10秒
#sfq,能够防止一个段内的一个ip占用整个带宽
#使用u32建立过滤器
tc filter add dev ens8 protocol ip parent 1:0 prio 1 u32 match ip sport 46320 flowid 1:10
#执行此步时老是报错(Illegal “match”) 注意flowid须要与classid相同
#上步执行报错,采用iptables方式限速
#建立过滤器并制定handle
tc filter add dev ens8 parent 1:0 protocol ip prio 1 handle 10 fw classid 1:10
#使用iptables对端口绑定tc队列
iptables -A OUTPUT -t mangle -p tcp --sport 46320 -j MARK --set-mark 10
#set-mark与classid相同
完成上述配置后,当从端口46320发出去的包获得了限速,经过包大小以及包个数,传输包的时间大概统计出带宽值以下:算法
Trans data for 1000 times, average time for every process: 0.0513210330009 average time 0.0513210330009 bandwidth 11.1887605612 MB/s
带宽与设置的限速吻合,从其余端口发出去的包没有收到限制,带宽较大,以下:网络
Trans datafor 1000 times, average time for every process: 0.00130607795715 average time 0.00130607795715 bandwidth 439.651206771 MB/s
原理后续分析,未完待续。。。tcp
参考博客post