TCPとUDP

私たちが使うインターネット上の通信は、その基盤としてTCPおよびUDPをトランスポートとして使用しています。

概要

IPの層までここまで簡単に見てきました。次はトランスポート層について見ていきましょう。 トランスポート層は、アプリケーション層とネットワーク層の間に位置し、データの転送を管理します。ここでは、TCP(Transmission Control Protocol)とUDP(User Datagram Protocol)の2つの主要なプロトコルについて説明します。

TCP(Transmission Control Protocol)

TCPは、信頼性の高い通信を提供するためのプロトコルです。以下の特徴があります。

  • コネクション指向: 通信を開始する前に、接続を確立する必要があります。これにより、データの送受信が確実に行われます。

  • 信頼性: データの順序が保証され、パケットの損失や重複が検出され、再送信が行われます。

UDP(User Datagram Protocol)

UDPは、信頼性よりも速度を重視したプロトコルです。以下の特徴があります。

  • コネクションレス: 接続を確立せずにデータを送信します。これにより、オーバーヘッドが削減され、迅速な通信が可能です。

  • 信頼性の低さ: データの順序や到達確認は行われず、パケットの損失や重複が発生する可能性があります。

UDPの考え方について

UDPは、速度を重視し、信頼性をその分落としています。この考え方は、通信性能が現代ほどよくなかったときであっても『とにかく余計なことしないで、速く送る』という考え方から来ています。 しかし、実装上のものを考えるとこれはこれで理にかなっている部分があります。

  • データリンク層: イーサネットやWi-Fiでは、送ったデータが『きちんと届いたか』についてのチェックがほとんど行われていません。

  • ネットワーク層: IPは、パケットの順序や到達確認を行いません。パケットが途中で失われることもあります。失われた場合にルーターがICMPにより通知をしてくれることがありますが、確実ではありません。

つまり、トランスポート層におけるUDPは「送信確認を行わない」という意味では、データリンク層やネットワーク層の特性を引き継いでいるとも言えます。

UDPは"User"と入っていますが、このユーザーは実際のところ利用者の立場ではなく アプリケーションの開発者 を指していると考えてください。

  • 必要なことは自分(ここでは開発者)が行う

  • 余計なことをしてくれるな

という考え方です。UDPは、アプリケーション開発者に対して、必要な機能を自分で実装する自由を与える一方で、信頼性の低さを受け入れることを要求します。

TCPの考え方について

TCPはUDPに比べると『至れり尽くせり』な感じが強いです。

  • 接続の際に信頼性の高い通信を確立する

  • データの順序を保証する

  • パケットの損失や重複を検出し、再送信を行う

  • フロー制御を行い、ネットワークの輻輳を防ぐ

といった具合に、トランスポート層としてのTCPは、信頼性の高い通信を実現するためのさまざまな機能を提供しています。 実際の利用において多少の面倒な部分はありますが、その分通信内容の信頼性担保などを任せておけるようになります。

TCPとUDPの使い分け

TCPとUDPは、それぞれ異なる用途に適しています。以下のような使い分けが一般的です。

  • TCP: 信頼性が重要なアプリケーション(例: ウェブブラウジング、電子メール、ファイル転送など)で使用されます。データの順序や完全性が保証されるため、重要な情報の送受信に適しています。

  • UDP: リアルタイム性が求められるアプリケーション(例: オンラインゲーム、音声通話、ビデオストリーミングなど)で使用されます。データの順序や完全性が保証されないため、多少のパケット損失が許容される場合に適しています。

その一方で、現代は『通信環境がそれなりに高速で安定している』という状況からか、UDPの利用が増えているのは事実です。特にインターネット上の主要なプロトコルであるHTTPでは、HTTP/3という最新のバージョンにおいて、UDPを基盤としたQUICというプロトコルでの通信を行っています。