TC流量制限

TC原理

Linux中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要通过在输出端口建立一个队列来实现流量控制。
一般只能限制网卡发送的数据包,不能限制网卡接口的数据包,所以可以通过改变发送次序来控制传输速率。

フロー制御には次のものが含まれます。

SHAPING(限制): 当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。
SCHEDULING(调度): 通过调度数据包的传输,可以在带宽范围内,按优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。
POLICING(策略):
 SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
DROPPING(丢弃): 如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。

制御処理オブジェクト: qdisc (キューイング規律)、class (カテゴリ)、filter (フィルター)。
主に qdisc を紹介します。

QDisc(排队规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。
无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。
然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。
最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。

応用:

港の制限速度
#查看现有的队列
tc -s qdisc ls dev eth0

#查看现有的分类
tc -s class ls dev eth0

#创建队列
tc qdisc add dev eth0 root handle 1:0 htb default 1 
#添加一个tbf队列,绑定到eth0上,命名为1:0 ,默认归类为1
#handle:为队列命名或指定某队列

#创建分类
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 10Mbit burst 15k
#为eth0下的root队列1:0添加一个分类并命名为1:1,类型为htb,带宽为10M
#rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
#ceil: ceil是一个类最大能得到的带宽值.

#创建一个子分类
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit ceil 10Mbit burst 15k
#为1:1类规则添加一个名为1:10的类,类型为htb,带宽为10M

#为了避免一个会话永占带宽,添加随即公平队列sfq.
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
#perturb:是多少秒后重新配置一次散列算法,默认为10秒
#sfq,他可以防止一个段内的一个ip占用整个带宽

#使用u32创建过滤器
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 22 flowid 1:10

#删除队列
tc qdisc del dev eth0 root

配置完成后加入本地启动文件:  
/etc/rc.local
IPの速度制限
#!/bin/bash
#针对不同的ip进行限速

#清空原有规则
tc qdisc del dev eth0 root

#创建根序列
tc qdisc add dev eth0 root handle 1: htb default 1

#创建一个主分类绑定所有带宽资源(20M)
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 20Mbit burst 15k

#创建子分类
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20Mbit ceil 10Mbit burst 15k
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20Mbit ceil 20Mbit burst 15k

#避免一个ip霸占带宽资源(git1有讲到)
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

#创建过滤器
#对所有ip限速
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:10
#对内网ip放行
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 12.0.0.0/8 flowid 1:20

私は持っていません

netem时network emulator的缩写,可以用来模拟广域网下的延迟、丢包、重复、损坏和乱序等问题。
# 重置网络配置
tc qdisc del dev eth0 root 

遅延設定
DELAY := delay TIME [ JITTER [ CORRELATION ]]]
    [ distribution { uniform | normal | pareto |  paretonormal } ]
  • TIME: 遅延時間
  • JITTER: ジッター。遅延時間が一定の範囲になるようにランダムな時間長を追加します。
  • CORRELATION: 相関、次のメッセージと前のメッセージの遅延時間の相関係数
  • 分布: 分布、遅延の分布モード、選択できる値は均一、正規、パレート、およびパレート正規です
# eth0 网卡延迟增加100ms 
tc qdisc add dev eth0 root netem delay 100ms

# 报文延迟的时间在 100ms ± 20ms 之间(90ms - 110ms)
tc qdisc add dev eth0 root netem delay 100ms 20ms

# 因为网络状况是平滑变化的,短时间里相邻报文的延迟应该是近似的而不是完全随机的。这个值是个百分比,如果为 100%,就退化到固定延迟的情况;如果是 0% 则退化到随机延迟的情况
tc qdisc change dev eth0 root netem delay 100ms 20ms 50%

# distribution 参数来限制它的延迟分布模型。比如让报文延迟时间满足正态分布
tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
netem シミュレーションのパケット損失設定
# 发送的报文有 50% 的丢包率
tc qdisc change dev eth0 root netem loss 50%

# 发送的报文有 0.3% ~ 25% 的丢包率
tc qdisc change dev eth0 root netem loss 0.3% 25%
Netem はパケットの繰り返しや破損の設定をシミュレートします
# 随机产生 50% 重复的包
# tc qdisc change dev eth0 root netem loss 50%  # 原错误命令
tc qdisc change dev eth0 root netem duplicate 50%

# 随机产生 2% 损坏的报文(在报文的随机位置造成一个比特的错误)
tc qdisc change dev eth0 root netem corrupt 2%
netem はパケットの順序が狂っていることをシミュレートします
#固定的每隔一定数量的报文就乱序一次
tc qdisc change dev eth0 root netem reorder 50% gap 3 delay 100ms
#使用概率来选择乱序的报文
tc qdisc change dev eth0 root netem reorder 50% 15% delay 300ms

電話の無線LAN

通常の遅延は一般的に 20ms ~ 30ms、パケットロス率は 45% 以内、ジッターは約 20ms、理論的には
1
~ 30ms: 非常に速く、遅延はほとんどなく、どんなゲームでも非常にスムーズにプレイできます
。 50ms: 良好、通常のゲーム、明らかな遅延なし
51~100ms: 通常、対決ゲームでは明らかな遅延、わずかな一時停止を感じる場合があります

100ms:貧弱、ゲームを正常にプレイできない、フリーズ、パケットロス、切断が発生する

おすすめ

転載: blog.csdn.net/weixin_56766616/article/details/129955772