スポンサーリンク

DUMMYNET(4) FreeBSD カーネルインタフェースマニュアル 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 パケットフィルタに統合されました。

FreeBSD 10.0 Sep 28, 1998 FreeBSD 10.0

スポンサーリンク