帯域制限器

softether2004-11-03

ある趣味の実験で、帯域制限器というのを作っている。
具体的には、Ethernet ブリッジのような機械 (実際には仮想 HUB みたいなものだが) を流れる帯域を上手く調整してやることで帯域制限をしようというものである。
一番最初に考え付いたアルゴリズムは、流れるパケット量を1秒ごとに記録し、その1秒間の間に、ユーザーが予め定めておいたデータ量 (bps) を超えるパケットが流れようとすると、そのパケット以降を1秒のスパンが終了するまですべて破棄する、というものである。
これは誰でも思いつくような、ちょっといい加減な実装だと思ったが、実際に使ってみると案外うまくいった。数値として 10Mbps を指定しておくと、TCP でデータをフルに転送させた場合、および CIFS (SMB) プロトコルのような TCP ストリームの中で独自に確認応答をするようなプロトコルを使った場合のいずれでも、最大限にファイルを転送しようとしたところ、約8〜9Mbps 程度のところでスループットが安定した。上位層 (TCP プロトコル) スタックが、自動的に輻輳制御を働かせて、ちょうど良いくらいのスループットに調整してくれたのだろう。
次に、サンプリング間隔をだんだん狭めていった。すると、上位層で TCP を使っている場合、途端に効率が悪くなった。必要以上に再送を繰り返したりするようになった。速度はユーザーが 10Mbps を希望するのに対して、サンプリング間隔が 100ms のときに 2.5Mbps 程度に落ちてしまった。
本来であれば、非常に短いサンプリング間隔でデータ流量を測定し、それをより長い間隔で平滑化した後、それを使ってパケット破棄量にフィードバックをかけてやれば良いのだと思う。しかし、最初の方法(比較的長いサンプリング間隔で流量を測定しパケット破棄をする)が案外うまくいったので、最初の方法を活用することにしたいと思う。
このような実験には醍醐味があって良い。
※ そういえば Linux 用には Alan Cox さんのようなすごい人が作った Traffic Shaper モジュールを組み込めるらしい。
※ 最近の シスコ IOS にも Traffic Shaper のようなものが入っているらしい。これは解析せねばならん。