9.2. 階層化されたプロトコル¶
カメラから別の都市にあるサーバーへフレームを送るということは、いくつもの問題を同時に解決することを意味します。電気信号は最初のワイヤを渡り切らなければなりません。そのワイヤ上のバイト列はローカルスイッチを通り抜けて進路を見つけなければなりません。ローカルネットワークは、自身とインターネットの残りの部分との間にあるものへメッセージを引き渡さなければなりません。旅を生き延びたパケットは順序通りに再構築されなければなりません。受信側は自身のどのプログラムにそれらを渡すべきかを知らなければなりません。そしてバイト列そのものが、両端の合意する何らかの意味を持たなければなりません。
そのすべてを 1 つのコードブロックで解決しようとするのは手に負えません。標準的な答えは、仕事を レイヤ に分割することです。各レイヤは 1 つの明確に定義された問題を解決し、その上のレイヤに対して単純なサービスを公開します。プログラムは常に自身のすぐ下のレイヤとのみやり取りし、それより下のレイヤは見えません。
ネットワークスタックの各レイヤは 1 つの問題を解決し、整理された抽象化を次のレイヤへ引き渡します。¶
9.2.1. 5 つのレイヤ¶
以下の名前は、本セクションの残りの部分で使用するものです。これらは、ネットワークが設計の基礎とした標準モデルに由来します。レイヤ間の正確な境界は時に曖昧ですが、各レイヤが果たす役割は安定しています。
物理レイヤ。 同じワイヤまたは無線上にある 2 つのデバイス間で ビット を移動します。電圧レベル、光パルス、RF 変調などです。ここでのカメラの仕事は、ほとんどが正しいケーブルを挿す、または正しいワイヤレスネットワークに参加することであり、残りはシリコンが行います。
リンクレイヤ。 同じローカルセグメントを共有する 2 つのデバイス間で フレーム(バイトの小さな塊)を移動します。各フレームを特定の隣接デバイス 1 つへ向けられるよう、ハードウェアアドレスを付加します。Ethernet と Wi-Fi が、カメラが実際に出会う 2 つのリンク技術です。
ネットワークレイヤ。 同じローカルセグメント上だけでなく、インターネット 上の任意の 2 つのデバイス間で パケット を移動します。どのケーブルに接続されているかとは無関係にホストを識別するソフトウェアレベルのアドレスと、パケットがあるローカルセグメントから次のセグメントへとホップして到着するまでの ルーティング メカニズムを付加します。これは、カメラの Python コードが何かを言い始める最初のレイヤです。
トランスポートレイヤ。 パケットの上に乗り、ホスト自身だけでなく、2 つのホスト上の プログラム 間での配送を提供します。一般的な種類は 2 つあります。1 つは接続された順序付きのバイトストリームを配送し(大半のトラフィックを担う主力)、もう 1 つは互いに独立して伝わる自己完結したメッセージを配送します(保証よりも低オーバーヘッドが重要な場合に使われます)。同じホスト上の複数のプログラムが並行して会話を保てるよう、ポート番号 を付加します。
アプリケーションレイヤ。 トランスポートより上のすべて、つまりバイトに意味を与えるプロトコルです。Web ブラウザがページを読み込むために話すもの、そして読者が日々すでに使っているほぼすべての他のインターネットサービスの背後にあるものが、ここに存在します。本チュートリアルではトランスポートを詳しく扱い、このレイヤには独自の後続セクションが用意されています。
9.2.2. 実行時にレイヤがどのように積み重なるか¶
カメラがネットワーク上にバイトを送るとき、各レイヤはデータの前に自身のヘッダを付加します。これは封筒を別の封筒の中に入れ子にするようなものです。
まずアプリケーションのバイトが入ります。
トランスポートレイヤは、それらがどのプログラムに属するか(ポート番号)を示す小さなヘッダでそれらを包みます。
ネットワークレイヤは、それらがどのホスト宛てか(ソフトウェアレベルのアドレス)を示すヘッダで それ を包みます。
リンクレイヤは、ローカルセグメント上の次にどのデバイスへ渡すか(ハードウェアアドレス)を示すヘッダで それ を包みます。
物理レイヤは、その束全体をワイヤ上のビットに変換します。
反対側の端では、各レイヤが自身のヘッダを剥がし、残りを上へ渡します。受信側のアプリケーションは、ネットワーク、リンク、物理の各レイヤがそもそも存在したことに気づかないまま、自身のバイトを取り戻します。
この入れ子構造こそが、本チュートリアルが下から上へと進む理由です。下のレイヤが何をするかを理解すると、その上のレイヤが必然的なものに感じられます。下位 2 つのレイヤは、Python から設定するものがほとんどないため、それぞれ 1 ページで扱います。ネットワークレイヤ以降は、Python の役割が大きくなるにつれてペースが緩やかになります。