当前位置: 首页 > Database, postgresql > 正文

postgresql 会话启动过程

要开始一个会话,前端打开一个与服务器的连接并且发送一个启动消息。 这个消息包括用户名以及用户希望与之连接的数据库; 它还标识要使用的特定的协议版本。(另外,启动信息可以包括用于运行时参数的额外设置。) 服务器然后就使用这些信息以及它的配置文件的内容 (比如 pg_hba.conf)以判断这个连接是否可以接受,以及需要什么样的额外的认证(如果需要)。

然后服务器就发送合适的认证请求信息,前端必须用合适的认证响应信息来响应(比如一个口令)。 理论上讲,这样的认证请求/响应循环可能需要多次迭代,但是目前的认证方法都不需要超过一次的请求和响应。 有些方法则根本不需要前端的响应,因此就没有认证请求发生。

认证周期的结束要么是以服务器的拒绝连接(ErrorResponse), 要么是以 AuthenticationOK 结束的。

这个阶段来自服务器可能消息是:

ErrorResponse

    连接请求被拒绝。 然后服务器马上关闭联接。

AuthenticationOk

    认证交换成功完成.

AuthenticationKerberosV5

    现在前端必须与服务器进行一次 Kerberos V5 认证对话(在这里没有描述,Kerberos 
    规范的一部分)。如果对话成功,服务器响应一个 AuthenticationOk (认证成功)信息, 
    否则它响应一个 ErrorResponse

AuthenticationCleartextPassword

    现在前端必须明文形式发送一个包含口令的 PasswordMessage (未加密口令)包。 
    如果这是正确的口令,服务器用一个 AuthenticationOk 包响应,否则它响应一个 
    ErrorResponse 包。

AuthenticationCryptPassword

    现在前端必须发送一个 PasswordMessage 包,该包包含用 crypt(3) 加密的口令,
    加密时使用了在 AuthenticationCryptPassword 消息里声明的 2 字节盐粒。
    如果这是正确口令,服务器用一个AuthenticationOk 响应,否则它用一个 
    ErrorResponse 响应。

AuthenticationMD5Password

    现在前端必须发送一个包含用 MD5 加密的口令的 PasswordMessage, 加密时使用了在 
    AuthenticationMD5Password 消息里声明的 4 字符盐粒。 如果这是正确口令,
    服务器用一个 AuthenticationOk 响应,否则它用一个 ErrorResponse 响应。

AuthenticationSCMCredential

    这个响应只对那些支持 SCM 信任消息的本地 Unix 域连接出现。 前端必须发出一条 SCM 
    信任消息然后发送一个数据字节。(数据字节的内容并不会被注意; 它的作用只是确保服务
    器等待了足够长的时间来接受信任信息。)如果信任是可以接受的,那么服务器用 AuthenticationOk 
    响应,否则用 ErrorResponse 响应。 

如果前端不支持服务器要求的认证方式,那么它应该马上关闭联接。

在收到 AuthenticationOk 包之后, 前端必须等待来自后端的更多消息。在这个阶段会启动一个后端进程, 而前端只是一个感兴趣的看热闹的。启动尝试仍然有可能失败(ErrorResponse), 但是通常情况下,后端将发送一些 ParameterStatus 消息,BackendKeyData, 以及最后 ReadyForQuery。

在这个阶段,后端将尝试应用任何在启动消息里给出额外的运行时参数设置。 如果成功,这些值将成为会话缺省。错误将导致 ErrorResponse 并退出。

这个阶段来自后端的可能消息是:

BackendKeyData

    这个消息提供了密钥(secret-key)数据, 前端如果想要在稍后发出取消的请求,则必须保
    存这个数据。前端不应该响应这个信息, 但是应该继续侦听等待 ReadyForQuery 消息。

ParameterStatus

    这个消息告诉前端有关后端参数的当前(初始化)设置,比如 client_encoding 
    或者 DateStyle 等。前端可以忽略这些信息,或者记录其设置用于将来使用; 
    参阅 Section 43.2.6 获取更多细节。前端不应该响应这些信息,而是应该继续
    侦听 ReadyForQuery 消息。

ReadyForQuery

    后端启动成功,前端现在可以发出命令.

ErrorResponse

    后端启动失败.在发送完这个消息之后联接被关闭.

NoticeResponse

    发出了一个警告信息。前端应该显示这个信息, 并且继续等待 ReadyForQuery 
    或 ErrorResponse。

后端在每个查询循环后都会发出一个相同的 ReadyForQuery 消息。 前端可以合理地认为 ReadyForQuery 是一个查询循环的开始 (而 BackendKeyData 表明启动阶段的成功完成), 或者认为 ReadyForQuery 是启动阶段和每个随后查询循环的结束, 具体是那种情况取决于前端的编码需要。

    分享到:

本文固定链接: http://klwang.info/postgresql-session-start/ | 数据库|Linux|软件开发

该日志由 klwang 于2014年01月03日发表在 Database, postgresql 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: postgresql 会话启动过程 | 数据库|Linux|软件开发
关键字: ,

postgresql 会话启动过程:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter