前回はOSI参照モデルの第4層にあたる「トランスポート層」について、(1)データをやりとりするアプリケーション(ソフトウェア)をポート番号という値で識別する仕組みと、(2)下位層が処理できる適切なデータの容量に合わせてデータを分割するセグメンテーションという仕組みについて紹介しました。
今回は、TCP/IPの仕組みでトランスポート層のプロトコルとして定義されている「TCP」と「UDP」についてそれぞれの特徴を紹介します。
2種類のプロトコル
トランスポート層には、「通信対象となるアプリケーションの識別」「適切な容量へのデータ分割」という2つの役割がありました。TCP/IPのトランスポート層では、この機能を果たすプロトコルとして、TCP(Transmission Control Protocol)およびUDP(User Datagram Protocol)の2種類を定義しています。TCPは「コネクション型通信」を使って、UDPは「コネクションレス型通信」を使って動作するプロトコルです。
まずは、それぞれのプロトコルが使う「コネクション通信」および「コネクションレス型通信」とはどういうものかについて考えてみましょう。
コネクション型通信は、宛先の協力によって「正しく届いている」状況を送信元と共有しながら動作するという特徴を持つ方式です。次の3つの動作を行っています。
・送信元と宛先が「互いに協力し合う」という合意(コネクション)を確立
・実際のデータ転送を行う
・データ転送が終わった段階でコネクションを解消する
コネクションレス型通信は、宛先との合意(コネクション)を持たず、送信元から一方的にデータ転送を行うことで、高速でシンプルな動作をするという特徴を持つ方式です。
両者の使い分けは、トランスポート層にデータ転送を依頼するアプリケーションが通信の信頼性をどのように確保したいかという考え方の違いによって決められます。
TCPがコネクション型通信を実現するための仕組み
TCPはコネクション型通信を実現するためのプロトコルです。「正しく通信できている」ことを保証するための仕組みをいくつか紹介します。
(1)通信の状況を番号で管理する
TCPは、データ分割(セグメンテーション)機能によって分割された一つひとつに対して順番を表す「シーケンス番号」を付け、この番号に従って送信を行います。宛先は確認応答(Acknowledge)というメッセージを使って、データが受信できた事実を送信元に教えます。その際に「次に届けてくれるシーケンスは〇番ですね?」という意味の確認応答番号を含めています。
このようなやり取りを繰り返すことで、両者がシーケンス番号どおり通信できていることを認識し合います。
(2)「3ウェイハンドシェイク」によるコネクション確立
上記のように番号で通信を管理できるのは、送信元も宛先も「番号での管理に協力し合う」という合意が事前にできているからです。コネクション型通信における最初のステップである「コネクションの確立」にあたる動作を「3ウェイハンドシェイク」という方法で実現します。名前のとおり、3回のメッセージ交換でできています。
A)送信元からのメッセージ
「私の番号管理に協力して(SYNchronize)くれませんか」という依頼
B)宛先からのメッセージ
「わかりました(ACKnowledgement)、あなたの番号管理に協力します」という約束
「あなたの方こそ、私の番号管理に協力して(SYN)くれませんか」という逆の依頼
C)送信元機器からのメッセージ
「わかりました(ACK)、あなたの番号管理に協力します」という約束
ここまでの動作で両者とも相手から約束(ACK)を得られ、互いに相手を信頼しながら自分の役割を果たすという準備が整います。
通信が失敗した場合の再送処理
ネットワークの不具合などで「データが届かない」ことや「確認応答が届かない」ことが発生すると、動作が先に進まなくなってしまいます。この場合は、送信元は一定の待ち時間が経過すると確認応答の受け取りを諦め、直前に送信したシーケンス番号のセグメントを再送信するようになっています。
この処理によって通信時間は大きく延びてしまいますが、宛先から確認応答を得るために欠かせない仕組みです。この再送処理の動作が一定の回数に達すると、エラーと判断して通信動作そのものを中止するようになっています。
TCPは以上のような3種類の動作を中心に「順番どおり」に「間違いなく」宛先へ届いたことを確かめながらデータ転送を行っています。この他にも通信効率を高めたり、通信エラーを起こしにくくしたり、といったさまざまな工夫が施されています。
TCPのヘッダ情報
TCPが作成するセグメントには、下図のようなヘッダが付与されます。さまざまな処理に必要な情報が盛り込まれていますが、その中からいくつかの要素を取り上げてTCPの動作との関連を紹介します。
- 送信元ポート番号
- 宛先ポート番号
→トランスポート層の基本的な動作であるアプリケーションの識別に使われます - シーケンス番号
→送信元が自分のセグメントに順番を付ける部分です
- 確認応答番号
→宛先が受け取ったセグメントのシーケンス番号(プラス1)を送信元へ通知する部分です
- コードフラグ
→特殊なメッセージであることを示す部分で、ビットごとに役割が定義されています
確認応答のACKメッセージ、3ウェイハンドシェイクで利用するSYNメッセージは、この部分で見分けられます。
UDPの動作とヘッダ情報
UDPはコネクションレス型通信を実現するためのプロトコルで、TCPのような信頼性を確保する特別な制御は行いません。データ転送の動作がシンプルに行われるため、TCPに比較して高速で、通信中の待ち時間(遅延)が起きにくいという特徴があります。
データ転送の動作がシンプルなUDPは、ヘッダ内に含まれる制御情報の項目が少なく、ヘッダ自体の長さもTCPに比べて格段に短く作られています。
- 送信元ポート番号
- 宛先ポート番号
トランスポート層の基本的な動作であるアプリケーションの識別に使われます。
もう一つUDPの大きな特徴として、コネクションという関係の上に成り立つ1対1(送信元と宛先)の通信しか対応できないTCPに比べ、UDPは複数の宛先に対して同時に通信を行う仕組みに対応できるという点が挙げられます。
2つのプロトコルは、どちらかが優れている・劣っているという比較で捉えるのではなく、それぞれの特徴を活用してどんな通信を行いたいか、という2つの選択肢が用意されているものだという捉え方をしてください。
まとめ
・TCPは、インターネット上でコネクション型通信を実現するプロトコル
番号管理によって、順番どおりにデータを送信していることを確認できる
確認応答によって、間違いなく届いたことを確認できる
再送処理によって、通信エラーに対する備えができている
・UDPは、インターネット上でコネクションレス型通信を実現するプロトコル
特別な処理を行わないため、高速に動作する
複数の宛先へ同時に通信することができる
・それぞれの特徴や利点を踏まえて、TCPやUDPが選ばれている
次回はトランスポート層のさらに上位となる階層、セッション層、プレゼンテーション層、アプリケーション層について紹介します。
著者プロフィール
伊藤 さくら(いとう さくら)
ネットワンシステムズ株式会社
ビジネス開発本部イノベーション推進部ネットワークアカデミーチーム所属
2020年ネットワンシステムズ入社。シスコシステムズ社認定インストラクター資格を取得し、社内外に向けて初学者を対象にしたネットワーク基礎コースの研修を多く実施。産学連携の一環として大学との共同開発による情報セキュリティ授業のカリキュラム策定にも参加し、その講義を担当。また、放送業界に特化した技術者育成研修にも取り組んでいる。