Chapter 25. フロントエンド/バックエンド プロトコル

Table of Contents
概要
プロトコル
メッセージのデータ型
メッセージ形式

Note: Phil Thompson によって作成されました。 Tom Lane によりプロトコルバージョン 2.0 用にアップデートされました。

Postgres はフロントエンドとバックエンドの通信に メッセージベースのプロトコルを使用します。このプロトコルは TCP/IP および Unix ソケットを介して実装されます。Postgres v6.3 はこのプロトコルに対しバージョン番号を導入しました。これは旧バージョンのフロントエンド に対しても接続を可能にするためですが、このドキュメントでは以前のバージョンで使用された プロトコルについては解説しません。

このドキュメントは Postgres v6.4 およびそれ以降に実装された プロトコル 2.0 バージョンについて記載します。

本プロトコル上に構築されたより高度の機能(たとえば、接続開始後どのように libpq がある特定の環境変数を手渡すか)についても記載します。

概要

主だった3つのコンポーネントとして、フロントエンド(クライアント側で動くもの)、 postmaster およびバックエンド(サーバ上で動くもの)があります。 postmaster と バックエンドは異なった役割を持っていますが、同一のバイナリで実装されています。

フロントエンドは開始パケットを postmaster に送ります。開始パケットにはユーザの 名前とユーザが接続しようとしているデータベースの名称が含まれています。 postmaster はこのパケットの情報と pg_hba.conf(5) ファイルの内容から、ここでフロントエンドが 更に加えて送さなければならない認証のための情報(もし有れば)を決定してフロントエン ドに要求します。

フロントエンドはそこで要求された認証情報を送り返します。 postmaster が承認した 場合 postmaster は認証完了のサインをフロントエンドに返し、接続をバックエンドに 引き渡します。そこでバックエンドは(通常の場合)起動成功あるいは失敗(例えば無効な データベース名)のメッセージを返します。

次に引き続く通信はフロントエンドとバックエンド間で交換される問い合わせとその 結果のパケットです。postmaster は通常の問い合わせと回答の通信には関与しません。 (但し、現在バックエンドで処理中の問い合わせをフロントエンドが取消けそうとす るとき postmaster は関与します。詳細に付いては下記にあります。)

フロントエンドが接続を解除するとき、特定のパケットを送出しバックエンドの応答 を待つこと無く接続を解除します。

パケットは一連のデータの流れとして送出されます。第一番目のバイトは、それ以降 パケットが何を要求しているかを規定します。例外はフロントエンドから postmaster に送られるパケットで、パケット長と、パケットのデータそのものから成ります。 この違いは歴史的な事情によるものです。