Protocolo Frontend/Backend

Nota

Escrito por Phil Thompson. Actualizaciones del protocolo por Tom Lane.

Postgres utiliza un protocolo basado en mensajes para la comunicación entre frontend y backends. El protocolo está implementado sobre TCP/IP y también sobre Unix sockets. Postgres v6.3 introdució números de versión en el protocolo. Esto fue hecho de tal forma que aún permite conexiones desde versiones anteriores de los frontends, pero este documento no cubre el protocolo utilizado por esas versiones.

Este documento describe la versión 2.0 del protocolo, implementada en Postgres v6.4 y posteriores.

Las características de alto nivel sobre este protocolo (por ejemplo, como libpq pasa ciertas variables de entorno despues de que la comunicación es establecida), son tratadas en otros lugares.

Introducción

Los tres principales componentes son el frontend (ejecutandose en el clicente) y el postmaster y backend (ejecutandose en el servidor). El postmaster y backend juegan diferentes roles pero pueden ser implementados por el mismo ejecutable.

Un frontend envía un paquete de inicio al postmaster. Este incluye los nombres del usuario y base de datos a la que el usuario quiere conectarse. El postmaster entonces utiliza esto, y la información en el fichero pg_hba.conf(5) para determinar que información adicional de autentificación necesita del frontend (si existe) y responde al frontend en concordancia.

El frontend envía entonces cualquier información de autentificación requerida. Una vez que el postmaster valida esta información responde al frontend que está autentificado y entrega una conexión a un backend. El backend entonces envía un mensaje indicando arranque correcto (caso normal) o fallo (por ejemplo, un nombre de base de datos inválido).

Las subsiguientes comunicaciones son paquetes de consulta y resultados intercambiados entre el frontend y backend. El postmaster no interviene ya en la comunicación ordinaria de cosultas/resultados. Sin embargo el postmaster se involucra cuando el frontend desea cancelar una consulta que se esté efectuando en su backend. Más detalles sobre esto aparecen más abajo.

Cuando el frontend desea desconectar envía un paquete apropiado y cierra la conexión sin esperar una respuesta del backend.

Los paquetes son enviados como un flujo de datos. El primer byte determina que se debería esperar en el resto del paquete. La excepción son los paquetes enviados desde un frontend al postmaster, los cuales incluyen la longitud del paquete y el resto de él. Esta diferencia es histórica.