TCP 対 UDP
TCPよりUDPがシンプルである、よってはやい。
などと疑いもなく信仰する人が多いように思いました。なのでやってみました。
PC1 <-----> PC2
のような一対一のLAN直結ですが。
何故こんなつなぎ方をするのか。もっともだと思いますが。
まあ、ね。こう使う人もいるのですよ。
環境
PC1:
OS: Windows 8.1
CPU: Core 2 Quad Q9550 2.83GHz
PC2:
OS: Windows 7
CPU: Core i3 2330M
まず、100[MB]を1400バイトずつ分割して送信をループ(待ち時間なし)してみました。受信バッファは10240[B]です。
結果はこの通り。
(A) 1400[B] * n=100[MB]
TCP | 0.95[sec] | ほぼ同じ時間で受信 |
UDP | 1.51[sec] | 取りこぼすので受信時間は計測不能 |
さらに、TCPソケットはかなりのサイズを一度に送れるので、自分で分割などせず一度に送ればよいのです。
(B)100[MB] * 1
TCP | 0.04[sec] | 1.1[sec]で受信 |
UDP | 不可能 |
結果は、送信時間でTCPが数十倍速いです。
UDPソケットで待ち時間なしで複数送信した場合、受信しきれないことがほとんどなのですが、それでもなお、TCPで受信し終わるまでにUDP送信が終わらないのです。
送信の度にカーネルモードへの切り替えとデバイスへのメモリ転送が発生している。と思います。
特に後者がずいぶん待たされるため、何度も送信するUDPは時間がかかるのだと思っています。
もちろん、普通はネットワークの負荷によりTCPのACKが遅れたり迷子になったりするため、必ず早い、ということにはならないはずです。
おまけ
UDPの送信バッファサイズくらいまでは一度に送れるじゃないか。
そうすればもっと早く送れるじゃないか。
と、おもいやってみた結果。
分割サイズ | 時間 |
---|---|
1400[B] | 1.51[sec] |
1400 * 2 [B] | 0.98[sec] |
1400 * 3[B] | 14.3[sec] |
1400* 4[B] | 10.8[sec] |
なぜだ。