mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Add description of SSL request protocol. Miscellaneous copy-editing.
This commit is contained in:
		
							parent
							
								
									24451cd47b
								
							
						
					
					
						commit
						e7243dce47
					
				| @ -1,4 +1,4 @@ | |||||||
| <!-- $Header: /cvsroot/pgsql/doc/src/sgml/protocol.sgml,v 1.22 2001/11/21 05:53:41 thomas Exp $ --> | <!-- $Header: /cvsroot/pgsql/doc/src/sgml/protocol.sgml,v 1.23 2001/11/22 01:22:10 tgl Exp $ --> | ||||||
| 
 | 
 | ||||||
| <chapter id="protocol"> | <chapter id="protocol"> | ||||||
|  <title>Frontend/Backend Protocol</title> |  <title>Frontend/Backend Protocol</title> | ||||||
| @ -38,7 +38,7 @@ | |||||||
| 
 | 
 | ||||||
|   <para> |   <para> | ||||||
|    A frontend opens a connection to the server and sends a start-up |    A frontend opens a connection to the server and sends a start-up | ||||||
|    packet.  This includes the names of the user and the database the |    packet.  This includes the names of the user and of the database the | ||||||
|    user wants to connect to.  The server then uses this, and the |    user wants to connect to.  The server then uses this, and the | ||||||
|    information in the <filename>pg_hba.conf</filename> file to |    information in the <filename>pg_hba.conf</filename> file to | ||||||
|    determine what further authentication information it requires the |    determine what further authentication information it requires the | ||||||
| @ -53,19 +53,15 @@ | |||||||
|   </para> |   </para> | ||||||
| 
 | 
 | ||||||
|   <para> |   <para> | ||||||
|    In order to serve multiple clients efficiently, the server would |    In order to serve multiple clients efficiently, the server launches | ||||||
|    normally create a new child process to handle each incoming |    a new <quote>backend</> process for each client.  This is transparent | ||||||
|    connection.  However, this is not required.  In the current |    to the protocol, however.  In the current implementation, a new child | ||||||
|    implementation, a new child process is created immediately after an |    process is created immediately after an incoming connection is detected. | ||||||
|    incoming connection is detected.  In earlier versions of |  | ||||||
|    <productname>PostgreSQL</>  |  | ||||||
|    (7.1 and earlier), the child process was created after sending the |  | ||||||
|    authentication confirmation message. |  | ||||||
|   </para> |   </para> | ||||||
| 
 | 
 | ||||||
|   <para> |   <para> | ||||||
|    When the frontend wishes to disconnect it sends an appropriate packet and |    When the frontend wishes to disconnect it sends an appropriate packet and | ||||||
|    closes the connection without waiting for a response for the backend. |    closes the connection without waiting for a response from the backend. | ||||||
|   </para> |   </para> | ||||||
| 
 | 
 | ||||||
|   <para> |   <para> | ||||||
| @ -319,47 +315,26 @@ | |||||||
|       <Term>CursorResponse</Term> |       <Term>CursorResponse</Term> | ||||||
|       <ListItem> |       <ListItem> | ||||||
|        <Para> |        <Para> | ||||||
|         The query was either an <literal>INSERT</literal>, |         Beginning of the response to a <command>SELECT</command>, | ||||||
|         <literal>UPDATE</literal>, <literal>DELETE</literal>, |         <command>FETCH</command>, <command>INSERT</command>, | ||||||
|         <literal>FETCH</literal>, or a <literal>SELECT</literal> |         <command>UPDATE</command>, or <command>DELETE</command> | ||||||
|         command.  If the transaction has been aborted then the backend |         query.  In the <command>FETCH</command> case the name of the | ||||||
|         sends a CompletedResponse message with a tag of <literal>*ABORT | 	cursor being fetched from is included in the message.  Otherwise | ||||||
|         STATE*</literal>.  Otherwise the following responses are sent. | 	the message always mentions the <quote>blank</> cursor. | ||||||
|        </Para> |        </Para> | ||||||
|  |       </ListItem> | ||||||
|  |      </VarListEntry> | ||||||
| 
 | 
 | ||||||
|  |      <VarListEntry> | ||||||
|  |       <Term>RowDescription</Term> | ||||||
|  |       <ListItem> | ||||||
|        <Para> |        <Para> | ||||||
|         For an <literal>INSERT</literal> command, the backend then |         Indicates that rows are about to be returned in response to | ||||||
|         sends a CompletedResponse message with a tag of | 	a <command>SELECT</command> or <command>FETCH</command> query. | ||||||
|         <literal>INSERT <replaceable>oid</replaceable> | 	The message contents describe the layout of the rows.  This | ||||||
|         <replaceable>rows</replaceable></literal>, where | 	will be followed by an AsciiRow or BinaryRow message (depending on | ||||||
|         <replaceable>rows</replaceable> is the number of rows | 	whether a binary cursor was specified) for each row being returned | ||||||
|         inserted, and <replaceable>oid</replaceable> is the object ID |         to the frontend. | ||||||
|         of the inserted row if <Replaceable>rows</Replaceable> is 1, |  | ||||||
|         otherwise <Replaceable>oid</Replaceable> is 0. |  | ||||||
|        </Para> |  | ||||||
| 
 |  | ||||||
|        <Para> |  | ||||||
|         For a <literal>DELETE</literal> command, the backend then |  | ||||||
|         sends a CompletedResponse message with a tag of <literal>DELETE |  | ||||||
|         <Replaceable>rows</Replaceable></literal> where |  | ||||||
|         <Replaceable>rows</Replaceable> is the number of rows deleted. |  | ||||||
|        </Para> |  | ||||||
| 
 |  | ||||||
|        <Para> |  | ||||||
|         For an <literal>UPDATE</literal> command, the backend then |  | ||||||
|         sends a CompletedResponse message with a tag of <literal>UPDATE |  | ||||||
|         <Replaceable>rows</Replaceable></literal> where |  | ||||||
|         <Replaceable>rows</Replaceable> is the number of rows affected |  | ||||||
|         by the update. |  | ||||||
|        </Para> |  | ||||||
| 
 |  | ||||||
|        <Para> |  | ||||||
|         For a <literal>FETCH</literal> or <literal>SELECT</literal> |  | ||||||
|         command, the backend sends a RowDescription message.  This is |  | ||||||
|         then followed by an AsciiRow or BinaryRow message (depending |  | ||||||
|         on whether a binary cursor was specified) for each row being |  | ||||||
|         returned to the frontend.  Finally, the backend sends a |  | ||||||
|         CompletedResponse message with a tag of <literal>SELECT</literal>. |  | ||||||
|        </Para> |        </Para> | ||||||
|       </ListItem> |       </ListItem> | ||||||
|      </VarListEntry> |      </VarListEntry> | ||||||
| @ -368,8 +343,7 @@ | |||||||
|       <Term>EmptyQueryResponse</Term> |       <Term>EmptyQueryResponse</Term> | ||||||
|       <ListItem> |       <ListItem> | ||||||
|        <Para> |        <Para> | ||||||
|         An empty query string was recognized.  (The need to specially |         An empty query string was recognized. | ||||||
|         distinguish this case is historical.) |  | ||||||
|        </Para> |        </Para> | ||||||
|       </ListItem> |       </ListItem> | ||||||
|      </VarListEntry> |      </VarListEntry> | ||||||
| @ -411,6 +385,41 @@ | |||||||
|     </VariableList> |     </VariableList> | ||||||
|    </Para> |    </Para> | ||||||
| 
 | 
 | ||||||
|  |    <Para> | ||||||
|  |     The response to a <command>SELECT</> or <command>FETCH</> query | ||||||
|  |     normally consists of CursorResponse, RowDescription, zero or more | ||||||
|  |     AsciiRow or BinaryRow messages, and finally CompletedResponse. | ||||||
|  |     <command>INSERT</command>, <command>UPDATE</command>, and | ||||||
|  |     <command>DELETE</command> queries produce CursorResponse followed by | ||||||
|  |     CompletedResponse. | ||||||
|  |     <command>COPY</> to or from the frontend invokes special protocol | ||||||
|  |     as mentioned above. | ||||||
|  |     All other query types normally produce only | ||||||
|  |     a CompletedResponse message. | ||||||
|  |    </Para> | ||||||
|  | 
 | ||||||
|  |    <Para> | ||||||
|  |     Since a query string could contain several queries (separated by | ||||||
|  |     semicolons), there might be several such response sequences before the | ||||||
|  |     backend finishes processing the query string.  ReadyForQuery is issued | ||||||
|  |     when the entire string has been processed and the backend is ready to | ||||||
|  |     accept a new query string. | ||||||
|  |    </Para> | ||||||
|  | 
 | ||||||
|  |    <Para> | ||||||
|  |     If a completely empty (no contents other than whitespace) query string | ||||||
|  |     is received, the response is EmptyQueryResponse followed by ReadyForQuery. | ||||||
|  |     (The need to specially distinguish this case is historical.) | ||||||
|  |    </Para> | ||||||
|  | 
 | ||||||
|  |    <Para> | ||||||
|  |     In the event of an error, ErrorResponse is issued followed by | ||||||
|  |     ReadyForQuery.  All further processing of the query string is aborted by | ||||||
|  |     ErrorResponse (even if more queries remained in it).  Note that this | ||||||
|  |     may occur partway through the sequence of messages generated by an | ||||||
|  |     individual query. | ||||||
|  |    </Para> | ||||||
|  | 
 | ||||||
|    <para> |    <para> | ||||||
|     A frontend must be prepared to accept ErrorResponse and |     A frontend must be prepared to accept ErrorResponse and | ||||||
|     NoticeResponse messages whenever it is expecting any other type of |     NoticeResponse messages whenever it is expecting any other type of | ||||||
| @ -428,10 +437,16 @@ | |||||||
|    </para> |    </para> | ||||||
| 
 | 
 | ||||||
|    <Para> |    <Para> | ||||||
|     Also, if the frontend issues any <literal>LISTEN</literal> |     Also, if the frontend issues any <command>LISTEN</command> | ||||||
|     commands then it must be prepared to accept NotificationResponse |     commands then it must be prepared to accept NotificationResponse | ||||||
|     messages at any time; see below. |     messages at any time; see below. | ||||||
|    </para> |    </para> | ||||||
|  | 
 | ||||||
|  |    <para> | ||||||
|  |     Recommended practice is to code frontends in a state-machine style | ||||||
|  |     that will accept any message type at any time that it could make sense, | ||||||
|  |     rather than wiring in assumptions about the exact sequence of messages. | ||||||
|  |    </para> | ||||||
|   </sect2> |   </sect2> | ||||||
| 
 | 
 | ||||||
|   <Sect2> |   <Sect2> | ||||||
| @ -504,7 +519,7 @@ | |||||||
|    <para> |    <para> | ||||||
|     A frontend must be prepared to accept ErrorResponse and |     A frontend must be prepared to accept ErrorResponse and | ||||||
|     NoticeResponse messages whenever it is expecting any other type of |     NoticeResponse messages whenever it is expecting any other type of | ||||||
|     message.  Also, if it issues any <literal>LISTEN</literal> |     message.  Also, if it issues any <command>LISTEN</command> | ||||||
|     commands then it must be prepared to accept NotificationResponse |     commands then it must be prepared to accept NotificationResponse | ||||||
|     messages at any time; see below. |     messages at any time; see below. | ||||||
|    </para> |    </para> | ||||||
| @ -514,10 +529,10 @@ | |||||||
|    <title>Notification Responses</title> |    <title>Notification Responses</title> | ||||||
| 
 | 
 | ||||||
|    <Para> |    <Para> | ||||||
|     If a frontend issues a <literal>LISTEN</literal> command, then the |     If a frontend issues a <command>LISTEN</command> command, then the | ||||||
|     backend will send a NotificationResponse message (not to be |     backend will send a NotificationResponse message (not to be | ||||||
|     confused with NoticeResponse!)  whenever a |     confused with NoticeResponse!)  whenever a | ||||||
|     <literal>NOTIFY</literal> command is executed for the same |     <command>NOTIFY</command> command is executed for the same | ||||||
|     notification name. |     notification name. | ||||||
|    </para> |    </para> | ||||||
| 
 | 
 | ||||||
| @ -534,8 +549,8 @@ | |||||||
|       <Term>NotificationResponse</Term> |       <Term>NotificationResponse</Term> | ||||||
|       <ListItem> |       <ListItem> | ||||||
|        <Para> |        <Para> | ||||||
|         A <literal>NOTIFY</literal> command has been executed for a |         A <command>NOTIFY</command> command has been executed for a | ||||||
|         name for which a previous <literal>LISTEN</literal> command |         name for which a previous <command>LISTEN</command> command | ||||||
|         was executed.  Notifications may be sent at any time. |         was executed.  Notifications may be sent at any time. | ||||||
|        </Para> |        </Para> | ||||||
|       </ListItem> |       </ListItem> | ||||||
| @ -579,7 +594,7 @@ | |||||||
|     same key data (PID and secret key) passed to the frontend during |     same key data (PID and secret key) passed to the frontend during | ||||||
|     connection start-up.  If the request matches the PID and secret |     connection start-up.  If the request matches the PID and secret | ||||||
|     key for a currently executing backend, the processing of the |     key for a currently executing backend, the processing of the | ||||||
|     current query is aborted.  (In the existing implemenation, this is |     current query is aborted.  (In the existing implementation, this is | ||||||
|     done by sending a special signal to the backend process that is |     done by sending a special signal to the backend process that is | ||||||
|     processing the query.) |     processing the query.) | ||||||
|    </para> |    </para> | ||||||
| @ -633,6 +648,61 @@ | |||||||
|     by recontacting the server if it doesn't want to terminate |     by recontacting the server if it doesn't want to terminate | ||||||
|     itself. |     itself. | ||||||
|    </para> |    </para> | ||||||
|  | 
 | ||||||
|  |    <para> | ||||||
|  |     For either normal or abnormal termination, any open transaction is | ||||||
|  |     rolled back, not committed.  One should note however that if a | ||||||
|  |     frontend disconnects while a query is being processed, the backend | ||||||
|  |     will probably finish the query before noticing the disconnection. | ||||||
|  |     If the query is outside any transaction block (<command>BEGIN</> | ||||||
|  |     ... <command>COMMIT</> sequence) then its results may be committed | ||||||
|  |     before the disconnection is recognized. | ||||||
|  |    </para> | ||||||
|  |   </sect2> | ||||||
|  | 
 | ||||||
|  |   <Sect2> | ||||||
|  |    <Title>SSL Session Encryption</Title> | ||||||
|  | 
 | ||||||
|  |    <Para> | ||||||
|  |     Recent releases of <productname>PostgreSQL</> allow frontend/backend | ||||||
|  |     communication to be encrypted using SSL.  This provides communication | ||||||
|  |     security in environments where attackers might be able to capture the | ||||||
|  |     session traffic. | ||||||
|  |    </para> | ||||||
|  | 
 | ||||||
|  |    <para> | ||||||
|  |     To initiate an SSL-encrypted connection, the frontend initially sends | ||||||
|  |     an SSLRequest message rather than a StartupPacket.  The server then | ||||||
|  |     responds with a single byte containing <literal>Y</> or <literal>N</>, | ||||||
|  |     indicating that it is willing or unwilling to perform SSL, respectively. | ||||||
|  |     The frontend may close the connection at this point if it is dissatisfied | ||||||
|  |     with the response.  To continue after <literal>Y</>, perform an SSL | ||||||
|  |     startup handshake (not described here, part of the SSL specification) | ||||||
|  |     with the server.  If this is successful, continue with | ||||||
|  |     sending the usual StartupPacket.  In this case the StartupPacket and | ||||||
|  |     all subsequent data will be SSL-encrypted.  To continue after | ||||||
|  |     <literal>N</>, send the usual StartupPacket and proceed without | ||||||
|  |     encryption. | ||||||
|  |    </para> | ||||||
|  | 
 | ||||||
|  |    <para> | ||||||
|  |     The frontend should also be prepared to handle an ErrorMessage response | ||||||
|  |     to SSLRequest from the server.  This would only occur if the server | ||||||
|  |     predates the addition of SSL support to <productname>PostgreSQL</>. | ||||||
|  |     In this case the connection must be closed, but the frontend may choose | ||||||
|  |     to open a fresh connection and proceed without requesting SSL. | ||||||
|  |    </para> | ||||||
|  | 
 | ||||||
|  |    <para> | ||||||
|  |     An initial SSLRequest may also be used in a connection that is being | ||||||
|  |     opened to send a CancelRequest message. | ||||||
|  |    </para> | ||||||
|  | 
 | ||||||
|  |    <para> | ||||||
|  |     While the protocol itself does not provide a way for the server to | ||||||
|  |     force SSL encryption, the administrator may configure the server to | ||||||
|  |     reject unencrypted sessions as a byproduct of authentication checking. | ||||||
|  |    </para> | ||||||
|   </sect2> |   </sect2> | ||||||
|  </sect1> |  </sect1> | ||||||
| 
 | 
 | ||||||
| @ -1240,8 +1310,30 @@ CompletedResponse (B) | |||||||
| </Term> | </Term> | ||||||
| <ListItem> | <ListItem> | ||||||
| <Para> | <Para> | ||||||
|                 The command tag.  This is usually (but not always) a single |         The command tag.  This is usually a single | ||||||
|                 word that identifies which SQL command was completed. |         word that identifies which SQL command was completed. | ||||||
|  |        </Para> | ||||||
|  | 
 | ||||||
|  |        <Para> | ||||||
|  |         For an <command>INSERT</command> command, the tag is | ||||||
|  |         <literal>INSERT <replaceable>oid</replaceable> | ||||||
|  |         <replaceable>rows</replaceable></literal>, where | ||||||
|  |         <replaceable>rows</replaceable> is the number of rows | ||||||
|  |         inserted, and <replaceable>oid</replaceable> is the object ID | ||||||
|  |         of the inserted row if <Replaceable>rows</Replaceable> is 1, | ||||||
|  |         otherwise <Replaceable>oid</Replaceable> is 0. | ||||||
|  |        </Para> | ||||||
|  | 
 | ||||||
|  |        <Para> | ||||||
|  |         For a <command>DELETE</command> command, the tag is | ||||||
|  | 	<literal>DELETE <Replaceable>rows</Replaceable></literal> where | ||||||
|  |         <Replaceable>rows</Replaceable> is the number of rows deleted. | ||||||
|  |        </Para> | ||||||
|  | 
 | ||||||
|  |        <Para> | ||||||
|  |         For an <command>UPDATE</command> command, the tag is | ||||||
|  | 	<literal>UPDATE <Replaceable>rows</Replaceable></literal> where | ||||||
|  |         <Replaceable>rows</Replaceable> is the number of rows updated. | ||||||
| </Para> | </Para> | ||||||
| </ListItem> | </ListItem> | ||||||
| </VarListEntry> | </VarListEntry> | ||||||
| @ -1853,6 +1945,44 @@ RowDescription (B) | |||||||
| </Para> | </Para> | ||||||
| </ListItem> | </ListItem> | ||||||
| </VarListEntry> | </VarListEntry> | ||||||
|  | 
 | ||||||
|  | <VarListEntry> | ||||||
|  | <Term> | ||||||
|  | SSLRequest (F) | ||||||
|  | </Term> | ||||||
|  | <ListItem> | ||||||
|  | <Para> | ||||||
|  | 
 | ||||||
|  | <VariableList> | ||||||
|  | <VarListEntry> | ||||||
|  | <Term> | ||||||
|  |         Int32(8) | ||||||
|  | </Term> | ||||||
|  | <ListItem> | ||||||
|  | <Para> | ||||||
|  |                 The size of the packet in bytes. | ||||||
|  | </Para> | ||||||
|  | </ListItem> | ||||||
|  | </VarListEntry> | ||||||
|  | <VarListEntry> | ||||||
|  | <Term> | ||||||
|  |         Int32(80877103) | ||||||
|  | </Term> | ||||||
|  | <ListItem> | ||||||
|  | <Para> | ||||||
|  |                 The SSL request code.  The value is chosen to contain | ||||||
|  |                 <literal>1234</> in the most significant 16 bits, and <literal>5679</> in the | ||||||
|  |                 least 16 significant bits.  (To avoid confusion, this code | ||||||
|  |                 must not be the same as any protocol version number.) | ||||||
|  | </Para> | ||||||
|  | </ListItem> | ||||||
|  | </VarListEntry> | ||||||
|  | </VariableList> | ||||||
|  | 
 | ||||||
|  | </Para> | ||||||
|  | </ListItem> | ||||||
|  | </VarListEntry> | ||||||
|  | 
 | ||||||
| <VarListEntry> | <VarListEntry> | ||||||
| <Term> | <Term> | ||||||
| StartupPacket (F) | StartupPacket (F) | ||||||
| @ -1931,6 +2061,7 @@ StartupPacket (F) | |||||||
| <ListItem> | <ListItem> | ||||||
| <Para> | <Para> | ||||||
|                 The optional tty the backend should use for debugging messages. |                 The optional tty the backend should use for debugging messages. | ||||||
|  | 		(Currently, this field is unsupported and ignored.) | ||||||
| </Para> | </Para> | ||||||
| </ListItem> | </ListItem> | ||||||
| </VarListEntry> | </VarListEntry> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user