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 を送ります。
- 層を表示。 クライアントとオリジンに空の 7 層スタックが並び、対応する TCP/IP の層名も表示されます。
- アプリケーションが作成。
GET / HTTP/1.1が現れます。ヘッダー数は 0。HTTP がこの例のペイロードです。 - プレゼンテーション。 層が点灯してもデータは変わりません。TCP 上の HTTPS なら TLS が暗号化を担い、そのレコードは TCP の内部に入ります。今回は平文です。
- セッション。 TCP ソケットが通信を識別します。ヘッダーは増えません。
- トランスポートで包む。 TCP の
sport=49152 dport=80を追加します。PDU はセグメント、ヘッダー数は 1。 - ネットワークで包む。 IP の
10.0.0.2 → 93.184.216.34を追加します。PDU はパケット、数は 2。 - リンクで包む。 クライアント MAC からオリジン MAC への Ethernet ヘッダーを追加します。PDU はフレーム、数は 3。
- 物理層で符号化。 フレームがビット表示になります。
to_bitsは符号化だけなので、内部のヘッダーは 3 個のままです。 - 回線上を移動。 ビットがリンクを進み、両端の物理層が点灯します。
- オリジンが復号。 ビットを同じ 3 重のフレームへ戻します。
- リンクを外す。 Ethernet を取り除きます。ポートや URL は読みません。
- ネットワークを外す。 宛先が自分であることを確認し、IP を取り除きます。
- トランスポートを外す。 TCP を取り除き、ポート 80 の待受ソケットへ渡します。PDU はメッセージに戻ります。
- 上りのセッション。 データは変わりません。
- 上りのプレゼンテーション。 今回は変更なし。HTTPS を使う構成なら復号の役割をここで示せますが、ポート番号だけでは暗号化の有無は決まりません。
- アプリケーションが読む。 送信時と同じバイト列
GET / HTTP/1.1を受け取ります。 - 完了。 回線上の下位ヘッダーは 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 を統合したものなので、別の表示モードにはしていません。
続けて学ぶ
同じ手法につながるレッスンや、次の概念への入口です。
鍵マークのあるレッスンの操作には有料アクセスが必要です。解説はすべて無料で読めます。
誤りや気になる点を見つけましたか? フィードバックを送る。