JAIST logo 北陸先端科学技術大学院大学 情報科学研究科 井口研究室 磯垣/ホーム

Dummynetの設定

あらまし

東洋テクニカIP WAVEは任 意の遅延やパケットロスや帯域幅を作り出すことのできる障害エミュレータ です。最新のものがどうなのかはわからないのですが、手元にあるものは WindowsNT4.0にしか対応していないようです。そんな古いOSを塔載したマシ ンは私のまわりにはもう見あたらず、物はあっても利用できない 状況にあります。そこで、FreeBSD に塔載されたDummynetを使っ て任意のネットワーク環境を作り出し、利用したので(僕が利用したという か、学友にやり方を教えてあげたので)、そのときの作業メモをここに掲載 します。

任意のIPアドレスやポートに対し遅延や帯域制限をかける設定もあるのです が、今回はHUBとの間に接続するだけですぐに使えるブリッジとして動作す る実験装置として仕立てあげる方法を示します。

前準備

FreeBSDのカーネルがDummynetとBridgeの機能を含むようコンパイルオプショ ンを変更し、カーネルの再構築を行います。

# cd /usr/src/sys/i386/conf
# cp GENERIC DUMMYNET_BRIDGE
# vi DUMMYNET_BRIDGE

とし、DUMMYNET_BRIDGEというファイルに書かれている、

option IPFIREWALL
option IPFIREWALL_DEFAULT_TO_ACCEPT
option DUMMYNET
option BRIDGE

の行を有効にします。(コメントアウトになっているならコメントの記号で
ある#を外す) その後

# config DUMMYNET_BRIDGE
# cd ../../compile/DUMMYNET_BRIDGE
# make depend && make && make install

とやり新しいカーネルをインストールし、

# sync ; sync ; sync ; reboot

とし新しいカーネルで再起動します。

ブリッジの設定

ifconfig -aを実行し2枚のイサーネットカードに付与されている名前を確認 しておきます。2つの名前がem0とem1であると仮定し話を進めます。 lo0や plip0, ppp0, tun0, gif0といったデバイスはイーサネットカードのデバイ スではありません。必ずMACアドレスが付与されているイーサネットカード のデバイスが何かということを確認してください。

/etc/sysctl.conf というファイルに以下の内容を書き込みます。もしデバ イスの名前がem0やem1でないなら、適当に変更してください。設定の意味が知 りたい場合はman bridgeなどと実行し確認してください。sysctlにおける設 定項目の名前が、FreeBSDのヴァージョンによって異っているようなので、 もしうまく動かなかったらman bridgeで調べてみてください。

net.link.ether.bridge.enable=1
net.link.ether.bridge.ipfw=1
net.link.ether.bridge.config=em0,em1

これが終ったらkill 1などと実行し単にシングルユーザモードを抜ける か、または再起動するなどして、/etc/sysctl.confを再読み込みさせます、 これでブリッジとして動作するようになります。

帯域制限の設定(IPFW)

以下の内容を実行するシェルスクリプトなどを作成し、rc.localなどか ら自動的に実行されるようにしてください。

ipfw add pipe 10 ip from any to any
ipfw pipe 10 config bw 1Mbit/s delay 123 plr 0.1

以上の設定例は、1Mbit/sのビットレートで123[ms]の遅延を発生させ 10[%]のパケットロスを発生させる設定です。1Kbit/sやMbit/sやKByte/sや MByte/sといった単位を使うことができます。delayには0を指定することが できます。plrが0ならパケットロスなしを意味し、1は100%のロスが発生す ることを意味します。

詳しくはman ipfwして下さい。

動作確認

pingなどを打ってみて「(設定した任意の遅延×2)+通常時のRTT」となっ ていればOKでしょう。

動かないときは、確かにリンクしているか確認してください。通常LANカー ドはMDI-Xの機能を持ちません。したがって、もし本装置とPCを直結するなら クロスケーブルを使わねばならないはずです。クロスケーブルがない場合は HUBを通すなどしてください。

IP Waveと比較すると

IP Waveと比較すると、まだまだエミュレーション機能が十分とはいえな いのですが、用途次第では使えます。

追記: 輻輳制御は働かない(TCPの研究者向け)(2005/02/25)

さて、Dummynetを使ってTCPの挙動を調べていたところいろいろと問題が発 生しましたので、他の方がハマらないようにここで報告します。単に帯域制 限をしたいだけの人は読む必要はありません。

というのは、TCPの輻輳制御に手を入れるためDummynet等を使ってごにょご にょやっておりました。しかし、うちのSuperMicro SuperServer 5013G-i(em0, em1)+FreeBSD 5.3 Dummynetにおいては、うまく輻輳制御機能が働いていな いことが判明しました。他の機種でも再現するかは不明です。また、これが 正常な動作なのかどうかもわかりません。

本現象はDummynetにおけるキューサイズによって輻輳制御がうまく働かなく なるというものです。なお、Dummynetを使わない場合でも、実はLAN内の転 送においては、このような制御がなされています。 仮説ですが、本現象はIEEE802.3xによってひきおこされているのではな いかと考えております。(PAUSEフレームが送られることによって、パケット はロスしないから、輻輳ウィンドウが減少しない)

グラフは送信側の輻輳ウィンドウ((struct tcp_opt *)tp->snd_cwndなどと呼ばれているもの) がキューのサイズによってどう影響するかを示しています。なお、Dummynet はL2ブリッジとして動作させています。

つまり、Dummynetを使ったTCPの輻輳制御に関する研究の結果が大きな誤 差を伴う可能性があるということです。もしこれが正常な動作ではないと判 明した場合ですが。

    16KByteのとき

    Congestion
Window behavour(Queue:16KB)

    32KByteのとき

    Congestion
Window behavour(Queue:32KB)

    64KByteのとき

    Congestion
Window behavour(Queue:64KB)

    128KByteのとき

    Congestion
Window behavour(Queue:128KB)

    256KByteのとき

    Congestion
Window behavour(Queue:256KB)

    512KByteのとき

    Congestion
Window behavour(Queue:512KB)

    1024KByteのとき

    Congestion
Window behavour(Queue:1024KB)

    isogaki@jaist.ac.jp  Lynx, Internet Explorer, Opera, Mozilla, Netscape, w3mで確認済み.