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.

A frontend sends a startup packet to the postmaster. This
includes the names of the user and the database the user wants to
connect to. The postmaster then uses this, and the information in
the pg_hba.conf(5) file to determine what further authentication
information it requires the frontend to send (if any) and responds
to the frontend accordingly.

The frontend then sends any required authentication information.
Once the postmaster validates this it responds to the frontend that
it is authenticated and hands over to a backend.

Subsequent communications are query and result packets exchanged
between the frontend and the backend. The postmaster takes no
further part in the communication.

When the frontend wishes to disconnect it sends an appropriate
packet and closes the connection without waiting for a response for
the backend.

Packets are sent as a data stream. The first byte determines
what should be expected in the rest of the packet. The exception is
packets send from a frontend to the postmaster, which comprise a
packet length then the packet itself. The difference is
historical.