Transportschicht
| Element | Wert |
|---|---|
| Transport | TCP (dauerhafte Verbindung) |
| Standardport | 5225 |
| Socket-Optionen | TCP_NODELAY aktiviert — sendet kleine Pakete sofort, ohne Nagle-Verzögerung |
| TLS | Optional — wenn der Server ein Zertifikat konfiguriert hat, wird der gesamte Stream in einseitiges TLS (Server-Auth) gehüllt |
| Kodierung | Binäre Felder fester Breite + UTF-8-Schlüssel. Ganzzahlen sind big-endian (Netzwerk-Byte-Reihenfolge) |
| Frame-Terminator | Ein \n-Byte. Keine \r-Behandlung |
| Leerer Frame | Ein reines \n (op-Position ist \n) wird stillschweigend als Keep-Alive ignoriert |
| Maximale Frame-Größe | 192 Byte — inklusive op, exklusive \n (Überschreitung → E line_too_long, dann Verbindung geschlossen) |
| Pipelining | Erlaubt — Antworten können in anderer Reihenfolge als die Anfragen eintreffen |
| Idle-Timeout | Keiner — der Server schließt niemals eine ruhige Verbindung |
| Frame-Fortschrittszeit | Höchstens 5 Sekunden vom ersten op-Byte über fixed header bis LF; Teilübertragung kann die Verbindung nicht unbegrenzt belegen |
Reihenfolge des Verbindungsaufbaus
- TCP-Verbindungsaufbau
- TLS-Handshake, falls der Server TLS aktiviert hat — verbindet man sich im Klartext mit einem TLS-Server, wird die Verbindung an dieser Stelle getrennt
- Auth-Handshake, einmalig
- Ab dann Austausch von Sperrprotokoll-Frames
Framing-Regeln
Jede Nachricht ist ein Frame = eine Zeile.
[ op: 1 Byte ][ op-spezifischer fester Header ][ variabler Body ] \nDer Empfänger muss den op betrachten und den festen Header zuerst anhand seiner Bytezahl lesen, bevor er anschließend nach \n sucht. Das liegt daran, dass der feste Header binär ist und 0x0A (\n) als Wert enthalten kann (z. B. lease=10 → 0A). Die \n-Suche gilt nur für das abschließende Schlüssel-/Textsegment.
| Richtung | op | Fester Header |
|---|---|---|
| Client → Server | A | 10 bytes (wait:u8 + lease:u8 + owner:u64 BE) |
| Client → Server | R | 8 bytes (token:u64 BE) |
| Server → Client | A | 16 bytes (token:u64 BE + owner:u64 BE) |
| Server → Client | T · B | 8 bytes (owner:u64 BE) |
| Server → Client | R · N | 8 bytes (token:u64 BE) |
| Server → Client | M · L · E | 0 bytes (address/reason UTF-8 text) |
Ist ein Frame größer als 192 Byte oder malformed, flusht der Server wenn möglich E und schließt die Verbindung. Clients behandeln auch malformed, oversized, unbekannten op oder nicht korrelierbares E als connection-fatal. Ein Acquire, von dem in dieser Session mindestens ein Byte gesendet wurde, wird nicht automatisch wiederholt und ist ohne definitive Antwort Indeterminate.
Begriffe
- Frame — die Einheit, in die ein kontinuierlicher Byte-Strom (TCP) zerschnitten wird, um "eine Nachricht" zu bedeuten. In diesem Protokoll ist eine mit
\nabgeschlossene Zeile ein Frame. - Big-endian — die Byte-Reihenfolge, bei der das höchstwertige Byte einer Ganzzahl zuerst geschrieben wird. Sie ist der Standard für Netzwerkprotokolle, daher auch Netzwerk-Byte-Reihenfolge genannt.
- Pipelining — das Senden der nächsten Anfrage, ohne auf die vorherige Antwort zu warten. Durch das Überlappen der Umlaufzeit-Latenz steigt der Durchsatz.
- Keep-Alive — ein bedeutungsloses Signal, das periodisch gesendet wird, um anzukündigen, dass eine Verbindung noch lebt. Hier übernimmt ein leerer Frame (
\n) diese Rolle.