- noq, desarrollado por el equipo de n0, es una implementación de QUIC de propósito general escrita en Rust que admite multipath y NAT traversal
- Se desarrolló como una base de código independiente para resolver las limitaciones de la estructura basada en Quinn de iroh
- Incluye diversas funciones como QUIC Multipath, NAT Traversal, Address Discovery, extensiones de QLog y WeakConnectionHandle
- Se usa en producción desde iroh v0.96 y ya completó pruebas de interoperabilidad con picoquic
- A futuro, seguirá colaborando con el grupo de trabajo de QUIC y el equipo de Quinn, con la meta de convertirse en una tecnología base para desarrolladores de aplicaciones de red basadas en Rust
Anuncio de noq
- noq es una implementación de QUIC de propósito general desarrollada por el equipo de n0, con soporte para multipath y NAT traversal
- Se utiliza como capa de transporte desde iroh v0.96 y puede usarse para fines generales, no solo dentro de iroh
Transición de Quinn a noq
- iroh usaba QUIC sobre Quinn, pero había muchas funciones complejas, como NAT traversal y cambio de ruta, que debían manejarse fuera de QUIC
- Debido a estas limitaciones estructurales, se decidió hacer un hard fork de Quinn porque era difícil aplicar modificaciones externas
- Manteniendo la colaboración con Quinn, el proyecto cambió de rumbo hacia una base de código independiente para satisfacer los requisitos específicos de iroh
Funciones principales de noq
-
QUIC Multipath
- Implementa por completo la especificación de QUIC Multipath, integrando las rutas de relay y directas de iroh (IPV4, IPV6) como conceptos de ruta de primera clase dentro de QUIC
- Mantiene el estado de control de congestión para cada ruta y permite elegir la ruta óptima
- Antes, iroh manipulaba las rutas por debajo de QUIC, pero ahora QUIC mismo las reconoce y las administra
- Está diseñado como una implementación multipath de propósito general que también puede usarse fuera de iroh
-
QUIC NAT Traversal
- Implementa, a partir de una interpretación propia, el borrador de QUIC NAT Traversal, y se menciona como el primer caso con estabilidad de nivel de producción
- Ya fue probado en condiciones reales en cientos de miles de dispositivos con iroh
- Realiza hole punching de NAT directamente en la capa QUIC, lo que permite un funcionamiento más preciso del controlador de congestión y la detección de pérdidas
-
QUIC Address Discovery
- Usa QUIC Address Discovery (QAD) desde iroh v0.32
- Aprende la dirección IP pública del cliente mediante una conexión QUIC en lugar de usar STUN
- El envío de paquetes cifrados ayuda a evitar la rigidización del protocolo y refuerza la privacidad
-
Extensiones de QLog
- Registra diversos eventos de conexiones QUIC con base en el borrador del estándar QLog
- Admite muchos más eventos que antes e incorpora también eventos relacionados con multipath
- Es compatible con herramientas de visualización como qvis y también ofrece un prototipo de visor para mostrar flujos de paquetes multirruta
-
WeakConnectionHandle
- Un tipo que permite promover a un objeto Connection cuando sea necesario sin mantener viva la conexión
- Es similar a
std::sync::Weak, pero no requiere usar Arc
- Puede resultar útil en componentes como un administrador de conexiones
Uso en producción e interoperabilidad
- noq se usa en producción desde iroh v0.96
- Además de su propia implementación multipath, ya completó pruebas de interoperabilidad con picoquic
Planes a futuro
- noq seguirá evolucionando como una tecnología base de largo plazo
- Se impulsarán mejoras en NAT traversal y optimizaciones de rendimiento basadas en multipath
- Continuará la colaboración con el grupo de trabajo de QUIC y el equipo de Quinn
- Se ampliará la colaboración con desarrolladores de implementaciones QUIC, transporte P2P y aplicaciones que operan en diversos entornos de red
- Se ofrecerán documentación y código de ejemplo para que pueda probarse directamente esta implementación multipath de QUIC basada en Rust
Resumen de Iroh
- Iroh es una biblioteca de networking “dial-any-device” que permite una configuración de red flexible mediante la combinación de protocolos
- Ya está en operación en cientos de miles de dispositivos y se publica como código abierto
- Es posible participar en el proyecto a través de su documentación, código y canal de Discord
1 comentarios
Comentarios en Hacker News
Fue agradable ver en este hilo cómo el equipo de Iroh discutía con respeto mutuo el proceso para decidir hacer un fork
También deja claro lo difícil que es volver a subir cambios internos al upstream. Dijeron que no tenían tiempo para dividir sus cambios en cientos de PR pequeños para revisión. Desde la perspectiva de una empresa, es una inversión de tiempo demasiado grande
Aun así, ojalá puedan mantener el proyecto original y los detalles de implementación relativamente cercanos. Una vez que esté lo bastante estabilizado, quizá también sea posible hacer integraciones en bloques grandes en vez de por unidades pequeñas
iroh parece un producto bien posicionado en esta era de crear aplicaciones personales rápidamente
Me gustaría usarlo para hacer un “app relay”. Estoy pensando en una solución OSS zero-config que permita a los usuarios acceder de forma remota a apps o datos dentro de su red sin configuración adicional. Esto es distinto de un relay de red como Tailscale
Me gusta mucho el equipo de n0. Uso seguido su CLI sendme para hacer transferencia de archivos P2P
Me daba curiosidad cómo noq/iroh reenvía paquetes QUIC (relay). Como QUIC es difícil de inspeccionar, me preguntaba cómo sabe el relay a qué destino enviar cada paquete, o si encapsulan QUIC dentro de otro protocolo
En la práctica, encapsulan datagramas QUIC dentro de WebSocket para transportarlos. El encabezado incluye el EndpointId de destino (clave pública ed25519), y mediante el handshake también se autentica el EndpointId del remitente
En otras palabras, están tunelizando datagramas QUIC como HTTPS sobre TCP. Es doble cifrado, pero está diseñado para funcionar incluso en entornos donde UDP está bloqueado y para parecer tráfico normal
El equipo de iroh sigue avanzando a gran velocidad
Planeo sacar tiempo este fin de semana para intentar crear con iroh una red overlay tipo Nebula
Un enfoque como QUIC sigue siendo una arquitectura que ata fuertemente la persistencia de la conexión al estado de transporte
He estado pensando si sería posible separar por completo la identidad de sesión de la capa de transporte, para que una falla de transporte se vuelva simplemente un evento recuperable. Me pregunto si alguien ha visto un sistema práctico que vaya más allá de QUIC
Consulté este snippet de código de noq
También me pareció interesante la noticia reciente sobre la función de transportes personalizados de iroh
Se puede ver en detalle en el post del blog de iroh 0.97.0
¿Alguien ha revisado nQUIC? Integrar Noise en Noq podría ser interesante
noq (y Quinn, sobre el que se basa) permite implementar su propio trait de “Session”, así que puedes elegir entre TLS o nQUIC según prefieras
No hay que confundirlo con Noq de tsoding, cuyo nombre viene de “Not Coq”