xlReg Cluster Registry
As the term is used here, an xLattice registry is a protocol for communicating between parties in a traditional server/client relationship. On the one hand we have independent xLattice nodes which may cooperate as an xLattice cluster, a collection of peers that communicate with one another over links dedicated to this purpose. On the other hand we have a single xlReg server which is identified by its NodeID (a 20- or 32-byte value). The server has a well-known address, a tcp/ip port in an address region (an overlay ), accessible to the nodes wishing to form the cluster. The xlReg server also has two well-known RSA public keys, one (ck) for use in encrypting data and the other (sk) for use in creating digital signatures.
Clients join a cluster by sending a Hello
message to the server to agree
on communications and then send an encrypted Join
message with their
details.
The Hello
is encrypted using the server's RSA public key. It contains a
salt (salt1
), a requested version number, and an AES IV and key (keyIV
)
used only to encrypt the reply, the HelloReply
. This iv+key is created by
the client and used once and once only by the server.
The HelloReply
contains the original salt, another salt (salt2
), the
protocol version to be used, and the AES IV and key (keyIV2
) used for
the rest of the session. By deciphering the first salt, the server has
proved its identity - that is, it has proved that it has the secret RSA
key corresponding to the public key. If the Hello
is in some way ill-formed,
the server will silently close the connection. The client will do the same
if the HelloReply
is not properly encrypted using keyIV
or does not contain
the correct value for the salt. From this point keyIV2
is used by both sides
to encrypt session traffic.
The version number is currently ignored. The expectation is that
at some point the version number in the Hello
will be that requested by
the client and the version number in the reply will be that actually used
by the server.
In the next step the client sends a Client message with either a proposed
clientName and a token or a clientID and salt2 from the HelloReply
. In the
first case the token will contain, among other things, a proposed
Attrs bit string. In either case the message is signed using the
client's public key for signatures. The server replies with a ClientOK
message or an error message. The ClientOK
contains a possibly
uniquified clientName, the actual clientID, and a possibly modified Attrs
bit string, the value that the server will use from this point forward.
At this point the client can send either a Create
message, a Join
, a
Get
, or a Bye
.
The Create
message contains a cluster name and client-proposed size.
The server returns a Create
reply which contains the cluster ID, its
possibly uniquified name, and its actual size. If the cluster did
not previously exist, this message will create it with the size proposed,
but constrained to be in the range 2 .. 64 inclusive. If the cluster
already exists, the proposed size is ignored.
A Create
can be used simply to get the clusterID
and size of an existing
cluster.
The cluster size is the maximum number of clients that will be allowed to join the cluster. It does not change as members join.
The Join
message contains a clusterName or ID. The server returns
either clusterID
and size or an error message.
A Get
message may contain a clusterID
or a Which
field, which indicates
which member descriptions (tokens) are requested. The server will
return either an error message or a Members
message containing a
clusterID
, a Which
field identifying the members whose information
follows, and a list (an array) of member tokens.
If the clusterID
is not present, the server will assume the ID associated
with any previous Create
or Join
.
If the Which
field is present, the server will return tokens for the Nth
member wherever bit N
is set in Which
. If Which
is absent, the server
will act as though all possible Which
bits are set. In any case, the
server will return a token wherever the corresponding member has been
defined, and then will return a Which
value indicating which tokens are
present.
The first token in the Members
message will correspond to the lowest bit
set, any second bit to the second lowest bit, and so forth. If no one
has joined the cluster or none of the selected members is as yet defined,
the Which
field will be zero.
Clients can make any number of Get
requests. The normal behavior will
be to poll until the client has tokens for all cluster members.
Alternatively the client can close the connection and return later.
The client ends a session by sending Bye
to the server. The server
replies with an Ack
and closes the connection.
Error messages from the server contain a string describing the problem. The server will send the message and then close the connection without waiting for a reply.
Look here for a more detailed description of the xlReg protocol.