悩み事

SoftEther over UDP というのを試しに作ってみた。
GbE の環境で、over TCP の場合は 350Mbps くらいの通信速度が出るようになったので、over UDP のときはもっと出るようになると思っていたが、200Mbps くらいが限界となってしまった。
しかし 200Mbps で TCP over UDP 通信しているときも、CPU 使用率はあまり高くない (20%くらい)。
ためしに、SoftEther とは全く関係なく、LAN の隣にあるコンピュータの UDP で開いているポートに対して UDP データグラムを無限ループで sendto() するようなプログラムを書いてみた。

while(1) sendto(1400バイトくらい); // のようにした。

これでトラフィックグラフを見てみると、やはり 200Mbps くらいしか出ていない。Ethereal でフレームを見てみても、このプログラムだとパケットを一方的に相手に送りつけるだけなので、データの流れは一方向である。

予想では、この実験では 700Mbps 程度の通信速度が出る (というか UDP を送りつけるだけなのだからブロッキングすることはない) と考えていたが、なぜ 200 Mbps くらいしか出ないのだろうか。

次に、1台の PC で TCP ソケットを Listen しておき、そのポートに別の PC が connect して、その後1つのTCPコネクション内で常に無限ループでデータを送信するようなプログラムを書くと、800Mbps くらい出ている。

UDP輻輳制御や到着確認などをしないので、データグラムを単に送りつけるだけであれば TCP よりもスループットが出る (理論上、ネットワークインターフェースカードの限界値まで出る) はずだと思っていたのだが、そうではないのだろうか。

もしかして、Windows の IP スタックで UDP でデータ送りつけをやると、200Mbps くらいまでしか出ないようにわざと制限しているのだろうか?

という訳で何時間か調べてみて、Web や MSDN でも調べたが、このようなことについて書かれている資料が無かった。

ご存知の方いらっしゃいましたらアドバイスいただけますと幸いです。
よろしくお願いします。