diff --git a/doc/proto_00000403.txt b/doc/proto_00000403.txt index fa8b0b3..f1dbad9 100644 --- a/doc/proto_00000403.txt +++ b/doc/proto_00000403.txt @@ -1,98 +1,68 @@ 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 + First byte v or V + Rest encoded with base32: + 4 bytes big endian protocol version + CMC Server replies: - Command = 0x0, User = userid - Then 4 chars, followed by big endian int: + 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: -Command = 0x1, User = userid from version reply 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) - Ends with CMC + CMC Server replies: - 4 chars, then maybe three ints - LACK serverip clientip mtu means login accepted LNAK means not accepted + x.x.x.x-y.y.y.y-mtu means accepted (server ip, client ip, mtu) Case check: -Command = 0x2, User = userid from version reply Client sends: + First byte z or Z 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 + First byte s or S + One byte ASCII digit, meaning userid + One byte ASCII digit, 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 + 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: -Command = 0x04, User = userid Data header: - 76543210 7 6 543210 - +--------+-+-+------+ - |SSSSSSSS|L|C|FFFFFF| - +--------+-+-+------+ + 321 0 + +---+-+ + |UUU|L| + +---+-+ -SSSSSSSS = Packet sequence number +UUU = Userid 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. +First 4 bits coded as hex in ASCII. +Followed by data encoded with the chosen codec. Ping: Command = 0x04, User = userid Client sends: Only a CMC -Server replies: - With a Data packet or 0 bytes. +The server responses 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 a packet to send, data length is set and the data is a full raw +unencoded ip packet, prefixed with 32 bits tun data.