mirror of
https://github.com/yarrick/iodine.git
synced 2024-11-21 23:59:19 +02:00
New protocol spec
This commit is contained in:
parent
ae942ac542
commit
6f19de9ac4
|
@ -0,0 +1,98 @@
|
||||||
|
Detailed specification of protocol in version 00000403
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
This protocol varies a lot from earlier ones and will
|
||||||
|
hopefully give cleaner code and enable more features.
|
||||||
|
|
||||||
|
Common header:
|
||||||
|
|
||||||
|
7654 3210
|
||||||
|
+----+----+
|
||||||
|
|CCCC|UUUU|
|
||||||
|
+----+----+
|
||||||
|
|
||||||
|
CCCC = Command
|
||||||
|
UUUU = User id
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
0: Version
|
||||||
|
1: Login
|
||||||
|
2: Case check
|
||||||
|
3: Codec switch
|
||||||
|
4: Data
|
||||||
|
5: Ping
|
||||||
|
6: -
|
||||||
|
7: -
|
||||||
|
8: -
|
||||||
|
9: -
|
||||||
|
A: -Reserved- (So header byte will never encode to a v)
|
||||||
|
B: -
|
||||||
|
C: -
|
||||||
|
D: -
|
||||||
|
E: -
|
||||||
|
F: -
|
||||||
|
|
||||||
|
CMC = 2 byte Cache Miss Counter, increased every time it is used
|
||||||
|
|
||||||
|
Version:
|
||||||
|
Client sends:
|
||||||
|
Command = 0x0, User = 0xF
|
||||||
|
Data is 4 bytes big endian protocol version
|
||||||
|
Ends with CMC
|
||||||
|
Server replies:
|
||||||
|
Command = 0x0, User = userid
|
||||||
|
Then 4 chars, followed by big endian int:
|
||||||
|
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
|
||||||
|
|
||||||
|
Login:
|
||||||
|
Command = 0x1, User = userid from version reply
|
||||||
|
Client sends:
|
||||||
|
16 bytes MD5 hash of: (first 32 bytes of password) xor (8 repetitions of login challenge)
|
||||||
|
Ends with CMC
|
||||||
|
Server replies:
|
||||||
|
4 chars, then maybe three ints
|
||||||
|
LACK serverip clientip mtu means login accepted
|
||||||
|
LNAK means not accepted
|
||||||
|
|
||||||
|
Case check:
|
||||||
|
Command = 0x2, User = userid from version reply
|
||||||
|
Client sends:
|
||||||
|
Lots of data that should not be decoded
|
||||||
|
Server replies:
|
||||||
|
The requested domain copied raw
|
||||||
|
|
||||||
|
Switch codec:
|
||||||
|
Command = 0x03, User = userid
|
||||||
|
Client sends:
|
||||||
|
One byte, with value 5 or 6, representing number of bits per byte in encoding
|
||||||
|
Server sends:
|
||||||
|
Name of codec if accepted. After this all upstream packets must be encoded with the new codec.
|
||||||
|
BADCODEC if not accepted. Client must then revert to Base64
|
||||||
|
|
||||||
|
Data:
|
||||||
|
Command = 0x04, User = userid
|
||||||
|
Data header:
|
||||||
|
76543210 7 6 543210
|
||||||
|
+--------+-+-+------+
|
||||||
|
|SSSSSSSS|L|C|FFFFFF|
|
||||||
|
+--------+-+-+------+
|
||||||
|
|
||||||
|
SSSSSSSS = Packet sequence number
|
||||||
|
L = Last fragment in packet flag
|
||||||
|
C = Compression used flag
|
||||||
|
FFFFFF = Fragment index in packet
|
||||||
|
|
||||||
|
The data header is used both by the server and the client, followed by a fragment.
|
||||||
|
Packet and fragment numbers are used to detect retransmits by dns relay.
|
||||||
|
When a fragment arrives with L bit set, the packet should be pushed to the tun device.
|
||||||
|
If the C bit is set, it should be decompressed before sent to tun device.
|
||||||
|
|
||||||
|
Ping:
|
||||||
|
Command = 0x04, User = userid
|
||||||
|
Client sends:
|
||||||
|
Only a CMC
|
||||||
|
Server replies:
|
||||||
|
With a Data packet or 0 bytes.
|
||||||
|
|
Loading…
Reference in New Issue