PostgreSQL7.0手册-开发者手册 -64. 前端/后端协议
第六十四章. 前端/后端协议
内容
概述
协议
消息数据类型
消息格式
注意:由 Phil Thompson 写作.协议 2.0 的更新由 Tom Lane 写作.
Postgres 使用一种以消息为基础的协议用于在前端和后端之间通讯.该协议是在 TCP/IP 和 Unix 套接字上实现的.Postgres v6.3 往协议里面引入了版本号.这么做的同时仍然允许早期的前端与新的后端进行联接,但是本文档没有介绍那些早期版本的协议.
这份文档描述了版本 2.0 的协议,在 Postgres v6.4 和以后的版本中实现.
在这个协议的基础上建立的更高级特性(例如,libpq 是如何在建立联接以后传递某种环境变量的)在其他地方描述.
概述
The three major components are the frontend (running on the client) and the postmaster and backend (running on the server). The postmaster and backend have different roles but may be implemented by the same executable.
三个主要的部分是前端(在客户端运行)postmaster 和后端(在服务器端运行).postmaster 和后端有着不同的角色但是可以用同样的可执行文件实现.
一个前端向 postmaster 发送一个启动包.包里面包括用户名和该用户希望联接的数据库.postmaster 则使用这些信息和 pg_hba.conf(5) 文件里的信息决定她还需要前端发送什么样的进一步认证信息(如果需要的话)并且把这些回应给相应的前端.
该前端则发送任何所要求的认证信息.一旦 postmaster 认为有效,那么它回应给前端并且把联接转交给一个后端.该后端则发送信息给前端表明启动成功(正常状态)或失败(例如,非法数据库名).
随后的通讯是在前端和后端之间交换的查询和结果包.postmaster 不再参与正常的查询/结果通讯.(不过,当前端希望取消目前在其后端上执行的查询时,postmaster 也要参与.详细信息见下文.)
当前端希望断开联接时,它给后端发送一个合适的包并且在不等待后端回应的情况下关闭联接.
包是当做数据流发送的.包的第一个字节决定了包的其余部分的类型.例外是从前端发送给 postmaster 的包,是由包长和包本身组成.这种区别是历史原因造成的.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
协议
本节描述信息流.根据联接的状态不同有四种类型的流:启动(startup),查询(query),函数调用(function call)和结束(termination).还有用于通知响应和命令取消的特殊信息,这些特殊信息可能在启动阶段过后的任何时间发生.
启动
启动分成认证阶段和后端启动阶段.
开始时,前端发送一个 StartupPacket (启动包).postmaster 利用这个信息和 pg_hba.conf(5) 文件的内容决定这个前端必须使用那种认证方式.然后 postmaster 用下面信息之一响应:
ErrorResponse
然后 postmaster 马上关闭联接.
AuthenticationOk
然后 postmaster 转交给后端.postmaster 不再参与以后的通讯.
AuthenticationKerberosV4
然后前端必须与 postmaster 进行一次 Kerberos V4 认证对话(在这里没有描述).如果对话成功,postmaster 响应一个 AuthenticationOk (认证成功)信息,否则它响应一个 ErrorResponse (错误响应).
AuthenticationKerberosV5
然后前端必须与 postmaster 进行一次 Kerberos V5 认证对话(在这里没有描述).如果对话成功,postmaster 响应一个 AuthenticationOk (认证成功)信息,否则它响应一个 ErrorResponse (错误响应).
AuthenticationUnencryptedPassword
然后前端必须发送一个 UnencryptedPasswordPacket (未加密口令)包.如果这是正确的口令,postmaster 用一个 AuthenticationOk 包响应,否则它响应一个 ErrorResponse 包.
AuthenticationEncryptedPassword
然后前端必须发送一个 EncryptedPasswordPacket (加密口令)包.如果这是正确口令,postmaster 用一个AuthenticationOk 响应,否则它用一个 ErrorResponse 响应.
如果前端不支持 postmaster 要求的认证方式,那么它应该马上关闭联接.
在发送完 AuthenticationOk 包之后,postmaster 试图运行一个后端进程.因为这个过程可能失败,或者后端可能在启动过程中失败,前端必须等待后端确认成功启动.这时前端不应该发送任何信息.在这个阶段从后端来的信息可能是:
BackendKeyData
这个消息是在后端成功启动后才发出的.这个消息提供了密钥(secret-key)数据,前端如果想要在稍后发出取消的请求,则必须保存这个数据.前端不应该响应这个信息,但是应该继续侦听等待 ReadyForQuery 消息.
ReadyForQuery
后端启动成功,前端现在可以发出查询或者函数调用消息.
ErrorResponse
后端启动失败.在发送完这个消息之后联接被关闭.
NoticeResponse
发出了一个警告信息.前端应该显示这个信息,并且继续等待 ReadyForQuery 或 ErrorResponse.
后端在每个查询循环后都会发出一个相同的 ReadyForQuery 消息.前端可以认为 ReadyForQuery 是一个查询循环的开始(而 BackendKeyData 表明启动阶段的成功完成),或者认为 ReadyForQuery 是启动阶段和每个随后查询循环的结束,这些取决于前端的编码需要.
查询
一个查询循环是由前端发送一条 Query 消息给后端初始化的.后端根据查询命令字串的内容发送一条或者更多条响应消息给前端,并且最后是一条 ReadyForQuery 响应信息.ReadyForQuery 通知前端它可以安全地发送新查询或者函数调用给后端了.
从后端来的可能的消息是:
CompletedResponse
一个正常结束的 SQL 命令.
CopyInResponse
后端已经准备好从前端拷贝数据到一个关系里面去.然后前端应该发送一条 CopyDataRows 消息.然后后端用一个带有标记 "COPY" 的 CompletedResponse 消息响应.
CopyOutResponse
后端已经准备好从一个关系拷贝数据到前端里面去.然后它会发送一条 CopyDataRows 消息.最后后端发送一个带有标记
内容
概述
协议
消息数据类型
消息格式
注意:由 Phil Thompson 写作.协议 2.0 的更新由 Tom Lane 写作.
Postgres 使用一种以消息为基础的协议用于在前端和后端之间通讯.该协议是在 TCP/IP 和 Unix 套接字上实现的.Postgres v6.3 往协议里面引入了版本号.这么做的同时仍然允许早期的前端与新的后端进行联接,但是本文档没有介绍那些早期版本的协议.
这份文档描述了版本 2.0 的协议,在 Postgres v6.4 和以后的版本中实现.
在这个协议的基础上建立的更高级特性(例如,libpq 是如何在建立联接以后传递某种环境变量的)在其他地方描述.
概述
The three major components are the frontend (running on the client) and the postmaster and backend (running on the server). The postmaster and backend have different roles but may be implemented by the same executable.
三个主要的部分是前端(在客户端运行)postmaster 和后端(在服务器端运行).postmaster 和后端有着不同的角色但是可以用同样的可执行文件实现.
一个前端向 postmaster 发送一个启动包.包里面包括用户名和该用户希望联接的数据库.postmaster 则使用这些信息和 pg_hba.conf(5) 文件里的信息决定她还需要前端发送什么样的进一步认证信息(如果需要的话)并且把这些回应给相应的前端.
该前端则发送任何所要求的认证信息.一旦 postmaster 认为有效,那么它回应给前端并且把联接转交给一个后端.该后端则发送信息给前端表明启动成功(正常状态)或失败(例如,非法数据库名).
随后的通讯是在前端和后端之间交换的查询和结果包.postmaster 不再参与正常的查询/结果通讯.(不过,当前端希望取消目前在其后端上执行的查询时,postmaster 也要参与.详细信息见下文.)
当前端希望断开联接时,它给后端发送一个合适的包并且在不等待后端回应的情况下关闭联接.
包是当做数据流发送的.包的第一个字节决定了包的其余部分的类型.例外是从前端发送给 postmaster 的包,是由包长和包本身组成.这种区别是历史原因造成的.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
协议
本节描述信息流.根据联接的状态不同有四种类型的流:启动(startup),查询(query),函数调用(function call)和结束(termination).还有用于通知响应和命令取消的特殊信息,这些特殊信息可能在启动阶段过后的任何时间发生.
启动
启动分成认证阶段和后端启动阶段.
开始时,前端发送一个 StartupPacket (启动包).postmaster 利用这个信息和 pg_hba.conf(5) 文件的内容决定这个前端必须使用那种认证方式.然后 postmaster 用下面信息之一响应:
ErrorResponse
然后 postmaster 马上关闭联接.
AuthenticationOk
然后 postmaster 转交给后端.postmaster 不再参与以后的通讯.
AuthenticationKerberosV4
然后前端必须与 postmaster 进行一次 Kerberos V4 认证对话(在这里没有描述).如果对话成功,postmaster 响应一个 AuthenticationOk (认证成功)信息,否则它响应一个 ErrorResponse (错误响应).
AuthenticationKerberosV5
然后前端必须与 postmaster 进行一次 Kerberos V5 认证对话(在这里没有描述).如果对话成功,postmaster 响应一个 AuthenticationOk (认证成功)信息,否则它响应一个 ErrorResponse (错误响应).
AuthenticationUnencryptedPassword
然后前端必须发送一个 UnencryptedPasswordPacket (未加密口令)包.如果这是正确的口令,postmaster 用一个 AuthenticationOk 包响应,否则它响应一个 ErrorResponse 包.
AuthenticationEncryptedPassword
然后前端必须发送一个 EncryptedPasswordPacket (加密口令)包.如果这是正确口令,postmaster 用一个AuthenticationOk 响应,否则它用一个 ErrorResponse 响应.
如果前端不支持 postmaster 要求的认证方式,那么它应该马上关闭联接.
在发送完 AuthenticationOk 包之后,postmaster 试图运行一个后端进程.因为这个过程可能失败,或者后端可能在启动过程中失败,前端必须等待后端确认成功启动.这时前端不应该发送任何信息.在这个阶段从后端来的信息可能是:
BackendKeyData
这个消息是在后端成功启动后才发出的.这个消息提供了密钥(secret-key)数据,前端如果想要在稍后发出取消的请求,则必须保存这个数据.前端不应该响应这个信息,但是应该继续侦听等待 ReadyForQuery 消息.
ReadyForQuery
后端启动成功,前端现在可以发出查询或者函数调用消息.
ErrorResponse
后端启动失败.在发送完这个消息之后联接被关闭.
NoticeResponse
发出了一个警告信息.前端应该显示这个信息,并且继续等待 ReadyForQuery 或 ErrorResponse.
后端在每个查询循环后都会发出一个相同的 ReadyForQuery 消息.前端可以认为 ReadyForQuery 是一个查询循环的开始(而 BackendKeyData 表明启动阶段的成功完成),或者认为 ReadyForQuery 是启动阶段和每个随后查询循环的结束,这些取决于前端的编码需要.
查询
一个查询循环是由前端发送一条 Query 消息给后端初始化的.后端根据查询命令字串的内容发送一条或者更多条响应消息给前端,并且最后是一条 ReadyForQuery 响应信息.ReadyForQuery 通知前端它可以安全地发送新查询或者函数调用给后端了.
从后端来的可能的消息是:
CompletedResponse
一个正常结束的 SQL 命令.
CopyInResponse
后端已经准备好从前端拷贝数据到一个关系里面去.然后前端应该发送一条 CopyDataRows 消息.然后后端用一个带有标记 "COPY" 的 CompletedResponse 消息响应.
CopyOutResponse
后端已经准备好从一个关系拷贝数据到前端里面去.然后它会发送一条 CopyDataRows 消息.最后后端发送一个带有标记
Tags:PostgreSQL,手册,开发者,手册,前端,后端,协议

