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