Actualmente en pruebas: el código de GitHub se abrirá al finalizar.

Capa de transporte

ElementoValor
TransporteTCP (conexión persistente)
Puerto por defecto5225
Opciones de socketTCP_NODELAY activado — envía paquetes pequeños de inmediato, sin el retraso de agrupación de Nagle
TLSOpcional — si el servidor tiene un certificado configurado, todo el flujo se envuelve en TLS unidireccional (autenticación del servidor)
CodificaciónCampos binarios de ancho fijo + claves UTF-8. Los enteros son big-endian (orden de red)
Terminador de tramaUn byte \n. Sin manejo de \r
Trama vacíaUn \n solo (la posición de op es \n) se ignora silenciosamente como keep-alive
Tamaño máximo de trama192 bytes — incluye op, excluye \n (si se supera → E line_too_long y conexión cerrada)
PipeliningPermitido — las respuestas pueden llegar en un orden distinto al de las solicitudes
Timeout de inactividadNinguno — el servidor nunca cierra una conexión silenciosa
Progreso de tramaMáximo 5 segundos desde el primer byte op hasta fixed header y LF; un envío parcial no ocupa la conexión indefinidamente

Orden de establecimiento de la conexión

  1. Conexión TCP
  2. Handshake TLS, si el servidor tiene TLS activado — conectarse en texto plano a un servidor TLS provoca una desconexión en este paso
  3. Protocolo de autenticación, una vez
  4. Intercambio de tramas del protocolo de bloqueo a partir de entonces

Reglas de formación de tramas

Cada mensaje es una trama = una línea.

[ op: 1 byte ][ cabecera fija según op ][ cuerpo variable ] \n

El receptor debe fijarse en el op y leer primero la cabecera fija según su número de bytes, buscando \n solo después. Esto se debe a que la cabecera fija es binaria y puede contener 0x0A (\n) como valor (p. ej. lease=100A). La búsqueda de \n solo se aplica al segmento final de clave/texto.

DirecciónopCabecera fija
Cliente → ServidorA10 bytes (wait:u8 + lease:u8 + owner:u64 BE)
Cliente → ServidorR8 bytes (token:u64 BE)
Servidor → ClienteA16 bytes (token:u64 BE + owner:u64 BE)
Servidor → ClienteT · B8 bytes (owner:u64 BE)
Servidor → ClienteR · N8 bytes (token:u64 BE)
Servidor → ClienteM · L · E0 bytes (address/reason UTF-8 text)

Si una trama supera 192 bytes o está malformed, el servidor hace flush de E si puede y cierra la conexión. El cliente también trata malformed, oversized, op desconocido o E no correlacionable como connection-fatal. Un acquire del que se haya enviado al menos un byte en esa sesión no se reintenta automáticamente y queda Indeterminate sin respuesta definitiva.

Terminología

  • Trama (frame) — el fragmento en que se corta un flujo continuo de bytes (TCP) para significar "un mensaje". En este protocolo, una línea terminada en \n es una trama.
  • Big-endian — el orden de bytes que escribe primero el byte más significativo de un entero. Es el estándar de los protocolos de red, por lo que también se llama orden de red.
  • Pipelining — enviar la siguiente solicitud sin esperar la respuesta anterior. Al solapar la latencia de ida y vuelta de esta forma, aumenta el rendimiento.
  • Keep-alive — una señal sin significado enviada periódicamente para anunciar que una conexión sigue viva. Aquí, una trama vacía (\n) cumple ese papel.