Solaris のシステム管理 (IP サービス)

データのカプセル化と TCP/IP プロトコルスタック

パケットとは、ネットワーク間で転送される情報の基本単位のことです。基本パケットは、送信側システムと受信側システムのアドレスを含むヘッダー、転送されるデータを含む本体、つまり「ペイロード」で構成されます。パケットが TCP/IP プロトコルスタックを通過するとき、各層のプロトコルは、基本ヘッダーにフィールドを追加したり、そこからフィールドを削除したりします。送信側システムのプロトコルがパケットヘッダーにデータを追加する場合、そのプロセスを「データのカプセル化」と呼びます。また、変更後のパケットを表す言葉は、次の図に示すように層によって異なります。

図 1–1 パケットが TCP/IP スタックを通過する方法

この図では、送信側ホストから受信側ホストへ、パケットが TCP/IP スタックを通過する方法を示しています。

この節では、パケットのライフサイクルについて要約します。ライフサイクルは、ユーザーがコマンドを発行するか、またはメッセージを送信することによって開始します。受信側システムの該当アプリケーションがパケットを受信するとライフサイクルは終了します。

アプリケーション層: 通信の発生

パケットの処理は、あるシステム上のユーザーがリモートシステムへのアクセスを必要とするメッセージの送信やコマンドの発行をしたときから始まります。アプリケーションプロトコルは、対応する TCP か UDP のどちらかのトランスポート層プロトコルがそのパケットを取り扱えるように、パケットの形式を設定します。

たとえば、あるユーザーが rlogin コマンドを発行して、リモートシステムにログインしようとしたとします (図 1–1 を参照)。rlogin コマンドは TCP トランスポート層プロトコルを使用します。TCP は、コマンド内の情報を含むデータをバイトストリーム形式で受け取るものと仮定しています。したがって、rlogin はこのデータを TCP ストリームとして送信します。

トランスポート層: データのカプセル化の開始

データがトランスポート層に到達すると、トランスポート層のプロトコルは、データのカプセル化プロセスを開始します。トランスポート層は、アプリケーションデータをトランスポートプロトコルのデータ単位にカプセル化します。

トランスポート層プロトコルは、転送ポート番号で区別される送信側アプリケーションと受信側アプリケーション間に仮想のデータフローを作成します。ポート番号は、メモリー内のデータ送受信専用の場所である「ポート」を識別します。さらに、トランスポートプロトコル層は、信頼性の高い順序どおりのデータ転送など、その他のサービスを提供する場合もあります。最終的な結果は、TCP、SCTP または UDP のどれで情報を処理したかによって異なります。

TCP のセグメンテーション

TCP はデータを確実に受信側ホストに送信できるため、「接続指向」のプロトコルと呼ばれます。図 1–1 は、TCP プロトコルがどのように rlogin コマンドからのストリームを受信するかを示しています。次に TCP は、アプリケーション層から受け取ったデータをセグメントに分割し、各セグメントにヘッダーを添付します。

セグメントヘッダーには、送信側と受信側のポート、セグメント順序に関する情報、「検査合計」と呼ばれるデータフィールドが含まれています。両方のホストの TCP プロトコルがこの検査合計データを使用して、データがエラーなしに転送されたかどうかを判別します。

TCP 接続の確立

TCP は、受信側システムでデータを受信する準備ができているかどうかを、セグメントを使用して判断します。まず、送信側 TCP は「SYN」というセグメントを受信側ホストの TCP プロトコルに送信して、接続を確立することを知らせます。次に、受信側 TCP は「ACK」というセグメントを戻して、セグメントを正しく受信したことを知らせます。送信側 TCP は新たな ACK セグメントを送信して、それからデータの送信を開始します。このような制御情報の交換を「3 相ハンドシェーク」と呼びます。

UDP パケット

UDPは「接続のない」プロトコルです。TCP の場合と異なり、UDP は、受信側ホストにデータが到達したかどうかを確認しません。その代わりに、UDP は、アプリケーション層から受信したメッセージを「UDP パケット」の形式に設定します。UDP は、各パケットにヘッダーを付加します。ヘッダーには、送信側ポートと受信側ポート、パケットの長さを示すフィールド、検査合計が含まれます。

送信側の UDP プロセスは、受信側ホストのピア UDP プロセスにパケットを送信しようとします。アプリケーション層は、受信側 UDP プロセスが、パケットを受信したことを示す肯定応答を戻すかどうかを判別します。UDP は受領の通知を必要としません。UDP は 3 相ハンドシェークを使用しません。

インターネット層: パケットの送信準備

トランスポートプロトコル TCP、UDP、および SCTP がセグメントとパケットをインターネット層に渡すと、これらのセグメントとパケットはインターネット層の IP プロトコルによって処理されます。IP は、これらのセグメントとパケットを「IP データグラム」と呼ばれる単位に形式化して、送信できるように準備します。次に、IP はデータグラムの IP アドレスを判別して、受信側ホストへの効率的な配送ができるようにします。

IP データグラム

IP は、TCP や UDP が追加した情報に加えて、「IP ヘッダー」をセグメントまたはパケットのヘッダーに添付します。 IP ヘッダーには、送信側ホストと受信側ホストの IP アドレス、データグラムの長さ、データグラムのシーケンス番号が含まれます。これらの情報が付加されるのは、データグラムがネットワークパケットとしての許容バイトサイズを超過してフラグメント化が必要になった場合に備えるためです。

データリンク層: フレーミングの実行

データリンク層のプロトコル (PPP など) は、IP データグラムを「フレーム」という形式に設定します。これらのプロトコルは、第 3 のヘッダーとフッターを付加することにより、データグラムを「フレーミング」します。フレームヘッダーには、フレームがネットワークメディアを通過するときのエラーを検査するための、「巡回冗長検査」(CRC) フィールドが含まれています。次に、データリンク層は物理層にフレームを渡します。

物理ネットワーク層: フレームの送受信

送信側ホストの物理ネットワーク層は、フレームを受信し、IP アドレスをネットワークメディアに適切なハードウェアアドレスに変換します。次に、物理ネットワーク層は、フレームをネットワークメディアに送り出します。

受信側ホストでのパケットの取り扱い

受信側ホストに到着したパケットは、送信されたときとは逆の順番で、TCP/IP プロトコルスタックを通り抜けます。このパスを図 1–1 に示します。受信側ホストの各プロトコルは、送信側ホストの対等プロトコルがパケットに付加したヘッダー情報を取り除きます。この処理の順序を次に示します。

  1. 物理ネットワーク層は、フレーム形式のパケットを受信します。パケットの CRC を計算し、データリンク層にフレームを送信します。

  2. データリンク層は、フレームの CRC が正しいことを確認すると、フレームのヘッダーとその CRC を取り除きます。最後に、データリンクプロトコルは、インターネット層にフレームを送ります。

  3. インターネット層は、ヘッダーにある情報を読み取って、転送を識別します。そして、パケットがフラグメントであるかどうかを判別します。その転送がフラグメントである場合は、IP は、フラグメントを組み立て直して、オリジナルのデータグラムに戻します。そして、IP ヘッダーを取り除いてから、データグラムをトランスポート層プロトコルに渡します。

  4. トランスポート層 (TCP、SCTP および UDP) は、ヘッダーを読み取って、どのアプリケーション層プロトコルでデータを受信する必要があるかを決定します。次に、TCP、SCTP または UDP は、自分に関連するヘッダーを取り除き、メッセージまたはストリームを受信アプリケーションに送信します。

  5. アプリケーション層はメッセージを受信して、送信側ホストから要求された操作を実行します。