9.8. ポート¶
IP アドレスは、パケットがどの ホスト 宛てなのかを示します。現代のホストは多数のプログラムを同時に実行します(Web ブラウザ、チャットクライアント、ビデオ通話、バックアップタスクなど)。そしてそれらのそれぞれが並行してパケットを送受信しています。IP 層にはそれらを区別する手段がなく、到着したすべてのパケットをただ「ホスト」へ渡すだけです。どのパケットがどのプログラムに属するのかを決める何かが必要です。
ポート番号 がその答えです。トランスポート層のすべてのパケットは、IP ヘッダーに加えて 2 つの追加フィールドを運びます。送信元ポート と 宛先ポート です。それぞれは 16 ビット整数なので、ホストごとに 65535 個の可能なポート番号があります。IP アドレスと組み合わせることで、ポートはホストの 内部 にある 1 つの特定のエンドポイント、つまり 1 つの特定のプログラムの特定のやり取りを識別します。
多数のプログラムが 1 つの IP アドレスを共有しており、宛先ポートが到着した各パケットを正しいプログラムへ振り分けます。¶
9.8.1. ウェルノウンポート¶
最初の 1024 個のポート番号は、慣例により標準サービス用に予約されています。読者が出会ういくつかを挙げます:
22 -- SSH(Secure Shell プロトコル。暗号化されたリモートログインに使用されます)。
53 -- DNS、Domain Name System(名前と DNS で扱います)。
80 -- HTTP、Hypertext Transfer Protocol。Web の暗号化されていないプロトコルです。
123 -- NTP、Network Time Protocol(デバイスがタイムサーバーから時刻を設定する仕組み)。
443 -- HTTPS、TLS(Transport Layer Security。インターネットプロトコル用の標準的な暗号化ラッパー)の上で運ばれる HTTP。ブラウザで鍵アイコンを表示するすべての Web ページの背後にあるプロトコルです。
この慣例こそが、ブラウザがポートを指定せずに http://example.com に接続することを可能にしています。HTTP のウェルノウンポートが 80 であると想定するからです。Web サーバーに接続するカメラも同じことをします。
1024 を超えると、ポート番号は制限されておらず、どのプログラムでも 1 つを確保できます。データベースサーバー(PostgreSQL は 5432、MySQL は 3306)、アプリケーションサーバー、カスタムプロトコルはすべて、より高い範囲のどこかに存在します。
9.8.2. エフェメラルポート¶
サーバーは既知のポートでリッスンします。クライアントは自分側で 別の ポートを使用し、送信接続ごとに新しく選びます。
カメラがポート 443 上の Web サーバーに接続するとき、やり取りは次の間で行われます
camera IP : <some-port> <--> server IP : 443
<some-port> は エフェメラルポート です。MicroPython は高い範囲から未使用の番号を選び、接続の間それを使用し、その後解放します。スクリプトはどの番号が選ばれたかを気にする必要はありません。ソケット層がそれを処理します。
9.8.3. リッスンと通話¶
ポートが果たす役割は、やり取りのどちら側にあるかによって決まります。2 つの異なるケースがあります:
リスニング ポートは、求められていない接続を 受信 したいプログラムに属します。プログラムは MicroPython に「ポート 80 の自分宛てに来る着信パケットはすべて自分のものだ」と伝え、待機します。サーバーがこれを行います。
接続済み ポートは、やり取りを 開始 したいプログラムに属します。プログラムはエフェメラルポートを選び(または MicroPython に選ばせ)、それを送信元ポートとし、サーバーのウェルノウンポートを宛先としてパケットを送信し、やり取りの残りでも同じポートのペアを使用します。
1 つのプログラムが両方を同時に行い、それぞれの役割に対して異なるポートを保持することもできます。カメラは、設定用ユーザーインターフェースからの着信 HTTP 接続のためにポート 8000 でリッスンし、同時に リモートサーバーへのポート 443 の送信 HTTPS 接続を保持するかもしれません。2 つの役割は干渉しません。各やり取りは完全な (src IP, src port, dst IP, dst port) の 4 つ組によって識別され、2 つのやり取りが同じ 4 つ組を共有することはありません。
9.8.4. ポートが解き放つもの¶
ポートが整うと、トランスポート層はついに プログラム間 の配送問題を解決できます。今やパケットは、正しい ホスト(IP アドレス)だけでなく、そのホスト内の正しい ソケット(ポート番号)へ振り分けられるだけの十分な情報を運びます。
次の 2 ページでは、そのアドレッシングの上にトランスポート層が提供する 2 つの方式を扱います。UDP(User Datagram Protocol。各パケットは独立しており、保証はありません)と TCP(Transmission Control Protocol。接続された、信頼性のある、順序付けられたストリーム)です。