pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
目录
由 Phil Thompson(phil@river-bank.demon.co.uk)编写。协议 2.0 的更新由 Tom Lane(tgl@sss.pgh.pa.us)完成。
Postgres 使用基于消息的前端与后端之间的通信协议。该协议在 TCP/IP 以及 Unix 套接字之上实现。Postgres 6.3 在协议中引入了版本号。这样做的目的是仍然允许来自早期版本前端的连接,但本文档不涵盖那些早期版本使用的协议。
本文档描述该协议的 2.0 版,它在 Postgres 6.4 及更高版本中实现。
建立在此协议之上的更高层特性(例如 libpq 在连接建立后如何传递某些环境变量)在别处介绍。
三个主要组件是前端(运行在客户端上)以及 postmaster 和后端(运行在服务器上)。postmaster 和后端有不同的角色,但可以由同一个可执行程序实现。
前端向 postmaster 发送一个启动包。其中包括用户要连接的用户名和数据库名。然后 postmaster 使用这些信息以及 pg_hba.conf 文件中的信息来确定它要求前端进一步发送什么认证信息(如果有的话),并相应地响应前端。
然后前端发送任何所需的认证信息。postmaster 验证这些信息后,响应前端已通过认证,并把连接移交给一个后端。然后后端发送一条消息指示启动成功(正常情况)或失败(例如数据库名无效)。
随后的通信是前端与后端之间交换的查询和结果包。postmaster 不再参与普通的查询/结果通信。 (However, the postmaster is involved when the frontend wishes to cancel a query currently being executed by its backend. Further details about that appear below.)
当前端希望断开连接时,它发送一个适当的包并关闭连接,而不等待后端的响应。
包以数据流的形式发送。第一个字节决定包的其余部分应期待什么。例外是前端发送给 postmaster 的包,它们由包长度后跟包本身组成。这一差异是历史原因造成的。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。