ZEO Network Protocol (sans authentication)
==========================================

This document describes the ZEO network protocol.  It assumes that the
optional authentication protocol isn't used.  At the lowest
level, the protocol consists of sized messages.  All communication
between the client and server consists of sized messages.  A sized
message consists of a 4-byte unsigned big-endian content length,
followed by the content.  There are two subprotocols, for protocol
negotiation, and for normal operation.  The normal operation protocol
is a basic RPC protocol.

In the protocol negotiation phase, the server sends a protocol
identifier to the client.  The client chooses a protocol to use to the
server. The client or the server can fail if it doesn't like the
protocol string sent by the other party.  After sending their protocol
strings, the client and server switch to RPC mode.

The RPC protocol uses messages that are pickled tuples consisting of:

message_id
   The message id is used to match replies with requests, allowing
   multiple outstanding synchronous requests.

async_flag
   An integer 0 for a regular (2-way) request and 1 for a one-way
   request. Two-way requests have a reply.  One way requests don't.
   ZRS tries to use as many one-way requests as possible to avoid
   network round trips.

name
   The name of a method to call. If this is the special string
   ".reply", then the message is interpreted as a return from a
   synchronous call.

args
   A tuple of positional arguments or returned values.

After making a connection and negotiating the protocol, the following
interactions occur:

- The client requests the authentication protocol by calling
  getAuthProtocol.  For this discussion, we'll assume the server
  returns None. Note that if the server doesn't require
  authentication, this step is optional.

- The client calls register passing a storage identifier and a
  read-only flag.  The server doesn't return a value, but it may raise
  an exception either if the storage doesn't exist, or if the
  storage is readonly and the read-only flag passed by the client is
  false.

At this point, the client and server send each other messages as
needed.  The client may make regular or one-way calls to the
server. The server sends replies and one-way calls to the client.
