Detailed specification of protocol in version 00000403 ====================================================== CMC = 2 byte Cache Miss Counter, increased every time it is used Version: Client sends: First byte v or V Rest encoded with base32: 4 bytes big endian protocol version CMC Server replies: 4 chars: VACK (version ok), followed by login challenge VNAK (version differs), followed by server protocol version VFUL (server has no free slots), followed by max users 4 byte value: means login challenge/server protocol version/max users 1 byte userid of the new user, or any byte if not VACK Login: Client sends: First byte l or L Rest encoded with base32: 1 byte userid 16 bytes MD5 hash of: (first 32 bytes of password) xor (8 repetitions of login challenge) CMC Server replies: LNAK means not accepted x.x.x.x-y.y.y.y-mtu means accepted (server ip, client ip, mtu) Case check: Client sends: First byte z or Z Lots of data that should not be decoded Server replies: The requested domain copied raw Switch codec: Client sends: First byte s or S One byte ASCII digit, meaning userid One byte ASCII digit, with value 5 or 6, representing number of raw bits per encoded byte Server sends: Name of codec if accepted. After this all upstream data packets must be encoded with the new codec. BADCODEC if not accepted. Client must then revert to Base32 Data: Upstream data header (encoded as 4 bytes Base32): 4321 0 432 10 43 210 4321 0 +----+-+---+--+--+---+----+-+ |UUUU|L|SSS|FF|FF|DDD|GGGG|C| +----+-+---+--+--+---+----+-+ Downstream data header: 7 654 3210 765 4321 0 +-+---+----+---+----+-+ |L|SSS|FFFF|DDD|GGGG|C| +-+---+----+---+----+-+ UUUU = Userid L = Last fragment in packet flag SSS = Upstream packet sequence number FFFF = Upstream fragment number DDD = Downstream packet sequence number GGGG = Downstream fragment number C = Compression enabled for this packet Upstream data packet starts with 4 bytes Base32 encoded header, then comes the payload data, encoded with chosen codec. Downstream data starts with 2 byte header. Then payload data, which may be compressed. Ping: Client sends: First byte p or P Rest encoded with Base32: 1 byte userid CMC The server response to Ping and Data packets is a DNS NULL type response: If server has nothing to send, data length is 0 bytes. If server has something to send, it will send a downstream data packet, prefixed with 2 bytes header as shown above.