注意: 由 Phil Thompson(<[email protected]>)写作. 协议 2.0 的更新由 Tom Lane(<[email protected]>) 写作.
Postgres 使用一种基于消息的协议用于前端和后端之间通讯. 该协议是在 TCP/IP 和 Unix 套接字上实现的. Postgres v6.3 往协议里面引入了版本号. 这么做的同时仍然允许早期的前端与新的后端进行联接, 但是本文档没有介绍那些早期版本的协议.
这份文档描述了版本 2.0 的协议,在 Postgres v6.4 和以后的版本中实现.
在这个协议的基础上建立的更高级特性(例如,libpq 是如何在建立联接以后传递某种环境变量的)在其他地方描述.
三个主要的部分是前端(在客户端运行)postmaster 和后端(在服务器端运行). postmaster 和后端有着不同的角色但是可以用同样的可执行文件实现.
一个前端向 postmaster 发送一个启动包.包里面包括用户名和该用户希望联接的数据库.postmaster 则使用这些信息和 pg_hba.conf 文件里的信息决定她还需要前端发送什么样的进一步认证信息(如果需要的话) 并且把这些回应给相应的前端.
该前端则发送任何所要求的认证信息.一旦 postmaster 认为有效,那么它回应给前端并且把联接转交给一个后端. 该后端则发送信息给前端表明启动成功(正常状态)或失败(例如,非法数据库名).
随后的通讯是在前端和后端之间交换的查询和结果包. postmaster 不再参与正常的查询/结果通讯. (不过,当前端希望取消目前在其后端上执行的查询时, postmaster 也要参与.详情见下文.)
当前端希望断开联接时, 它给后端发送一个合适的包并且在不等待后端回应的情况下关闭联接.
包是当做数据流发送的.包的第一个字节决定了包的其余部分的类型. 例外是从前端发送给 postmaster 的包,是由 包长和包本身组成.这种区别是历史原因造成的.