SoftEther トップ
> SoftEther 開発日記
SoftEther 開発日記
トンネリング通信の実験をしてみる (2003年7月21日)
カーネルモードの LAN カードドライバができたので、デスクトップ PC と ThinkPad
の間でトンネリング通信をするプログラムを書いて見た。最初の実験なので仮想 HUB のようなものはなく、P2P で接続できるようにしてみた。
処理内容は単純で、片方の LAN カードで送信すべきデータをデバイスドライバがカプセル化して TCP パケットにしてもう片方の LAN
カードに送信し、そこでカプセル化を解除して OS に通知する。
Windows のデバイスドライバは、完全にイベントドリブンで駆動している。だから 上の層 (tcpip.sys)
のドライバがパケットを投げてきたら、それをカプセル化する処理を NDIS のディスパッチハンドラで記述すればよい。
ここで注意することは、ほとんどの NDIS からコールされるディスパッチハンドラは IRQL (割り込み要求レベル) が 2
以上で実行されるということである。つまり Win32 で動作している IRQL=1 の各スレッドは、IRQL=2
の処理をカーネルがやっている時は絶対に実行されない。そのため IRQL=2
のときに時間のかかる処理をやってしまうとシステム全体が遅くなってしまう。
トンネリング通信の結果、いくつかの問題が出てきた。
- トンネリングされた仮想 LAN 上で TCP を使用して通信してみると、遅すぎる。100Mbps の LAN で 500kbps
くらいしか出ていない。
- 仮想 LAN で ping を送って見ると、10ミリ秒 ~ 500ミリ秒 のようなに、なぜか戻ってくる時間がバラバラである。
一つ目の問題が発生する原因が、よくわからない。SoftEther ではフレームは TCP
パケットにカプセル化して送受信される。この方式に問題があるような気がしてきた。
早速 Web で検索すると、Why
TCP Over TCP Is A Bad Idea という論文(?) が見つかった。どうやら仮想 LAN で TCP over
TCP を実装するということには、大変な問題があるらしい。「TCP over TCP は使い物にならない」と書かれていた Web
ページも見つけた。
やはり、TCP over TCP は無理なのだろうか、と思った。しかし SoftEther
の売りである、「ファイアウォールを通過できる仮想 LAN」を実現するためには、絶対に送受信は TCP
セッションを使う必要がある。したがって、TCP over TCP の動作時にいかにパフォーマンスを稼ぐかということが重要であることがわかった。
2
つ目の問題については、最初は原因がよくわからなかった。これでは絶対に実用にならないことはよくわかっていた。これもよく調べて見ると、どうやら
TCP スタックが実装している「Nagle
アルゴリズム」(小さいパケットを送信しようとしても、いくつかのパケットが貯まるまでしばらく待ってみて、それらをまとめて送信するアルゴリズム)
が原因らしいことがわかった。
トンネリング通信そのものには成功したが、パフォーマンスは全然出なかった。このままでは SoftEther は使い物にならない VPN
ソフトウェアとなってしまうので、何とかして解決しようと思った。
戻る |