Protocolo

LSP/1.2
Landspeed Protocol

Especificación abierta del protocolo que mueve a Landspeed: cómo se descubren los pares en la LAN, cómo negocian un test y cómo reportan los resultados. Pensado para ser implementado por cualquier cliente: la app, Gard, o el tuyo.

Capa de descubrimiento

Bonjour / mDNS

Servicio _landspeed._tcp.local. con TXT records que anuncian versión, vendor y capacidades.

Capa de control

TCP · texto · una sola conexión

Negociación humana-legible inspirada en HTTP/1: HELLO, RUN, STATS, BYE.

Capa de transporte

TCP o UDP · N streams

El test corre en conexiones independientes de la conexión de control. Se mide cada stream y se agrega.

Sin nube

Punto a punto en LAN

No hay servidores Landspeed en Internet. No hay tokens, no hay cuentas, no hay relays.

1. Descubrimiento

Un peer LSP/1.2 publica un servicio Bonjour del tipo _landspeed._tcp.local. en el puerto de control (por defecto 5208). El TXT record incluye:

txtvers=1
ver=1.2
vendor=landspeed-macos/2.0.1   # o gard/1.2.0
caps=tcp,udp,bidir,multistream
maxstreams=32
host=macbook-de-marco

Cualquier cliente conforme debe ignorar TXT keys que no entienda. El descubrimiento puede complementarse con resolución por IP+puerto cuando mDNS no está disponible (entornos enterprise estrictos).

2. Conexión de control

La conexión de control es TCP, formato texto UTF-8 con líneas terminadas en \r\n, similar a HTTP. La primera línea del cliente es siempre el saludo:

C: HELLO LSP/1.2 vendor=gard/1.2.0
S: 200 OK ver=1.2 host=macbook-de-marco caps=tcp,udp,bidir,multistream
C: RUN dir=bi proto=tcp streams=4 duration=10s
S: 200 RUNNING port=5209 token=Z9k...
   <— a partir de aquí los streams se abren al puerto indicado —>
S: STATS t=1.0 up=512.3 down=302.1 rttp50=6.9 rttp95=12.0 loss=0.00
S: STATS t=2.0 up=559.8 down=331.2 rttp50=7.1 rttp95=12.4 loss=0.00
...
S: 200 DONE up=574.2 down=349.2 maxup=877.9 maxdown=407.2 lat=7.3 jitter=1.1 loss=0.00
C: BYE
S: 200 BYE

Toda respuesta del servidor empieza por un código de estado de tres dígitos. 2xx éxito, 4xx error del cliente, 5xx error del servidor o de la red. Los STATS intermedios son opcionales pero recomendados — habilitan la gráfica progresiva en tiempo real.

3. Direcciones y modos

  • dir=up — el cliente envía datos al servidor.
  • dir=down — el servidor envía datos al cliente.
  • dir=bi — ambas direcciones simultáneas. La firma de Landspeed.

4. Streams

Los streams se abren contra el port que devuelve el servidor en la respuesta a RUN. Cada stream se autentica con el token efímero (válido sólo durante el test) en sus primeros 32 bytes. Después, el stream transporta datos pseudoaleatorios incompresibles, por defecto desde/dev/urandom-equivalente del SO.

5. UDP

En modo proto=udp, el servidor responde con el puerto UDP dedicado y un burst objetivo en pps. El cliente envía paquetes con un seq de 8 bytes y un timestamp de 8 bytes, y el servidor reporta pérdida y jitter por intervalo.

6. Errores comunes

  • 400 — saludo inválido o versión no soportada.
  • 403 — cliente no autorizado en este peer.
  • 409 — ya hay un test en curso.
  • 503 — servidor saturado o sin recursos.
  • 504 — handshake de stream no completado.

7. Compatibilidad

LSP/1.2 mantiene compatibilidad con clientes 1.1 con caps reducidas (sin bidireccional, sin multistream). Las capacidades efectivas son la intersección entre las del cliente y las del servidor.

8. Implementaciones de referencia

  • Landspeed — apps nativas en iOS, macOS, Android y Windows.
  • Gard — cliente CLI para macOS, Linux y Windows.

¿Vas a implementar un cliente LSP? Avisanos a landspeed@patagua.dev y lo listamos como implementación conforme.