SmallBits

Easy Traffic Generator

もくじ


概要

SmallBits は、windows端末を使って(比較的)簡単にIPトラフィックを生成するツールです。 IPの各種パラメータはもちろん、UDP, TCP, ちょっとだけICMP のパラメータも設定する ことができます。 またUDPパケットなら受信も行えるので、送信側と受信側でそれぞれ SmallBits を 動かしておけば、パケットロスなども観察できます。

ネットワーク機器をあつかってると、QoS, シェーピング, パフォーマンス等々、 トラフィック負荷をかけたくなる機会はおおいのですが、 おおげさな負荷生成装置を用意するほどでもない場合に(もちろん高くて買えない場合も)、 使ってみてください。
でもwindows上で動くものであるため、パケットの送信能力は PC のパフォーマンスに 左右されますし、他のアプリケーションとの同時実行や状況によって送信レートに ばらつきが生じます。

ツール本体は GUI版とコマンドライン版がありますので、好みに応じて使い分けてください。 できる事はいっしょです。
GUI版コマンドライン版

また、本ツールを使ったことによる不具合やトラブルの責任は負いかねますんで、 As your own risk でお願いします。

動作環境

多分 windows2000/XP でうごきます。
もう少し細かく言うと Winsock2 な windows で動くんだと思いますが、 SmallBits を動かしたいがために windows プログラミングを 中途半端にかじっただけなので、よく知りません。

以下のOSでの動作確認は取れています。
  • windows 2000 Professional
  • windows XP Home/Professional

インストール

インストーラを使う方法と、単にフォルダをおいておくだけの方法とがありますが、どちらでも結構です。
インストーラを使うと、プログラムグループへの登録やデスクトップへのショートカット作成などを自動的に行えます。

・インストーラを使う場合
  1. sbxxx.zip をダウンロード (xxx はバージョン番号が入ります)
  2. 展開します
  3. 出来た SmallBits フォルダ内の Setup.exe をダブルクリックします
  4. 後はインストーラの指示に従ってインストールを完了してください
  5. プログラムグループの登録をしていれば、 「スタート」->「プログラム」->「SmallBits」が出来ています
  6. アンインストールする場合は、「コントロールパネル」->「プログラムの追加と削除」 からアンインストールできます

・フォルダを置いておくだけの場合
  1. sbxxx.zip をダウンロード (xxx はバージョン番号が入ります)
  2. 展開します
  3. 出来た SmallBits フォルダを任意の場所(デスクトップや C:\Program Files\SmallBits など)におきます
  4. SmallBits フォルダ内の、sbg.exe および sbc.exe が SmallBits 本体です
  5. 必要であればこれらプログラムへのリンクをデスクトップやプログラムグループに作ってください
  6. アンインストールする場合は、SmallBits フォルダをまるごと削除すればよいです

使用方法 (コマンドライン版)

コマンドラインバージョンの SmallBits はコマンドプロンプトから実行します。
  1. プログラムグループ SmallBits を開きます。(あれば)
  2. 中にある SB CLI をクリックしてください。(あれば)
    SmallBits がインストールされている場所でコマンドプロンプトが開きます。
  3. sbc コマンドを実行してください。
    必要に応じてオプションを指定してください。
    (詳細は '各パラメータ(オプション)解説' を参照)
  4. プログラムを終了する場合はコマンドプロンプト上で Ctrl + C を入力してください。
要するに sbc.exe がコマンドプロンプト上で実行できればいいので、やり方はこの限りではありません。
ちなみにこのコマンドライン版は単体で動作可能なので、sbc.exe だけを持ち歩くこともできます。

使用方法 (GUI版)

  1. プログラムグループ SmallBits を開きます。(あれば)
  2. 中にある SB GUI をクリックしてください。(あれば)
  3. 各種パラメータを設定したら、Start を押します。
  4. パケットの送信(あるいは受信)を停止する場合は Stop を押します。
  5. プログラムを終了する場合は Exit ボタンを押してください。
こちらも要するに sbg.exe が起動できればよいので、やり方はこの限りではありません。 GUI版は同包の DLL を必要とするため、コマンドライン版のように sbg.exe だけでは動きません。

各パラメータ(オプション)解説

指定できるパラメータ(オプション)表です。
GUI版の場合直感的に分かりやすいので、 以下の表では CLI版での指定方法を中心に書いてます。

送信モードの時
パラメータ内容指定例
CLIGUI
コントロール系
vVersion バージョン情報を表示 -v
h- ヘルプを表示 -h
hpHi Pri SmallBits プロセスに高優先度を設定するかどうかを指定
1(on),0(off)のいずれか
デフォルトは 1(on)
-hp:0
mMode s(Send,送信)か r(Receive,受信)で動作モードを指定
デフォルトは s
-m:s
bBW パケット送信レートを指定
数値の後ろに k(Kilo),m(Mega)をつけることができる
数値に 0 を指定すると、レート制限なしにパケットを送信する
デフォルトは 64k
-b:10m
baadj bオプションで Bandwidth を指定しても、 各種誤差の為実際にはそのレートで送信されない場合がある
本オプションを指定すると、送信過程で自動的に指定された Bandwidth に調整する
1(on),0(off)のいずれかを指定
デフォルトは 1(on)
-ba:0
cCounter 送信するパケット数を指定
指定されたパケット数を送信すると動作を終了する
0 を指定すれば無制限
デフォルトは 0
-c:1000
lenLength 64〜1500の範囲でパケット長を指定 (データリンクヘッダの長さは含まない)
デフォルト 1024
-len:64
-Default GUI版のみで、これをクリックすることで全てのパラメータがデフォルト値に戻る
IP
siSrc IP パケットの送信元アドレスを x.x.x.x 形式で指定 (ホスト名は×)
デフォルトは、その端末につけられている IPアドレス
-si:192.168.1.1
diDst IP パケットの宛先アドレスを x.x.x.x 形式で指定 (ホスト名は×)
このパラメータは必ず指定しなければならない
デフォルトなし
-di:192.168.1.100
miMCIF 宛先アドレスがマルチキャストアドレスの場合でかつNICが複数ある時に、 パケットを送信するNICをそのNICに付けられているアドレスで指定する
デフォルトは、最初に見つかったNICのアドレス
-mi:192.168.1.2
dfDF bit Don't Fragment ビットを立てる場合に指定する
デフォルトは、ビットを立てない
-df
ttlTTL 0〜255の範囲で TTL を指定
デフォルトは 128
-ttl:64
svTOS,DSCP t(TOS) を使うか d(DSCP) を使うかの指定
デフォルトは TOS だが、TOS,DSCPに関わるパラメータを指定すればそれが有効になる
-sv:d
prPrec TOS の Precedence を 0〜7 の範囲で指定
デフォルトは 0
-pr:5
scClass TOS の サービスクラスを d,t,r,c のいずれかで指定
デフォルトは、サービスクラス指定なし
-sc:t
dscpDS Field DS Field の値を 0〜63 の範囲で指定
デフォルトは 0
-dscp:10
ectECT ECT ビットを立てる場合に指定
デフォルトは、ECTビットを立てない
-ect
ceCE CE ビットを立てる場合に指定
デフォルトは、CEビットを立てない
-ce
pUDP,TCP,ICMP 使用する上位プロトコルを t(TCP), u(UDP), i(ICMP) のいずれかで指定
デフォルトは u
-p:t
UDP
spSrc Port 送信元ポートを 0〜65535 の範囲で指定
デフォルトは 33333
-sp:1024
dpDst Port 宛先ポートを 0〜65535 の範囲で指定
デフォルトは 33333
-dp:1024
TCP
spSrc Port 送信元ポートを 0〜65535 の範囲で指定
デフォルトは 33333
-sp:1024
dpDst Port 宛先ポートを 0〜65535 の範囲で指定
デフォルトは 33333
-dp:1024
tfTCP Flags TCP ヘッダのフラグを s(SYN),a(ACK),f(FIN),r(RST),p(PUSH),u(URG),e(ECE),c(CWR) の組み合わせで指定
デフォルト a
-tf:sa
ICMP
iICMP Type ICMP の種類を e(Echo), er(Echo Reply) のいずれかで指定
(現状この二つのみ = 手抜き)
デフォルトは e
-i:er

受信モードの時
パラメータ内容指定例
CLIGUI
コントロール系
vVersion 送信モードに同じ -v
h- 送信モードに同じ -h
hpHi Pri 送信モードに同じ
受信モードの場合、 1(on) でパケットの取りこぼしが非常に起こりにくくなる
-hp:0
mMode 送信モードに同じ -m:r
-Default 送信モードに同じ
IP
diDst IP 宛先アドレス(受け取るアドレス)を x.x.x.x 形式で指定
マルチキャストアドレスを指定した場合は、それに伴って IGMP が送信される
デフォルトは、自身の持つIPアドレス
-di:224.1.1.1
UDP
dpDst Port 宛先ポート(受け取るポート)を0〜65535 の範囲で指定
デフォルトは 33333
-dp:1024

こんな時は...

マルチキャストパケットの送受信がしたい
送信の場合は、宛先アドレスに目的のマルチキャストアドレスを指定し、 必要があれば MCIF(-miオプション)で送信インターフェースを指定します。
受信の場合は、宛先アドレスに目的のマルチキャストアドレスを指定するだけです。 この場合、OS の機能を使って IGMP も送信されます。
出せるだけパケットを出したい
Bandwidth に 0 を指定します。
後はその PC の処理能力如何です。
パケットの送受信レートが上がったり下がったり不安定
Bandwidth の自動調整機能が働いている場合、Bandwidth やパケット長によってはふらつくことがあります。 また何らかの理由で一時的に CPU 負荷が上がって送信レートが落ちたような場合も、自動調整機能が働いてしまって レートがふらつくことがあります。
これが気になる場合は自動調整機能(-baオプション)を OFF にして Bandwidth の値を手動調整してみてください。
あるいは、PPS(Packet Per Second)を気にしなくてよいなら、 パケット長(-lenオプション)を短くするなども有効です。
パケット長を変えると急に送信レートが落ちる
なぞ」の項にも書いているのですが、どうも OS 内部の処理上、そういうことがあるみたいです。
パフォーマンスが悪くなるパケット長を避けるくらいしか今のところありません。
パケット送信中はずっと同じパケットが送出されるの?
そうです。
が、IPヘッダ中の ID フィールドだけはパケット毎に変わります。

なぞ

いくつかなぞがあります。

1. Bandwidth を 0 (つまりレート制限なし)でパケットを送出する際、 パケットサイズを 1025バイト以上にするととたんに送信能力ががくんと落ちます。
OS内部でのバッファサイズが 1024バイト区切りなんでしょうか。
それにしても極端に落ちすぎのような気が。
2. IP_HDRINCL な SOCK_RAW でパケット送信しているにもかかわらず、IPのTOSフィールドだけは OSが勝手にデフォルト値に書き換えてしまうので、 別途 setsockopt(IPPROTO_IP, IP_TOS)しないといけません。
なんでや。

ソースコード, 開発環境

SmallBits のソースは SmallBits 配布の src ディレクトリに入っています。
開発環境は、コマンドライン版が cygwin(Makefile 辺りをちょちょっと変えれば Mingw でも可なはず), GUI版が WideStudio です。 SmallBits のバージョンによってこれらのバージョンも異なる可能性がありますが、 その辺は src 中の README.txt をご覧ください。

ライセンス

SmallBits 自身は GNU GPLの下に公開します。
SmallBits の配布に入っている WideStudio関連DLL については、 WideStudio作者の平林さんに著作権があり X11/MIT ライセンスで公開されています。
またインストーラである Setup.exe については、MrSetup作者のMARCOMさんに著作権があります。

SmallBits に関するバグ情報などありましたら、 sb@ponpoko.org まで送っていただけると助かります。

感謝

GUI版を作るにあたり、 WideStudioを 利用させていただきました。 こんなすばらしい開発環境を公開されている平林さんに心より感謝します。

インストーラには MrSetup を利用させていただきました。かゆいところに手が届くツールです。

コマンドライン版のみのつもりで作ってたところに、
(私)「どういう機能が欲しい?」
(向)「GUIが欲しい」
と想定とは違う答えを返し、 ある意味GUI版を作るきっかけを与えてくれた向高直樹氏に感謝します。
2002/11/23, zabe