Project

General

Profile

Doc quassel protocols » History » Version 4

Sputnick, 02/27/2013 01:36 AM

1 1 Sputnick
h1. The Quassel Protocol
2 2 Sputnick
3 2 Sputnick
h2. Overview
4 2 Sputnick
5 3 Sputnick
When we talk about the "Quassel protocol", we mean the format of data sent between a Quassel core and connected Quassel clients. At the moment (i.e., as of version 0.8), only one protocol - the "legacy protocol" - is in use. It has evolved from Quassel's early days and hasn't really changed all that much over the years. However, back then we didn't really expect Quassel to ever become popular, much less other developers writing alternate clients such as QuasselDroid or iQuassel. Accordingly, instead of designing (and documenting) a well-defined and easy-to-use format, we chose a rather pragmatic approach for sending data over the wire: Because Qt already had a facility to (de)serialize arbitrary data types over a binary stream - using QDataStream - we simply went with that.
6 2 Sputnick
7 2 Sputnick
While being both straightforward and easy to implement in Quassel, this choice turned out to be rather unlucky in retrospect:
8 2 Sputnick
9 2 Sputnick
* QDataStream's serialization format is not the most efficient one. In particular, strings are serialized as UTF-16, which means that almost half of the data exchanged between client and core is nullbytes. However, this is partially compensated by Quassel using compression if possible.
10 2 Sputnick
* Speaking of which, we don't use streaming compression, which means that lots of potential for benefitting from recurring strings is not used. And since many of the objects we send are key/value maps which tend to have the same set of keys every time, this does matter in practice.
11 1 Sputnick
* And to add insult to injury, we waste even more space all over the place because we simply didn't think about optimizing the protocol. Mobile use of Quassel was just not on our radar in 2005.
12 3 Sputnick
* The serialization format is nowhere documented in a concise and complete way. Yes, there's documentation somewhere in Qt for built-in types; for Quassel's own types however, one would have to hunt through the source. And without reading (and understanding) some rather icky parts of Quassel code, it's close to impossible to understand what's going on even if one manages to deserialize the binary data into proper objects. Bad news for people wanting to write alternate clients. Amazingly, some smart people still managed to reverse-engineer the protocol...
13 3 Sputnick
14 4 Sputnick
To fix these and more issues, we're now planning to replace the legacy protocol by something more sensible. As the first (and most complicated) step, work is now underway to implement a protocol abstraction that will then allow us to much more easily support alternative formats. As a neat side effect, the resulting refactoring also will make some core parts of the code (e.g. SignalProxy) much nicer to understand.
15 4 Sputnick
16 4 Sputnick
h2. Protocol Abstraction - The Master Plan
17 4 Sputnick
18 4 Sputnick
h3. Requirements for new protocols
19 4 Sputnick
20 4 Sputnick
h3. Keeping compatibility
21 4 Sputnick
22 4 Sputnick
TBD: for how long?
23 4 Sputnick
24 4 Sputnick
h2. Abstract View
25 4 Sputnick
26 4 Sputnick
h3. Handshake
27 4 Sputnick
28 4 Sputnick
h4. Probing
29 4 Sputnick
30 4 Sputnick
h4. Init and Authentication
31 4 Sputnick
32 4 Sputnick
h3. Sigproxy Mode
33 4 Sputnick
34 4 Sputnick
h2. On-Wire Format
35 4 Sputnick
36 4 Sputnick
h3. Legacy Protocol