要約
- 問題は予測できる。サービスが再起動後に空きポートを選び直すと、古い接続先を覚えたクライアントは呼び出せない。固定ポートを全プログラムに割り当てれば、今度は共有ポート空間の調整が必要になる。
- RFC 1057のPortmapperは、変わる接続先を固定の照会口から調べられるようにした。ただし回答が示すのはホスト上の登録であり、稼働や応答者の身元ではない。
サービスのポートは変わり、照会先は変わらない
仮定の例を考えよう。ファイルサービスの再起動後、サーバーは別の空きポートで待ち受け、クライアントは以前のポートへ要求を送る。ホストもRPCプログラムも同じなのに、接続先だけが変わったため要求は届かない。クライアントは新しい位置を推測できず、全サービスに固定ポートを求めれば、今度は限られたポート番号の調整が増える。
Sun Microsystemsが1988年6月に公開したRFC 1057は、別の仕組みを記述した。プログラム番号とバージョンはクライアントが求めるサービスを示し、TCPまたはUDPが転送方式を示す。既知の111番ポートで待ち受けるホスト上のPortmapperが、それらをサーバーの選んだポートに対応付ける。クライアントはまず照会し、その後でサービスに接続する。RPC呼び出しと接続先の解決は別の段階だった。
PMAPPROC_SET は登録を行う。サーバーは同じホスト上のmapperに、プログラム番号、バージョン、転送プロトコル、待受ポートを渡す。同一のプログラム・バージョン・プロトコルの組み合わせは重複登録できない。サービス終了時には PMAPPROC_UNSET で登録を取り消す。クライアントの PMAPPROC_GETPORT に対してゼロが返れば、その組み合わせの登録はない。
役割分担は明快だった。サービスが待受位置を選び、mapperが予測可能な入口からその選択を公開し、クライアントが返されたポートを使う。照会の慣例は固定され、サービスの宛先は動的だった。
照会結果が示さないこと
mapperの回答が示すのは、そのホストの登録表の内容である。RFC 1057は GETPORT を経路全体のヘルスチェックとも、ネットワーク経路が開いている証明とも、ポートを使うプログラムの暗号学的な身元証明とも定めていない。クライアントは接続し、RPCを呼び、結果を解釈しなければならない。サービスが停止しても登録が残れば、照会は成功して接続は失敗する。登録自体がなければ、接続先の解決で失敗する。
「見つかった」という言葉は「登録されている」より強く聞こえやすい。ポート番号が示すのは、そのサービスがそこを待受先として登録したということだけだ。パケットが届くか、サービスがこのクライアントを受け入れるか、要求した手続きが完了するかは分からない。RFCは認証と転送の意味を別に扱い、Portmapperがそれらを代行するとはしていない。
登録表は世界中のRPCプログラムを載せる台帳でもない。サービスを動かすホストごとのローカルな表だった。クライアントは別の情報源からホストアドレスを得て、そのホストのmapperにポートを尋ねる。つまり発見は層に分かれる。名前や設定がホストを示し、プログラム番号とバージョンがインターフェースを選び、Portmapperが転送先を返す。
RFC 1057には登録一覧を返す PMAPPROC_DUMP と、ブロードキャストRPCを支援する PMAPPROC_CALLIT もある。クライアントはブロードキャスト先の固定mapperポートへ要求を送り、受信した各mapperはローカル登録サービスを呼び出せる。RFCの規定では、実行が成功した場合だけ結果が返り、それ以外は応答しない。ホストごとにサービスのポートが違っても呼び出しを試せるが、配信保証や応答ホスト全体の一覧にはならない。
プログラム番号にも調整の境界があった。RFC 1057はSun定義、利用者定義、一時利用、予約済みの範囲を分けた。論理的なプログラム識別子は、動的な転送ポートと別に保たれる。番号はRPCプログラムを指し、ホストごとに解決する値はその実体の待受場所を指す。
TCP/UDPポートから汎用アドレスへ
初期のPortmapperはTCPとUDPのポート番号を扱った。1995年のRFC 1833はPort Mapperのバージョン2に加えて、RPCBINDバージョン3と4を記述した。サービスの転送先が起動ごとに変わり得る一方で、クライアントはサーバーのアドレスにある既知の照会先を必要とする。RPCBINDは転送アドレスを汎用アドレス文字列で表し、ネットワーク識別子も持たせたため、TCP/UDPポート以外へ対応範囲を広げた。
後年の文書は、1988年の設計範囲をはっきりさせる。RFC 1057はRPCプログラムを一つの転送ポートに固定せず、プログラムとバージョンを転送方式ごとの待受先へ結び付ける照会慣例を定義した。RFC 5531も後に、RPCのメッセージ形式とバインディング、ランデブーの仕組みを独立したものとして記述している。
この仕組みの利点は限定的だが明確だった。共通の照会規約を使えば、クライアントはサービスのポートを事前に知る必要がない。固定ポートの消費を抑え、各インスタンスがローカルにポートを選べる。その代わり、呼び出し前に照会が一回増え、起動、登録、停止、登録解除に追随する状態管理が必要になる。
RFCが記録するのは設計であって、当時の導入数や実測の信頼性ではない。古い登録がどの程度発生したか、各システムがどれほど早く修正したかは示さない。確実に言えるのは構造のことだ。Portmapperは安定したローカル照会先を通じてRPCの接続先を探せるようにしたが、到達性、認証、手続きの成功は後続の確認に残した。
一次資料:RFC 1057 — RPC version 2、RFC 1833 — ONC RPCのBinding Protocol、RFC 5531 — ONC RPC version 2。
会員向け解説
プロフィールの詳細
適切な会員レベルでログインすると、解説全文と出典メモをご覧いただけます。
Strategic Circle 限定
Strategic Circle
すべての読者に公開されています。参加してログインすると プロフィール解説 を閲覧できます。
Strategic Circle に参加Leadership Alliance 会員限定
Leadership Alliance
対象となる IP 資産の所有者・管理者向けです。ログインすると Leadership Alliance の解説を閲覧できます。
Leadership Alliance に参加
