The expected protocol flow is as follows:
1. Client connects to the first available server. If the client
is configured to use TLS, a TLS handshake will be attempted.
2. Client sends ClientHello. This is currently optional but
allows the server to detect a non-TLS connection on the TLS
port.
3. Server sends ServerHello.
4. Client responds with either AcceptMessage, RejectMessage, or
RestartMessage.
5. If client sent a AcceptMessage with expect_iobufs set, server
creates a new I/O log and responds with a log_id.
6. Client sends zero or more IoBuffer messages.
7. Server periodically responds to IoBuffer messages with a
commit_point.
8. Client sends an ExitMessage when the command exits or is
killed.
9. Server sends the final commit_point if one is pending.
10. Server closes the connection. After receiving the final
commit_point, the client shuts down its side of the TLS
connection if TLS is in use, and closes the connection.
11. Server shuts down its side of the TLS connection if TLS is in
use, and closes the connection.
At any point, the server may send an error or abort message to the
client at which point the server will close the connection. If an
abort message is received, the client should terminate the running
command.