update changelog
[debian/iodine.git] / doc / proto_00000500.txt
1 Detailed specification of protocol in version 00000500
2 ======================================================
3
4 CMC = 2 byte Cache Miss Counter, increased every time it is used
5
6 Version:
7 Client sends:
8         First byte v or V
9         Rest encoded with base32:
10         4 bytes big endian protocol version
11         CMC
12 Server replies:
13         4 chars:
14                 VACK (version ok), followed by login challenge
15                 VNAK (version differs), followed by server protocol version
16                 VFUL (server has no free slots), followed by max users
17         4 byte value: means login challenge/server protocol version/max users
18         1 byte userid of the new user, or any byte if not VACK
19         
20 Login:
21 Client sends:
22         First byte l or L
23         Rest encoded with base32:
24         1 byte userid
25         16 bytes MD5 hash of: (first 32 bytes of password) xor (8 repetitions of login challenge)
26         CMC
27 Server replies:
28         LNAK means not accepted
29         x.x.x.x-y.y.y.y-mtu-netmask means accepted (server ip, client ip, mtu, netmask bits)
30
31 Case check:
32 Client sends: 
33         First byte z or Z
34         Lots of data that should not be decoded
35 Server replies:
36         The requested domain copied raw
37
38 Switch codec:
39 Client sends:
40         First byte s or S
41         5 bits coded as Base32 char, meaning userid
42         5 bits coded as Base32 char, with value 5 or 6, representing number of raw
43         bits per encoded byte
44 Server sends:
45         Name of codec if accepted. After this all upstream data packets must 
46         be encoded with the new codec.
47         BADCODEC if not accepted. Client must then revert to Base32
48
49 Probe downstream fragment size:
50 Client sends:
51         First byte r or R
52         15 bits coded as 3 Base32 chars: UUUUF FFFFF FFFFF
53                 meaning 4 bits userid, 11 bits fragment size
54         Then follows a long random query which contents does not matter
55 Server sends:
56         Requested number of bytes as a response. The first two bytes contains
57         the requested length. Rest of message can be any data.
58         BADFRAG if requested length not accepted.
59
60 Set downstream fragment size:
61 Client sends:
62         First byte n or N
63         Rest encoded with base32:
64         1 byte userid
65         2 bytes new downstream fragment size
66         CMC
67 Server sends:
68         2 bytes new downstream fragment size. After this all downstream
69         payloads will be max (fragsize + 2) bytes long.
70         BADFRAG if not accepted.
71
72 Data:
73 Upstream data header:
74          3210 432 10 43 210 4321 0
75         +----+---+--+--+---+----+-+
76         |UUUU|SSS|FF|FF|DDD|GGGG|L|
77         +----+---+--+--+---+----+-+
78
79 Downstream data header:
80          7 654 3210 765 4321 0
81         +-+---+----+---+----+-+
82         |C|SSS|FFFF|DDD|GGGG|L|
83         +-+---+----+---+----+-+
84
85 UUUU = Userid
86 L = Last fragment in packet flag
87 SS = Upstream packet sequence number
88 FFFF = Upstream fragment number
89 DDD = Downstream packet sequence number
90 GGGG = Downstream fragment number
91 C = Compression enabled for downstream packet
92
93 Upstream data packet starts with 1 byte ASCII hex coded user byte, then 3 bytes 
94 Base32 encoded header, then comes the payload data, encoded with chosen codec.
95
96 Downstream data starts with 2 byte header. Then payload data, which may be
97 compressed.
98
99 Ping:
100 Client sends:
101         First byte p or P
102         Rest encoded with Base32:
103         1 byte with 4 bits userid
104         1 byte with:
105                 3 bits downstream seqno
106                 4 bits downstream fragment
107         CMC
108
109 The server response to Ping and Data packets is a DNS NULL type response:
110 If server has nothing to send, data length is 0 bytes.
111 If server has something to send, it will send a downstream data packet, 
112 prefixed with 2 bytes header as shown above.