Framing Layer
This describes the lowest layer of the protocol, on which the Message Layer rests.
This layer is named the "framing" layer, because its only purpose is to frame messages of higher layers and negotiate basic features for this use case.
State Machine¶
The framing layer has two possible states: HANDSHAKE
and CONNECTED
. It starts off in HANDSHAKE
state.
Handshake State¶
First, the client sends 0x42b33f00
with certain flags set depending on available features:
Flag | Meaning |
---|---|
0x01 |
TLS |
0x02 |
Compression |
Afterwards, the client sends a list of all protocols it supports:
Version | Protocol |
---|---|
0x00000001 |
Old legacy protocol, which won’t be described here |
0x00000002 |
Datastream protocol, as described in this document |
To mark the end of the list, the client sets the flag 0x80000000
on the last protocol in the list.
The server responds with the following data:
Type | Field | Description |
---|---|---|
UChar |
flags | As described above |
Short |
extra | Extra data, depends on the protocol, so far ignored |
Char |
version | Protocol Version |
Afterwards, the server expects the client to first enable TLS (if supported) and afterwards compression (if supported).
Compression is handled as Deflate applied to the socket.
This negotiation ends with the protocol advancing into the CONNECTED
state.
Connected State¶
Receiving¶
The client reads an uint32_t of the size of the following message frame in bytes, followed by that message frame.
Sending¶
The client sends an uint32_t of the size of the message frame in bytes, followed by that message frame. Afterwards, if compression is enabled, the compressor is flushed.