9.6. パケットとルーティング¶
IPアドレスは、メッセージが 誰 宛てなのかを示します。それを実際に配送する仕組みは ルーティング と呼ばれ、パケットが送信者のローカルネットワークから、おそらくは遠く離れた受信者のローカルネットワークまで移動するホップごとのプロセスです。
9.6.1. パケットの概要¶
パケット はIP層の作業単位であり、小さなヘッダーとペイロードを持つバイトのかたまりです。ヘッダーにはルーティングに関係する2つのフィールドがあります:
送信元 IPアドレス(パケットがどこから来たか)。
宛先 IPアドレス(パケットがどこへ向かっているか)。
ペイロードは、トランスポート層がネットワーク層に配送するよう要求したものです。パケットヘッダーには他にも time-to-live カウンター、ヘッダー全体のチェックサム、いくつかの制御フラグも含まれます。これらはいずれも、カメラのPythonコードが直接触れるものではありません。
パケットは「試みた」こと以上は何も保証しません。失われたり、重複したり、順序が入れ替わって配送されたりすることがあります。信頼性と順序付けは上位のトランスポート層が解決する問題です。ネットワーク層は、各パケットを宛先へ向けて転送するために最善を尽くすだけです。
9.6.2. ホップごとに¶
パケットはカメラを離れ、カメラのローカルセグメント上にいない最初のデバイス、すなわち デフォルトゲートウェイ に到達します。(前のページ では、ネットワーク確立時にDHCPがカメラにゲートウェイのアドレスを渡すことに触れました。)そのデバイスは ルーター であり、パケットを受信し、その宛先を見て、先へ転送することを役目とする装置です。
カメラから宛先へのパケットはルーター間をホップし、それぞれが一歩ずつ近づいていきます。¶
ルーターは ルーティングテーブル を持っています。これは「このパターンに一致する宛先には、このインターフェースからパケットを送出する」という一覧です。カメラと同じネットワーク上の宛先については、エントリは「来たケーブルへ送り返す」と指定します。より広いインターネット上の宛先については、エントリは「上流のルーターへ送る」と指定します。既知のパターンの宛先(企業VPN、特定のビジネスパートナーのネットワーク、衛星リンクなど)については、ルーターは既定を上書きするより具体的なエントリを持っている場合があります。
上流のルーターも同じことを行います。そしてその次も。さらにその次も。各ホップは同じ形です。パケットを受信し、テーブルで宛先を検索し、正しいインターフェースから送出します。最終的にパケットは、宛先IPと同じローカルセグメント上に いる ルーターに到達します。そのルーターが最後のホップを配送し、宛先がパケットを受信して、旅は終わります。
9.6.3. 端点は経路を知らない¶
リモートサーバーへパケットを送るカメラは、パケットが どのように そこへ到達するかを知りません。カメラが知っているのは、宛先IPと自身のデフォルトゲートウェイのアドレスだけです。その間にあるすべて、どのルーターを通るか、どの光ファイバーを通るか、どの海底ケーブルを通るかは、経路上のルーターが自身のテーブルに基づいて進みながら決めることです。ルーター自身も、直接の隣接ルーターと、よくある宛先のおおまかな方向しか知りません。インターネット上のどの単一のデバイスも、その完全な地図を持っていません。
その分散性こそが、個々の経路が故障してもネットワークが動き続ける理由です。中間のどこかで切断されたケーブルは、いくつかのルーターでの再ルーティングというイベントになります。端点はそれにまったく気づきません。これはまた、東京のカメラからダブリンのサーバーへのパケットが、どちらの側も間にどの国があるかを知らなくても成功できる理由でもあります。
9.6.4. これがPythonスクリプトにとって意味すること¶
ネットワーク層におけるカメラの役目は、突き詰めると次のとおりです:
IPアドレスを持つこと。
デフォルトゲートウェイのアドレスを知ること(DHCPがこれを自動的に埋めます)。
任意の IP宛ての送出パケットをそのゲートウェイに渡し、残りの経路を信頼すること。
スクリプトは決して経路を選ばず、中間ホップを指定せず、中間のルーターを目にすることもありません。スクリプトは宛先IPをパケットに書き込み、あとはネットワーク層が引き継ぎます。Pythonスクリプトから見れば、ルーティングのすべては、カメラが参加したネットワークの一つの性質、すなわち「ゲートウェイがパケットを自分にとって有用などこかへ送ってくれる」というものにすぎません。
次に来るトランスポート層は、ルーティングが単に機能することを前提とし、その上に信頼性、順序付け、プログラム間アドレッシングを構築します。