1.アナログ遅延伝送の概要
netemおよびtc:netemは、Linux 2.6以降のカーネルバージョンで提供されるネットワークシミュレーション関数モジュールです。この汎用モジュールを使用して、低帯域幅、伝送遅延、パケット損失などの優れたパフォーマンスを持つローカルエリアネットワークでの複雑なインターネット伝送パフォーマンスをシミュレートできます。Linux 2.6以降のカーネルを使用する多くのLinuxディストリビューションでは、このカーネル機能が有効になっています(Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debianなど)。tcはLinuxシステムのツールであり、正式名称はトラフィック制御(フロー制御)です。tcを使用してnetemの動作モードを制御できます。つまり、netemを使用する場合、少なくとも2つの条件が必要です。1つはカーネルにnetem関数が含まれていること、もう1つはtcを使用することです。
この記事で紹介するフロー制御は、パケット送信アクションのみを制御でき、パケット受信アクションは制御できないことに注意してください。同時に、それは物理インターフェイスで直接有効になります。物理eth0が制御されている場合、論理ネットワークカード(eth0:1など)も影響を受けます。影響は、逆に、論理ネットワークカードを制御すると、制御が無効になる可能性があります。(注:仮想マシン内の複数のNICは、仮想マシン内の複数の物理NICと見なすことができます)。
tc qdisc add dev eth0 root netem delay 100ms
//该命令将 eth0 网卡的传输设置为延迟 100 毫秒发送
- 1
- 2
- 3
より現実的な状況では、遅延値はそれほど正確ではなく、一定の変動があります。ボラティリティのある遅延値をシミュレートするには、次の状況を使用できます。
tc qdisc add dev eth0 root netem delay 100ms 10ms
//该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送
- 1
- 2
- 3
この変動のランダム性をさらに強化できます。
tc qdisc add dev eth0 root netem delay 100ms 10ms 30%
//该命令将 eth0 网卡的传输设置为 100ms , 同时大约有 30% 的包会延迟 ± 10ms 发送
- 1
- 2
- 3
2.ネットワークパケット損失をシミュレートする
tc qdisc add dev eth0 root netem loss 1%
//该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包
- 1
- 2
- 3
パケット損失の成功率を設定することもできます:
tc qdisc add dev eth0 root netem loss 1% 30%
//该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包, 成功率为 30%
- 1
- 2
- 3
3.ネットワークカード上の関連する構成を削除します
前のコマンドのaddをdelに変更して、構成を削除します
tc qdisc del dev eth0 XXXXXX(自己加的配置)
//该命令将 删除 eth0 网卡的相关传输配置
- 1
- 2
- 3
この時点で、TCを介してテスト環境で特定のネットワーク遅延とパケット損失をすでにシミュレートできます。以下に、tcに関するその他のアプリケーションと紹介を示します。
4.シミュレーションパッケージを繰り返す
tc qdisc add dev eth0 root netem duplicate 1%
//该命令将 eth0 网卡的传输设置为随机产生 1% 的重复数据包
- 1
- 2
- 3
5.シミュレートされたデータパケットの破損
tc qdisc add dev eth0 root netem corrupt 0.2%
//该命令将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包(内核版本需在 2.6.16 以上)
- 1
- 2
- 3
6.アナログデータパケットが故障しています
tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
//该命令将 eth0 网卡的传输设置为有 25% 的数据包(50%相关)会被立即发送,其他的延迟10 秒
- 1
- 2
- 3
新しいバージョンでは、次のコマンドもパケットの送信順序をある程度乱します。
tc qdisc add dev eth0 root netem delay 100ms 10ms
- 1
7.構成されたネットワーク条件を表示する
tc qdisc show dev eth0
//该命令将查看并显示 eth0 网卡的相关传输配置
- 1
- 2
- 3
8. TCフロー制御の概要
Linuxでは、TCにはCBQとHTBの2つの制御方法があり、HTBはCBQを置き換えるように設計されています。これは、階層的なフィルタリングフレームワークです。
TCには3つの基本的なビルディングブロックが含まれています:キューディシプリンqdisc(キューイングディシプリン)、クラス(クラス)、クラシファイア(クラシファイア)
(1)TCでのキューイング規則
制御ネットワークの送受信速度を達成するために使用されます。Linuxはキューを通じてネットワークデータパケットをキャッシュし、ユーザーの設定に従って、接続(TCPなど)を可能な限り中断することなくネットワークトラフィックをスムーズにします。
Linuxは受信キューを適切に制御しないため、通常は送信キューのみを使用します。つまり、「送信を制御しても受信は制御されません」。他の2つの主要なTCコンポーネント(クラスと分類子)をカプセル化します。カーネルがネットワークインターフェースを介してデータパケットを送信する必要がある場合、このインターフェース用に構成されたqdisc(キューイングルール)に従って、データパケットをキューに追加する必要があります。次に、カーネルはqdiscから可能な限り多くのデータパケットを受け取り、それらをネットワークアダプタードライバーモジュールに渡します。
最も単純なQDiscはpfifoで、着信データパケットに対して処理を行わず、データパケットは先入れ先出し方式でキューを通過します。ただし、ネットワークインターフェイスがしばらく処理できないパケットは保存されます。
キュールールには、FIFO(先入れ先出し)、RED(ランダム早期検出)、SFQ(ランダムフェアキュー)、トークンバケット(トークンバケット)、クラスベースのキュー(CBQ)、CBQはスーパーキュー、つまり、他のキュー(他のCBQも含む)。
(2)TCのクラス
クラスは、制御戦略を表すために使用されます。明らかに、多くの場合、IPごとに異なるフロー制御戦略を実装する必要があるかもしれませんが、現時点では、異なる制御戦略を表すために異なるクラスを使用する必要があります。
(3)TCのフィルター規則
フィルターは、ユーザーを特定の制御戦略(つまり、異なるクラス)に分類するために使用されます。たとえば、2つのIP xxaとxxbに異なる制御戦略(A、B)を実装したいと考えています。現時点では、filterを使用して、xxaを制御戦略A、xxbを制御戦略B、フィルター分割フラグに分類できます。ビットは、u32マーキング機能またはIPtablesセットマーク(主にマーキングにiptablesを使用)機能で実装できます。
現在、TCが使用できるフィルターは、fwmark分類子、u32分類子、ルートベースの分類子、およびRSVP分類子(それぞれIPV6、IPV4で使用)などです。fwmark分類子を使用すると、Linux netfilterコードを使用してトラフィックを選択できます。u32分類子を使用すると、ANYヘッダーに基づいてトラフィックを選択できます。フィルターはQDisc内にあり、サブジェクトとして使用できないことに注意してください。
(4)TC申請プロセス
データパケット-> iptables(iptablesを渡す場合、iptablesは異なるip-> TC(クラス)-> TC(キュー)に従って異なるマークを設定します
(5)アプリケーション
eth0ビットはサーバーの外部ネットワークインターフェイスであると想定されています。開始する前に、まずすべてのeth0キュールールをクリアします
tc qdisc del dev eth0 root 2> /dev/null > /dev/null
- 1
1)最上位(ルート)キューのルールを定義し、デフォルトのカテゴリー番号を指定します
tc qdisc add dev eth0 root handle 1: htb default 2
- 1
2)最初のレイヤーの1:1カテゴリー(速度)の定義は、最初は2番目のレイヤーのより多くの葉カテゴリーを定義することでしたが、今のところ、このアプリケーションではそれで十分です。
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 98mbit ceil100mbit prio 2
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbit ceil 2mbit prio 2
- 1
- 2
注:上記は出力サーバーを制御する速度で、1つは98M、もう1つは2Mです。
レート:クラスによって保証される帯域幅の値です。複数のクラスがある場合は、親クラスのすべてのサブクラスの合計が以下であることを保証するために、
PRIO:帯域幅の借入を示すために使用された場合、競争力は、PRIOは小さく、高い優先順位は、より競争力
はceil:クラスは、最大エネルギーであります結果の帯域幅の値
同時に、セッションが永続的に帯域幅を占有しないようにするために、ランダムフェアキューsfqが追加されます。
tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev eth0 parent 1:3 handle 3: sfq perturb 10
- 1
- 2
3)フィルターを設定する
フィルターは独自のu32またはiptablesを使用してマークを付けることができます
。192.168.0.2フィルターはルートクラス1:0で指定され、1:2ルールを使用して98Mの速度を提供します。書き込みは次のとおりです。
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.2 flowid 1:2
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.1 flowid 1:3
- 1
- 2
それがすべて次のように書かれたIPの場合:
tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst 0.0.0.0/0 flowid 1:10
//使用 Iptables 来配合过滤器
- 1
- 2
- 3
この方法も使用できますが、次のiptablesコマンドを使用して、
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:2
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:3
- 1
- 2
iptablesはマークする必要があるだけです
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j MARK --set-mark 10 iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK --set-mark 20
- 1
(6)TCが最高速度を制御する
レート上限レート制限
パラメーターceilは、クラスが借りることができる帯域幅の量を制限するためにクラスが使用できる最大帯域幅を指定します。デフォルトの上限はレートと同じです。
この機能は、他のユーザーがサービスを要求しなくても、通常、サービスを受けるユーザーの総数を制限するため、ISPに役立ちます。(ISPSは、ユーザーがより良いサービスのためにより多く支払うことを望んでいます。)ルートクラスは借りることができないため、ceilは指定されていないことに注意してください。
注:ceilの値は、少なくともそれが属するクラスの比率と同じくらい高くなければなりません。つまり、ceilは少なくともそのサブクラスのいずれかと同じくらい高くなければなりません。
(7)バーストバースト
ネットワークハードウェアは一度に1つのパケットしか送信できず、1つのハードウェアの速度にのみ依存します。リンク共有ソフトウェアは、この機能を使用して、異なる速度で実行される複数の接続を動的に生成できます。したがって、rateとceilは瞬時の測定値ではなく、一度に送信されたパケットの平均にすぎません。実際の状況は、流量が小さいクラスを特定の時間に他のクラスに最大速度で提供する方法です。
バーストおよびcburstパラメータは、ハードウェアの最大速度で他のクラスに簡単に送信できるデータの量を制御します。cburstが理論上のデータパケットより小さい場合、それによって形成されるバーストはceilレートを超えないため、同じ方法でのTBFの最大レートも同じです。
バーストが必要な理由を尋ねるかもしれません。非常に混雑したリンクでの応答速度を簡単に上げることができるからです。たとえば、WWWトラフィックはバースト性です。ホームページにアクセスして突然読み、突然の空き時間にバーストが発生します。
注:burstとcburstは、少なくともそれらのサブクラスの値と同じ大きさでなければなりません。
(8)TCコマンドフォーマット
参加する
tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc[ qdisc specific parameters ]
tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priorityfiltertype [ filtertype specific parameters ] flowid flow-id
- 1
- 2
- 3
ショー
tc [-s | -d ] qdisc show dev DEV
tc [-s | -d ] class show dev DEV
tc filter show dev DEV
- 1
- 2
- 3
TCのステータスを表示する
tc -s -d qdisc show dev eth0
tc -s -d class show dev eth0
- 1
- 2
tcルールを削除
tc qdisc del dev eth0 root
- 1
例
1)TCダウンロードを使用して、速度制御のために単一のIPを制限する
tc qdisc add dev eth0 root handle 1: htb r2q 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2 flowid 1:1
- 1
- 2
- 3
ネットワーク全体の帯域幅が制限されないように、192.168.1.2のダウンロード速度を30Mビットから最大60Mビットに制限できます。ここで、r2qはデフォルトなしのルートを指します。
2)TCを使用してIP全体の速度を制御する
tc qdisc add dev eth0 root handle 1: htb r2q 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit ceil 1000mbit
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.0/24 flowid 1:1
- 1
- 2
- 3
帯域幅192.168.111.0を255〜3000kに制限できます。実際のダウンロード速度は約200kです。この場合、このセグメント上のすべてのマシンは200kの帯域幅を共有します。
sfq(ランダムフェアキュー)に参加することもできます
tc qdisc add dev eth0 root handle 1: htb r2q 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k
tc qdisc add dev eth0 parent 1:1 handle 10: sfq perturb 10
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.168 flowid 1:1
- 1
- 2
- 3
- 4
sfq、彼はセグメントのIPが帯域幅全体を占有するのを防ぐことができます。
3)TCを使用してサーバーの外部速度を10Mに制御する
次のように、私はサーバーを管理したいのですが、10Mのデータしか送信できません
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1:htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit
tc qdisc add dev eth0 parent 1:10 sfq perturb 10
tc filter add dev eth0 protocol ip parent 1: prio 2u32 match ip dst 220.181.xxx.xx/32 flowid 1:1
- 1
- 2
- 3
- 4
- 5
- 6
上記では、220.181.xxx.xx / 32をデフォルトで実行し、主にこのIP接続を制御しないようにします
tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst 0.0.0.0/0 flowid 1:10
- 1
デフォルトでは、すべてのトラフィックがこれを通過します
参照ソース:http : //blog.csdn.net/weiweicao0429/article/details/17578011