DUMMYNET(4)

名称
dummynet - フレキシブルな帯域マネージャおよび遅延エミュレータ

書式
#include <sys/types.h> #include <sys/queue.h> #include <netinet/in.h> #include <netinet/ip_fw.h> int setsockopt(raw_socket, IPPROTO_IP, ipfw option, struct ipfw, size)

解説
dummynet は、帯域幅とキューのサイズに制限を加えたり、パケットの遅延や 損失をシミュレートすることにより、様々なネットワークインターフェイスを 介してやりとりされるトラフィックを制御可能にします。

現在の実装では、パケットの選別は ipfw プログラムの ``パイプ'' ルールにより行われます。 dummynet の パイプ においては、帯域幅、遅延、キューサイズ、損失率を設定できます。 これらの設定は ipfw プログラムで行います。 パイプには 1 から 65534 までの番号がつけられます。また、パケットは ipfw の設定によっては複数のパイプを介して送出する事が可能です。

dummynet は IP レベルで動作しますが、ブリッジ拡張機能を有効にすることに より、ブリッジされるパケットをパイプを介して送出できます。

使用法
下記のコマンドにより、パイプにパケットを送出します。

        ipfw add pipe NNN ....

また、パイプの設定は下記のコマンドにより行います。

        ipfw pipe NNN config bw B delay D queue Q plr P

ただし、帯域幅 B は、bit/s, Kbit/s, Mbit/s, Bytes/s, KBytes/s, MBytes/s で表すことができます。 delay はミリ秒単位で、また、キューサイズはパケット数かバイト数 により指定します。 また、plr はパケットがランダムに失われる割合です。

ipfw を正しく動作させることは簡単ではありません。システムが ルータやブリッジとして機能している場合はなおさらです。

ルータとして機能する場合は、ルーティングされるパケットの入力経路、および、 出力経路に同じルールセットが適用されますので、パケットが同じパイプを 二度通らないように注意してください (本当にそうしたい場合は別です)。

ブリッジとして機能する時は、ブリッジされるパケットに対して、 ipfw フィルタは、入力経路で一度だけ起動されます。

同様に、真の全二重チャネルをシミュレートする場合には、方向の違う 2 つのパイプを用いるようにしてください。 例えば、非対象な双方向のリンクをシミュレートする場合のルールセットは 次のようになるでしょう。

       ipfw add pipe 1 ip from A to B out
       ipfw add pipe 2 ip from B to A in
       ipfw pipe 1 config bw 1Mbit/s delay 80ms
       ipfw pipe 2 config bw 128Kbit/s delay 300ms

操作
ipfw のコードは、帯域幅、キューサイズ、遅延、損失を適用するべき パケットを選別し、それらの制限を記述する ``パイプ'' の識別子を 返します。

選別されたパケットは、まず割り当てられたサイズのキューに蓄えられます。 キューに蓄えられたパケットは、プログラムされた速さで取り出され、遅延を シミュレートするための 2 番目のキューに移されます。 2 番目のキューから取り出される際に、パケットが送られてきたのと同じ プロトコルスタックに入れられます(例えば ip_input(), ip_output(), bdg_forward() など)。 これは sysctl の sys.net.inet.ipfw.one_pass の設定値に依存します。 パイプから出力されたパケットは、パケットの宛先に転送されるか、 マッチしたルールの後に記述された ipfw のルールに再び渡されます。

dummynet はタイマの 1 tick 毎に処理を行います。つまり、処理の周期はカーネル オプションの

        options HZ

によって制御されます。デフォルト値 (100) は 10ms 周期を意味します。 高いデータ速度で正確なシミュレーションを行うためには、タイマ 周期を 1ms 以下に設定する必要があるかもしれません。 しかし、プログラムによる I/O (programmed I/O) を用いているインタフェースの中には、 パケットを出力するのにかなりの時間を要するものがあることに注意して ください。つまり、タイマ周期を小さくし過ぎると、タイマの周期に処理が 追い付かず、処理の精度を損なってしまうおそれがあります。

カーネルオプション
カーネル設定ファイル内の以下のオプションが dummynet の動作に関係します。

      IPFIREWALL               - ipfirewall を有効化 (dummynet 使用には必須)。
      IPFIREWALL_VERBOSE       - ファイアウォールの詳細出力を有効化。
      IPFIREWALL_VERBOSE_LIMIT - ファイアウォールの詳細出力を制限。
      DUMMYNET                 - dummynet の処理を有効化。
      NMBCLUSTER               - ネットワークパケットバッファの大きさを設定。
      HZ                       - タイマの周期を設定。

通常、下記のオプションは必須です。

      options IPFIREWALL
      options DUMMYNET

加えて、設定したすべてのパイプの、帯域幅と遅延時間の積と、キューサイズ の合計によっては、mbuf クラスタ (ネットワークパケットを蓄えておくために使われます) の数を増やす方が良いかもしれません。

SYSCTL 変数

        net.inet.ip.fw.one_pass

パケットがファイアウォールのコードを一度のみ通るようにしたい場合、 1 に設定します。

       net.link.ether.bridge_ipfw

ブリッジされるパケットをファイアウォールのコードに渡したい場合にセットします。

コマンド
パイプを扱うためには、以下のソケットオプションを用います。

IP_DUMMYNET_CONFIGURE は、パイプの設定を更新します。(または新しい パイプを作成します。)

IP_DUMMYNET_DEL は、マッチするルール番号が存在するすべてのパイプを 削除します。

IP_DUMMYNET_GET は、指定した番号にマッチするパイプを返します。

IP_FW_FLUSH 指定した番号にマッチするパイプをフラッシュします。

カーネルセキュリティーレベルが 2 より大きい場合は、 IP_DUMMYNET_GET のみが使用可能です。

関連項目
setsockopt(2), ip(4), ipfw(8), sysctl(8).

バグ
このマニュアルページは dummynet 使用方法の全部を記述している わけではありません。

歴史
dummynet dummynet は、ACM Computer Communication Review, Jan.97 issue に記述されているように、 TCP の輻輳の制御のために Luigi Rizzo <luigi@iet.unipi.it> が実装しました。 その後、IP およびブリッジレベルで機能するように変更され、さらに IPFW パケットフィルタに統合されました。