大きな画面での利用をおすすめします — アニメーションと操作がより快適になります。
入力

OSI / TCP-IP モデル

OSI はネットワーク通信の役割を 7 層に分け、TCP/IP は 4 層にまとめます。この教材の Ethernet + IP + TCP 経路では、TCP、IP、Ethernet がそれぞれカプセル化を行います。下位層のヘッダーは 3 個です。OSI の層名が 7 個あっても、7 個の汎用ヘッダーを付けるわけではありません。セッション層とプレゼンテーション層では追加しません。

HTTP リクエストを荷物に入れたメモと考えてください。TCP ポートは部屋番号、IP は住所、Ethernet は次の受取先です。途中の郵便局は外袋を外して住所を読み、次の配送先に向けて袋を替えます。メモを開く必要はありません。データがホストに届いてもプログラムに届かないときも、この役割の違いが手掛かりになります。

OSI と TCP/IP の層構造

OSI の 7 層を上から見ます。

  • アプリケーション層:プログラムが送るメッセージ。ここでは GET / HTTP/1.1 です。
  • プレゼンテーション層:形式の変換や暗号化。TLS は概念上この役割を担います。本例の平文 HTTP では使いません。
  • セッション層:通信の識別。本例では TCP ソケットが識別し、独立した OSI ヘッダーは付けません。
  • トランスポート層:ポートによって同じホスト上のプログラムを区別します。
  • ネットワーク層:IP アドレスで宛先ホストを指定し、ネットワークを越えて届けます。
  • データリンク層:次ホップの MAC アドレスを使って 1 本のリンクを渡ります。
  • 物理層:回線上のビットへ符号化します。ヘッダーの追加ではありません。

RFC 1122 の TCP/IP は、アプリケーション、トランスポート、インターネット、リンクの 4 層です。OSI のセッション層とプレゼンテーション層をアプリケーション層へ、物理層をリンク層へまとめます。本例のカプセル化は 3 回のままです。教科書の 5 層モデルはセッション層とプレゼンテーション層を統合し、物理層を残したものです。

PDU(プロトコルデータ単位)は各層が扱うデータです。メッセージ → TCP セグメント → IP パケット → Ethernet フレーム → ビットと呼び方が変わります。

コードの wrap は、アプリケーション、プレゼンテーション、セッション、物理の各層では入力をそのまま返します。Header(...) を呼ぶのはトランスポート、ネットワーク、データリンクだけです。ループの後で to_bits を呼びます。HTTP 自体のヘッダーはアプリケーションデータの内部にあり、下位層のカプセル化をもう 1 回数えるものではありません。

通常のルーターはリンク層を外し、宛先 IP を読み、次ホップ用の Ethernet ヘッダーを付けます。TCP や HTTP の解析は不要です。ここでは NAT やアプリケーションプロキシを扱いません。

OSI / TCP-IP モデルのステップ

初期設定は OSI 7、経路は direct。10.0.0.2:49152 から 93.184.216.34:80 へ GET / HTTP/1.1 を送ります。

  1. 層を表示。 クライアントとオリジンに空の 7 層スタックが並び、対応する TCP/IP の層名も表示されます。
  2. アプリケーションが作成。 GET / HTTP/1.1 が現れます。ヘッダー数は 0。HTTP がこの例のペイロードです。
  3. プレゼンテーション。 層が点灯してもデータは変わりません。TCP 上の HTTPS なら TLS が暗号化を担い、そのレコードは TCP の内部に入ります。今回は平文です。
  4. セッション。 TCP ソケットが通信を識別します。ヘッダーは増えません。
  5. トランスポートで包む。 TCP の sport=49152 dport=80 を追加します。PDU はセグメント、ヘッダー数は 1。
  6. ネットワークで包む。 IP の 10.0.0.2 → 93.184.216.34 を追加します。PDU はパケット、数は 2。
  7. リンクで包む。 クライアント MAC からオリジン MAC への Ethernet ヘッダーを追加します。PDU はフレーム、数は 3。
  8. 物理層で符号化。 フレームがビット表示になります。to_bits は符号化だけなので、内部のヘッダーは 3 個のままです。
  9. 回線上を移動。 ビットがリンクを進み、両端の物理層が点灯します。
  10. オリジンが復号。 ビットを同じ 3 重のフレームへ戻します。
  11. リンクを外す。 Ethernet を取り除きます。ポートや URL は読みません。
  12. ネットワークを外す。 宛先が自分であることを確認し、IP を取り除きます。
  13. トランスポートを外す。 TCP を取り除き、ポート 80 の待受ソケットへ渡します。PDU はメッセージに戻ります。
  14. 上りのセッション。 データは変わりません。
  15. 上りのプレゼンテーション。 今回は変更なし。HTTPS を使う構成なら復号の役割をここで示せますが、ポート番号だけでは暗号化の有無は決まりません。
  16. アプリケーションが読む。 送信時と同じバイト列 GET / HTTP/1.1 を受け取ります。
  17. 完了。 回線上の下位ヘッダーは 3 個、層名は 7 個。セッション層とプレゼンテーション層はデータを変更しませんでした。

TCP/IP 4 に切り替えてもカプセル化は 3 回です。セッション層とプレゼンテーション層の上下 4 ステップが省かれます。

Via router は送信後に 1 ホップを挿入します。最初の Ethernet の宛先はルーターです。ルーターはそのヘッダーを外し、dst が 93.184.216.34 であることを読み、次ホップ用の Ethernet ヘッダーを付けて転送します。アプリケーション層とトランスポート層は点灯しません。実際の IPv4 では TTL を減らしてヘッダーチェックサムも更新します。宛先が同じでも IP ヘッダー全体が不変とは限りません。

Skip transport では omit == "transport" により continue が実行され、IP が GET を直接包みます。受信側は Ethernet と IP を外せますが、TCP ヘッダーと宛先ポートがないため unwrap が失敗します。この TCP サービスの待受ソケットには届けられません。L1〜L3 の成功とアプリケーションへの到達は別です。

層名は 7 個、ヘッダーは 3 個

層名は役割、ヘッダー数は wrap が行った操作の数です。ステップ 4 では GET だけ、7 では 3 重、8 では同じ内容をビットへ符号化しています。TCP/IP に切り替わるのは役割の分類です。

MAC は次ホップ、IP は宛先ホスト、ポートはサービスを指定します。通常のルーター転送を挟むと Ethernet ヘッダーが変わり、宛先 IP と TCP ポートは残ります。「ホストに届いた」と「そのポートで待ち受けている」を区別してください。転送に IP までしか必要なければ、ルーターはアプリケーションの内容を読む必要がありません。

境界条件

  • トランスポートを省略。 Ethernet と IP は処理できますが、この TCP サービスには TCP ヘッダーとポートが必要です。他の IP プロトコルや raw ソケットは対象外であり、すべての通信にポートが必要だという意味ではありません。
  • ルーター経由。 NAT のない本例では宛先 IP を保ち、次ホップの MAC を変更します。実際の IPv4 では TTL も変わります。最初のフレームはまずルーターに届けます。
  • 上りの役割だけの層。 TCP を外した後にセッション層とプレゼンテーション層が点灯しますが、下りと同じくデータは不変です。
  • 物理層。 to_bits は符号化です。OSI が 7 層でも、Ethernet フレームに 7 個の汎用ヘッダーがあるわけではありません。
  • 固定リクエスト。 任意のペイロード入力はありません。アドレス、ポート、ヘッダー数を固定し、モデルと経路を比較します。

よくある間違い

  • 層名の数をヘッダー数にする。 プレゼンテーション層で止めてもデータは増えていません。Ethernet で 3 回目のカプセル化が完了します。
  • TLS を TCP と並ぶ OSI ヘッダーにする。 TCP 上の TLS は TCP の内部に入ります。Wireshark で内部の HTTP まで表示するには復号鍵が必要です。TCP と並ぶ汎用の「L6 ヘッダー」はありません。
  • ルーターが HTTP を読むと思う。 通常の転送でアプリケーション層まで処理する必要はありません。必要なら、ルーターは転送するすべてのアプリケーションプロトコルを解析しなければなりません。
  • MAC でプロセスを選ぶ。 Ethernet は 1 ホップの配送を担い、本例では TCP ポートがサービスを選びます。
  • OSI と TCP/IP を競合する実装と考える。 役割を分ける粒度が違います。この例のデータとカプセル化操作は共通です。

モデルの簡略化

これは役割の説明であり、完全なパケットキャプチャではありません。TCP にはシーケンス番号、チェックサム、オプション、ウィンドウスケーリングがあります。IP には TTL、フラグメンテーション、IPv4 と IPv6 の違いがあり、Ethernet には VLAN やトレーラーもあります。実際の経路は複数ホップになり得ます。Header("TCP") はラベルであり、20 バイトの実ヘッダーそのものではありません。IPv4 のルーターは TTL とヘッダーチェックサムを更新します。IPv6 は Hop Limit を使い、IP ヘッダーチェックサムを持ちません。

この TCP/IP の対比では TLS と HTTP/2 はアプリケーション層の範囲です。QUIC は UDP 上のトランスポートプロトコルなので、この TCP の経路とは異なります。TCP 上の HTTPS は TLS レコードを TCP 内に格納します。ポート 443 を使うだけで暗号化されるわけではありません。5 層モデルは OSI の L5、L6 を統合したものなので、別の表示モードにはしていません。