TCPとUDP

tcpは通信を保証しUDPは保証しないということがいわれる。試験勉強や用語辞典などでそういう話を聞いた人が多いと思うが、多分それがどういうことかを本当に理解している人は少ないと思う。どうしてUDPだと保証されずTCPは保証できるのか。保証するとはどういうことか。

パケットが到達しないとはどういうことなのか。パケットが到達しない理由でもっとも多いと思われるのは、回線に帯域以上のトラフィックが流れることだろう。次にサーバあるいはホストの処理性能を超えるパケットが到達したとき。それから、ルータが処理しきれないパケットが到達した時。
TCPが到達を保証するというのは、そのような状態が起きないようにするのではない。プロトコルがどんな工夫をしようと、ケーブルを引っこ抜かれたら、はさみでちょん切られたら、どうすることもできない。
TCPがやってくれるのは、そのような状況が起きた事に気づいて、宛先に到達しなかったパケットを再送させる。それが到達を保証する、ということである。
だから、もしたとえば経路の途中でケーブルがちょん切られて、そのまま一定時間ほうっておけば、TCPプロトコルの通信であってもパケットは到達しないことになる。逆に、UDPであっても、アプリケーションで上記のようなことを考慮して再送などをおこなえばある程度の到達性は保証されるのである。だから、TCPだから必ず届く、UDPだから届かない、というのはあまり意味がないことである。

私がネットワークの仕事を始めてもう数年になる。パケットをキャプチャしたりRFCを読んだりルーティングなどの各プロトコルについても学んできたが、TCPの知識というのは全然必要なかった。不思議なくらいTCPについて調べる機会はなかった。CISCOの資格試験でも、TCPについて深く問われる試験は少なくともCCNPまでは無い。プロトコルの内容は結構複雑で難しいと思うのだが。これはでもTCPのすばらしさかもしれない。HTTPもPOPもTCPコネクションの上に成り立つプロトコルである。DNSはUDPである。ARPはどっちでもない。ARPはIPプロトコルですらない。PINGはIPプロトコルであるがTCPでもUDPでもない。