昆布大好き!

主にプログラミングの技メモ

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]

なぜだ。