PostgreSQL wire protocol
PostgreSQL protocol v3 — бинарный TCP-протокол для общения с PostgreSQL (порт 5432). Не HTTP, не JDBC-магия — простое сообщение-ориентированное поверх TCP.
Startup
Клиент → сервер: StartupMessage {
protocolVersion: 196608 (3.0),
user: "vasya",
database: "shop"
}
# опционально TLS
Клиент → сервер: SSLRequest
Сервер → клиент: 'S' (SSL supported) или 'N'
[TLS handshake]
# аутентификация
Сервер → клиент: AuthenticationSASL / MD5 / cleartext
Клиент → сервер: SASLInitialResponse / PasswordMessage
Сервер → клиент: AuthenticationOk + ParameterStatus + BackendKeyData
Format сообщения
| 1 byte type | 4 byte length | payload |
# пример Query
'Q' | 0x00000018 | "SELECT * FROM users;\0"
Simple Query
C → S: Query "SELECT id, name FROM users;"
S → C: RowDescription { fields: [{name:"id",type:23}, {name:"name",type:25}] }
S → C: DataRow ["1", "Vasya"]
S → C: DataRow ["2", "Petya"]
S → C: CommandComplete "SELECT 2"
S → C: ReadyForQuery 'I' # idle
Extended Query (prepared statements)
C → S: Parse stmt="s1" query="SELECT * FROM users WHERE id=$1"
C → S: Bind portal="p1" stmt="s1" params=[42]
C → S: Describe portal="p1"
C → S: Execute portal="p1"
C → S: Sync
S → C: ParseComplete
S → C: BindComplete
S → C: RowDescription
S → C: DataRow
S → C: CommandComplete
S → C: ReadyForQuery
Плюсы: защита от SQL-injection (значения отдельно от текста), кеш планов на сервере.
COPY protocol
Быстрая массовая загрузка/выгрузка, минует SQL-парсинг:
C: Query "COPY users FROM STDIN"
S: CopyInResponse
C: CopyData "1\tVasya\n"
C: CopyData "2\tPetya\n"
C: CopyDone
Cancel Request
Отдельное соединение с backend-secret → отменить запрос без разрыва основного соединения.
Аутентификация
- trust — без пароля
- md5 — legacy
- scram-sha-256 — современный (default PG 14+)
- cert — mTLS
- peer — Unix socket по OS-пользователю
- gss/sspi — Kerberos
Реализации не-Postgres
Совместимость на уровне протокола = обычные psql-клиенты подключаются:
- CockroachDB — distributed SQL
- YugabyteDB
- Amazon Aurora Postgres
- PgBouncer — connection pooler
- Materialize, QuestDB