Capa de transporte
| Elemento | Valor |
|---|---|
| Transporte | TCP (conexión persistente) |
| Puerto por defecto | 5225 |
| Opciones de socket | TCP_NODELAY activado — envía paquetes pequeños de inmediato, sin el retraso de agrupación de Nagle |
| TLS | Opcional — si el servidor tiene un certificado configurado, todo el flujo se envuelve en TLS unidireccional (autenticación del servidor) |
| Codificación | Campos binarios de ancho fijo + claves UTF-8. Los enteros son big-endian (orden de red) |
| Terminador de trama | Un byte \n. Sin manejo de \r |
| Trama vacía | Un \n solo (la posición de op es \n) se ignora silenciosamente como keep-alive |
| Tamaño máximo de trama | 192 bytes — incluye op, excluye \n (si se supera → E line_too_long y conexión cerrada) |
| Pipelining | Permitido — las respuestas pueden llegar en un orden distinto al de las solicitudes |
| Timeout de inactividad | Ninguno — el servidor nunca cierra una conexión silenciosa |
| Progreso de trama | Má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
- Conexión TCP
- Handshake TLS, si el servidor tiene TLS activado — conectarse en texto plano a un servidor TLS provoca una desconexión en este paso
- Protocolo de autenticación, una vez
- 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 ] \nEl 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=10 → 0A). La búsqueda de \n solo se aplica al segmento final de clave/texto.
| Dirección | op | Cabecera fija |
|---|---|---|
| Cliente → Servidor | A | 10 bytes (wait:u8 + lease:u8 + owner:u64 BE) |
| Cliente → Servidor | R | 8 bytes (token:u64 BE) |
| Servidor → Cliente | A | 16 bytes (token:u64 BE + owner:u64 BE) |
| Servidor → Cliente | T · B | 8 bytes (owner:u64 BE) |
| Servidor → Cliente | R · N | 8 bytes (token:u64 BE) |
| Servidor → Cliente | M · L · E | 0 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
\nes 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.