- noq, desenvolvido pela equipe da n0, é uma implementação genérica de QUIC escrita em Rust com suporte a multipath e NAT traversal
- Foi desenvolvido como uma base de código independente para resolver as limitações da estrutura baseada em Quinn do iroh
- Inclui diversos recursos, como QUIC Multipath, NAT Traversal, Address Discovery, extensões de QLog e WeakConnectionHandle
- Está em uso em produção desde o iroh v0.96 e já concluiu testes de interoperabilidade com o picoquic
- No futuro, a equipe pretende continuar a colaborar com o grupo de trabalho do QUIC e com a equipe do Quinn, desenvolvendo-o como uma tecnologia-base para desenvolvedores de aplicações de rede em Rust
Anúncio do noq
- noq é uma implementação genérica de QUIC desenvolvida pela equipe da n0, com suporte a multipath e NAT traversal
- Está sendo usado como camada de transporte desde o iroh v0.96 e pode ser utilizado para fins gerais, não se limitando ao iroh
Transição de Quinn para noq
- O iroh anteriormente usava QUIC com base no Quinn, mas havia muitos recursos complexos, como NAT traversal e troca de rota, que precisavam ser tratados fora do QUIC
- Devido a essas limitações estruturais, foi decidido fazer um hard fork do Quinn, já que modificações externas eram difíceis
- Mantendo a colaboração com o Quinn, a equipe mudou para uma base de código independente para atender aos requisitos específicos do iroh
Principais recursos do noq
-
QUIC Multipath
- Implementa completamente a especificação QUIC Multipath, integrando os caminhos de relay e diretos do iroh (IPV4, IPV6) como conceitos de caminho de primeira classe do QUIC
- Mantém o estado de controle de congestionamento para cada caminho, permitindo selecionar a rota ideal
- Antes, o iroh manipulava caminhos abaixo do QUIC; agora, o próprio QUIC reconhece e gerencia isso
- Foi projetado como uma implementação genérica de multipath que também pode ser usada fora do iroh
-
QUIC NAT Traversal
- Implementa, com interpretação própria, o rascunho de NAT traversal para QUIC, sendo citado como o primeiro caso com estabilidade de nível de produção
- Já passou por testes em produção com centenas de milhares de dispositivos iroh
- Faz NAT hole punching diretamente na camada QUIC, permitindo que o controlador de congestionamento e a detecção de perdas funcionem com mais precisão
-
QUIC Address Discovery
- Desde o iroh v0.32, usa QUIC Address Discovery (QAD)
- Aprende o endereço IP público do cliente por meio de uma conexão QUIC, em vez de usar STUN
- Transmissão de pacotes criptografados para evitar a ossificação do protocolo e reforçar a privacidade
-
QLog estendido
- Registra vários eventos de conexões QUIC com base no rascunho do padrão QLog
- Suporta muito mais eventos do que antes e adiciona eventos relacionados a multipath
- É compatível com ferramentas de visualização como qvis e também oferece um protótipo de visualizador que mostra o fluxo de pacotes em múltiplos caminhos
-
WeakConnectionHandle
- Um tipo que permite promover para um objeto Connection quando necessário, sem manter a conexão viva
- É semelhante a
std::sync::Weak, mas não exige o uso de Arc
- Pode ser útil em casos como gerenciadores de conexão
Aplicação em produção e interoperabilidade
- O noq está em uso em produção desde o iroh v0.96
- Além da implementação própria de multipath, também já concluiu testes de interoperabilidade com o picoquic
Planos futuros
- O objetivo é evoluir o noq como uma tecnologia-base de longo prazo
- Avançar em melhorias de NAT traversal e em otimização de desempenho com base em multipath
- Manter a colaboração com o grupo de trabalho do QUIC e com a equipe do Quinn
- Ampliar a colaboração com desenvolvedores de implementação de QUIC, transporte P2P e aplicações que funcionam em diversos ambientes de rede
- Fornecer documentação e exemplos de código para que seja possível usar diretamente a implementação Rust de QUIC multipath
Visão geral do Iroh
- Iroh é uma biblioteca de rede “dial-any-device” que oferece configuração de rede flexível por meio da combinação de protocolos
- Já está em operação em centenas de milhares de dispositivos e é open source
- É possível participar do projeto por meio da documentação, do código e do canal no Discord
1 comentários
Comentários no Hacker News
Foi bom ver, nesta thread, a equipe do Iroh discutindo com respeito mútuo o processo que levou à decisão de fazer um fork
Isso também deixa bem claro como é difícil reenviar mudanças internas para o upstream. Eles disseram que não tinham tempo para dividir suas mudanças em centenas de PRs pequenos para revisão. Do ponto de vista da empresa, isso representa um investimento de tempo grande demais
Ainda assim, espero que mantenham o projeto original e os detalhes de implementação próximos. Depois que tudo estiver suficientemente estabilizado, talvez até seja possível fazer mesclagens em blocos grandes, em vez de unidades pequenas
O iroh parece um produto bem posicionado para esta era de criação rápida de aplicações pessoais
Eu queria usar isso para criar um “app relay”. Estou pensando em uma solução OSS zero-config que permita ao usuário acessar remotamente apps ou dados dentro da própria rede sem configuração separada. Isso é diferente de relés de rede como o Tailscale
Gosto muito da equipe da n0. Eu uso bastante o sendme CLI deles para transferência de arquivos P2P
Fiquei curioso sobre como noq/iroh retransmite (relay) pacotes QUIC. Como o QUIC é difícil de inspecionar, fiquei pensando como o relay sabe quais pacotes mandar para onde, ou se ele encapsula o QUIC em outro protocolo
Na prática, ele encapsula datagramas QUIC em WebSocket para transporte. O cabeçalho inclui o EndpointId de destino (chave pública ed25519), e o handshake também autentica o EndpointId do remetente
Em outras palavras, é como tunelar datagramas QUIC por HTTPS over TCP. Há criptografia dupla, mas foi projetado para funcionar mesmo em ambientes com bloqueio de UDP e para parecer tráfego comum
A equipe do iroh ainda está avançando em ritmo acelerado
Pretendo reservar um tempo no fim de semana para tentar construir uma rede overlay no estilo do Nebula com iroh
Uma abordagem como QUIC ainda mantém a persistência da conexão fortemente acoplada ao estado de transporte
Estou pensando se seria possível separar completamente a identidade da sessão da camada de transporte, de modo que uma falha de transporte vire apenas um evento recuperável. Queria saber se alguém já viu um sistema prático que vá além do QUIC nesse aspecto
Consultei este trecho de código do noq
Também achei interessante a notícia recente sobre o recurso de transporte customizado do iroh
Dá para ver mais detalhes no post do blog do iroh 0.97.0
Alguém já conferiu o nQUIC? Integrar Noise ao Noq parece algo interessante
O noq (e o Quinn, sobre o qual ele é construído) permite implementar seu próprio trait “Session”, então dá para escolher entre TLS ou nQUIC
Não confundir com o Noq do tsoding, cujo nome vem de “Not Coq”