Couche de transport
| Élément | Valeur |
|---|---|
| Transport | TCP (connexion persistante) |
| Port par défaut | 5225 |
| Options de socket | TCP_NODELAY activé — envoie les petits paquets immédiatement, sans le délai de regroupement de l'algorithme de Nagle |
| TLS | Optionnel — si le serveur a un certificat configuré, tout le flux est enveloppé dans du TLS unidirectionnel (authentification du serveur) |
| Encodage | Champs binaires à largeur fixe + clés UTF-8. Les entiers sont en gros-boutien (big-endian, ordre réseau) |
| Terminaison de trame | Un octet \n. Aucun traitement de \r |
| Trame vide | Un simple \n (la position de l'op est \n) est ignoré silencieusement comme un keep-alive |
| Taille max. d'une trame | 192 octets — op inclus, \n exclu (dépassement → E line_too_long, puis connexion fermée) |
| Pipelining | Autorisé — les réponses peuvent arriver dans un ordre différent des requêtes |
| Timeout d'inactivité | Aucun — le serveur ne ferme jamais une connexion silencieuse |
| Progression d'une trame | 5 secondes maximum du premier octet op au fixed header et au LF ; un envoi partiel ne peut occuper la connexion indéfiniment |
Ordre d'établissement de connexion
- Connexion TCP
- Poignée de main TLS, si le serveur a activé TLS — se connecter en clair à un serveur TLS entraîne une déconnexion à cette étape
- Poignée de main d'authentification, une seule fois
- Échange de trames du protocole de verrous à partir de là
Règles de trame
Chaque message est une trame = une ligne.
[ op : 1 octet ][ en-tête fixe spécifique à l'op ][ corps variable ] \nLe récepteur doit examiner l'op et lire d'abord l'en-tête fixe selon son nombre d'octets, avant de chercher \n. En effet, l'en-tête fixe est binaire et peut contenir la valeur 0x0A (\n) (par ex. lease=10 → 0A). La recherche de \n ne s'applique qu'au segment clé/texte final.
| Direction | op | En-tête fixe |
|---|---|---|
| Client → Serveur | A | 10 bytes (wait:u8 + lease:u8 + owner:u64 BE) |
| Client → Serveur | R | 8 bytes (token:u64 BE) |
| Serveur → Client | A | 16 bytes (token:u64 BE + owner:u64 BE) |
| Serveur → Client | T · B | 8 bytes (owner:u64 BE) |
| Serveur → Client | R · N | 8 bytes (token:u64 BE) |
| Serveur → Client | M · L · E | 0 bytes (address/reason UTF-8 text) |
Si une trame dépasse 192 octets ou est malformed, le serveur flush E si possible puis ferme la connexion. Le client traite aussi malformed, oversized, op inconnu ou E non corrélable comme connection-fatal. Un acquire dont au moins un octet a été envoyé dans cette session n'est pas retenté automatiquement et devient Indeterminate sans réponse définitive.
Terminologie
- Trame (frame) — le morceau qu'un flux d'octets continu (TCP) est découpé pour représenter « un message ». Dans ce protocole, une ligne terminée par
\nconstitue une trame. - Gros-boutien (big-endian) — l'ordre d'octets qui écrit d'abord l'octet le plus significatif d'un entier. C'est le standard des protocoles réseau, d'où son autre nom d'ordre réseau (network order).
- Pipelining — envoyer la requête suivante sans attendre la réponse précédente. Le chevauchement des latences d'aller-retour augmente ainsi le débit.
- Keep-alive — un signal dénué de sens envoyé périodiquement pour signaler qu'une connexion est toujours active. Ici, une trame vide (
\n) joue ce rôle.