Note: Phil Thompson (<phil@river-bank.demon.co.uk>)によって 作成されました。 Tom Lane (<tgl@sss.pgh.pa.us>)によりプロトコルバージョン 2.0 用に更新されました。
Postgres はフロントエンドとバックエンドの通信に メッセージベースのプロトコルを使用します。このプロトコルは TCP/IP および Unix ソケットを介して実装されます。 Postgres v6.3 はこのプロトコルに対しバージョン番号を導入しました。 これは旧バージョンのフロントエンド に対しても接続を可能にするためですが、 このドキュメントでは以前のバージョンで使用されたプロトコルについては解説 しません。
このドキュメントは Postgres v6.4 およびそれ以降に実装された プロトコル 2.0 バージョンについて記載します。
本プロトコル上に構築されたより高度の機能(たとえば、接続開始後どのように libpq がある特定の環境変数を手渡すか)についても記載し ます。
主だった3つのコンポーネントとして、フロントエンド(クライアント側で動くもの)、 postmaster およびバックエンド(サーバ上で動くも の)があります。 postmaster と バックエンドは異なった役割を持っていますが、 同一のバイナリで実装されています。
フロントエンドは開始パケットを postmaster に送ります。開始パケットにはユーザ の 名前とユーザが接続しようとしているデータベースの 名称が含まれています。 postmaster はこのパケットの情報と pg_hba.conf ファイルの内容から、ここでフロントエンドが 更に加えて送さなければならない認証のための情報(もし有れば)を決定して フロントエン ドに要求します。
フロントエンドはそこで要求された認証情報を送り返します。 postmaster が承認した 場合 postmaster は認証完了のサインをフロントエンド に返し、接続をバックエンドに 引き渡します。そこでバックエンドは(通常の場合) 起動成功あるいは失敗(例えば無効な データベース名)の メッセージを返します。
次に引き続く通信はフロントエンドとバックエンド間で交換される問い合わせとその 結果のパケットです。postmaster は通常の問い合わせ と回答の通信には関与しません。 (但し、現在バックエンドで処理中の問い合わせを フロントエンドが取消けそうとす るとき postmaster は 関与します。詳細に付いては下記にあります。)
フロントエンドが接続を解除するとき、特定のパケットを送出しバックエンドの応答 を待つこと無く接続を解除します。
パケットは一連のデータの流れとして送出されます。第一番目のバイトは、それ以降 パケットが何を要求しているかを規定します。例外は フロントエンドから postmaster に送られるパケットで、パケット長と、 パケットのデータそのものから成ります。 この違いは歴史的な事情 によるものです。