Actuellement en test : le code GitHub sera ouvert une fois terminé.

Couche de transport

ÉlémentValeur
TransportTCP (connexion persistante)
Port par défaut5225
Options de socketTCP_NODELAY activé — envoie les petits paquets immédiatement, sans le délai de regroupement de l'algorithme de Nagle
TLSOptionnel — si le serveur a un certificat configuré, tout le flux est enveloppé dans du TLS unidirectionnel (authentification du serveur)
EncodageChamps binaires à largeur fixe + clés UTF-8. Les entiers sont en gros-boutien (big-endian, ordre réseau)
Terminaison de trameUn octet \n. Aucun traitement de \r
Trame videUn simple \n (la position de l'op est \n) est ignoré silencieusement comme un keep-alive
Taille max. d'une trame192 octets — op inclus, \n exclu (dépassement → E line_too_long, puis connexion fermée)
PipeliningAutorisé — 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 trame5 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

  1. Connexion TCP
  2. 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
  3. Poignée de main d'authentification, une seule fois
  4. É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 ] \n

Le 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=100A). La recherche de \n ne s'applique qu'au segment clé/texte final.

DirectionopEn-tête fixe
Client → ServeurA10 bytes (wait:u8 + lease:u8 + owner:u64 BE)
Client → ServeurR8 bytes (token:u64 BE)
Serveur → ClientA16 bytes (token:u64 BE + owner:u64 BE)
Serveur → ClientT · B8 bytes (owner:u64 BE)
Serveur → ClientR · N8 bytes (token:u64 BE)
Serveur → ClientM · L · E0 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 \n constitue 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.