複数の無線 LAN カードを使って MIMO ごっこをする方法

 ※以下に紹介する方法を行っても実際に無線 LAN の速度が速くなる訳ではありません。
 ※この記事には過失又は故意による誤りが含まれている可能性が多分にあります。
 ノーパを使うことが出来なくなったため、USB の無線 LAN 子機が余ってしまった。放置するのは勿体無いのでせっかくだから二本刺しで効率の良い方法を考えてみる。

★ 条件

  • 様々なアドレスへの接続が同時に発生すること
  • 子機一台が出せる速度 < 親機が出せる最大速度 であること (そうでなければ意味が無い)
  • 子機一台が出せる速度 < プロバイダの最大速度 であること (そうでなければ意味が無い)
  • 無線 LAN 子機が Windows で設定できる (か、又は付属のユーティリティが複数の子機接続に対応している) こと
  • 無線 LAN 親機が同じマシンからの複数の接続が出来ること

★ 懸念事項

  • 親機が安定しないと半分程度の接続が出来なくなる
  • へたれ Windows だとクラッシュするかもしれない (現にこれを書いてたらクラッシュした)

★ 方針

  • ルーティングテーブルを書き換えて接続先に応じて経由インターフェイスを変えることによって、処理の分散を図る

★ 準備

以下、二つのアダプタの場合を示す。三つ以降も基本的には同じはず。

  1. ドライバをインストールする。この時、別の種類の子機を使っている場合はインストールしない片方は外してインストールした方が良い。
  2. 付属のユーティリティを起動させないようにする。普通、付属のユーティリティでは複数の NIC 差しに対応していないため (当たり前)。
  3. Windows SP2 なら、Wireless Zero Configuration を使うと良い。services.msc を使って有効にしよう。この時、子機用のサービスがインストールされている場合があるので、ついでに無効にすると良い (例えば、BUFFALO 製では bwsvc を切った方が良いかも)。
  4. 「ネットワーク接続」から子機を右クリックで選択して「プロパティ」→「ワイヤレス ネットワーク」へ。「Windows で構成する...」をチェックし「優先ネットワーク」に親機を追加。これを子機分だけ繰り返す。
  5. ここからの作業はどちらの子機がどっちだったか紛らわしくなるので、「ワイヤレス ネットワーク接続2」とかになっている場合はわかりやすい名前に変える事を強く勧める。MAC アドレスの後ろの方を名前に入れるとわかりやすいかも。
  6. 子機のどちらか好きな方を右クリックで選択して (以下、これを子機Aと呼ぶ) 「プロパティ」→「インターネットプロトコル (TCP/IP)」→「プロパティ」→「詳細設定」へ。
    1. 「自動メトリック」のチェックを外して、もう片方の子機の自動メトリックより高い値を入力する (11gの54Mbps接続では多分20なので、30にでもすれば良い)。メトリックは「route print」や「netstat -r」等適当なコマンドで確認出来る。
    2. もう片方 (以下、子機Bと呼ぶ) も同じ方法で手動でメトリックを設定しても良い。メトリックが結局のところ 子機A > 子機B になれば良いのだ。ここでは子機Aを30、子機Bを20とした。
  7. 分割するIP範囲を決める。
    1. 単純に 0.0.0.0 - 128.255.255.255 - 255.255.255.255 で切ると日本国内への接続が主な場合偏ってしまうので考え所である。私は適当に 0.0.0.0 - 203.255.255.255 - 255.255.255.255 とした。
    2. route コマンドで登録する際は上手いこと netmask のパターンにしなければならない。http://www.ripe.net/cgi-bin/wwwipcount.cgi 等を使うと便利だろう。「0/1 0.0.0.0 - 127.255.255.255」「128/2 128.0.0.0 - 191.255.255.255」「192/5 192.0.0.0 - 199.255.255.255」... と出てきたら、それぞれ「0.0.0.0 MASK 128.0.0.0」「0.0.0.0 MASK 192.0.0.0」「0.0.0.0 MASK 200.0.0.0」... とすれば良い…のかな?(適当)

★ 本番

 まず、コマンドプロンプトで「route print」を打ち込み現在のルーティングテーブルを確認する。ここではわかりやすいように子機A子機Bで色分けをした。

> route print
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x20004 ...00 16 01 b3 0b c0 ...... BUFFALO WLI-U2-KG54L Wireless LAN Adapter -
パケット スケジューラ ミニポート
0x50005 ...00 0d 0b e9 63 2c ...... BUFFALO WLI-U2-KAMG54 Wireless LAN Adapter -
 パケット スケジューラ ミニポート
===========================================================================
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1     192.168.1.3       30
          0.0.0.0          0.0.0.0      192.168.1.1     192.168.1.4       20
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
(中略)

 現在、子機B (192.168.1.4) が全てのコネクションを担当している。これを、0.0.0.0 - 203.255.255.255 までは子機Aが担当するように書き換えよう。以下のように打ち込む (192.168.1.1 はゲートウェイ、IF ..... はインターフェイス番号 (route printで出てくる Interface List を参照) である。環境によって変える必要がある)。なお、子機それぞれが別の親機に繋ぐ場合等でゲートウェイのアドレスが違う場合は「IF .....」は不要になる場合がある (ゲートウェイのアドレスから推測する)。

    
> route print (中略) =========================================================================== =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.4 20 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.3 30 0.0.0.0 204.0.0.0 192.168.1.1 192.168.1.3 1 0.0.0.0 128.0.0.0 192.168.1.1 192.168.1.3 1 0.0.0.0 192.0.0.0 192.168.1.1 192.168.1.3 1 0.0.0.0 200.0.0.0 192.168.1.1 192.168.1.3 1 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 (中略)
 これで 0.0.0.0 - 203.255.255.255 まで子機Aから接続されるようになった。いずれも接続できるか ping 等でチェックしよう。9/30 現在、「www.google.com」に ping を打つと 66.〜、「www.hatena.ne.jp」に ping を打つと 221.〜、なのでチェックに便利かもしれない。ping が全く帰ってこない場合は担当子機が、ping の返答が安定しない場合は親機に問題があるかもしれない。  後はタスクマネージャのネットワーク利用状況を見ながら、IPの範囲を調整すると良いだろう。

★ 効果の程は?

 ちょっとだけ使ってみた。本領発揮は P2P や FlashGet 等での多重接続時に限られるので、ちょっとネットサーフィンしたぐらいではぱっとしない。  応用として、例えばネットゲームの際にネットゲーム用の子機を指定してみるのも良いかもしれない (但し、IPがわかっている場合に限る。Destination を接続先のIPとして Netmask を 255.255.255.255 として、route ADD xxx.xxx.xxx.xxx MASK 255.255.255.255 ... とすれば良い)。