ソケットプログラミングのお勉強その2

会社から帰ってからだと、やっぱ勉強時間が取れません。それでも何もやらないよりはマシだろうと、ちまちま続きを。ポイント7「TCPのパフォーマンスを過小評価」しないを読む。TCPUDPの比較だと大抵、信頼性のTCP、パフォーマンスのUDPみたいな感じで書かれているので、信頼性を犠牲にするくらいだからさぞかしUDPは(TCPに比べて)速いのだろうと、深く考えずに信じていましたけど違うらしいです。TCPUDPもIPの上に構築され、それぞれ次のような処理が追加されています。

大雑把に言うとTCPの方が2つばかり余分な作業をすることになります。また、TCPはコネクション型、つまり、接続->送信->切断の手順を踏むためコネクションレス型のUDPに比べてオーバーヘッドが大きいです。ここまでですと、どう考えてもUDPの方が速そうですが、意外にもTCPが勝つケースもあったりします。どこに逆転要因があるのでしょうか。1つめはUDPの信頼性の無さ。例えローカルマシン内の通信でもパケットを結構紛失します。2つめにUDPはパケット単位でしかデータを送らないこと。TCPの場合は、複数のパケットをまとめてセグメントとして送ることが出来るので、やり取りの回数が少なくなります。もちろん、接続/切断のオーバーヘッドは大きいので小さなデータを頻繁に送るような用途には不向きですが、巨大なデータをまとめて送る場合はパフォーマンスのためにUDPを選択する必要は無いようです。実際にサンプルプログラムを作ってテストしてみたいところですが、仕事のある平日はプログラミングまでは手が出せそうに無いです・・・

(追記) ちっとも.NETな話題じゃないですよね(^^;