Multipath TCP para Linux (2022)
(mptcp.dev)- MPTCP é uma extensão do TCP baseada na RFC 8684, em que uma única conexão usa várias interfaces de rede ao mesmo tempo para melhorar largura de banda, latência e tolerância a falhas
- Como usa vários caminhos em paralelo, permite agregação de largura de banda, preferência por caminhos de menor latência e reinjeção por outros caminhos em caso de falha
- No Linux, cria-se um socket com
IPPROTO_MPTCPe são formados subflows, que são conexões TCP normais; se o par ou equipamentos intermediários não oferecerem suporte, há fallback automático para TCP de caminho único - O gerenciamento de caminhos no Linux, com base na v5.19, pode ser feito pelo modo embutido no kernel ou por daemons em espaço de usuário como o
mptcpd; na v6.8, existe apenas um escalonador de pacotes, controlado por sysctl emnet.mptcp - Na Linux v6.10, os recursos incluem suporte a
socket(), fallback para TCP, gerenciamento de caminhos no kernel/em espaço de usuário, opções de socket TCP e recursos de depuração como contadores MIB, diagnósticos viasse tracepoints
Como o MPTCP muda a forma de estabelecer conexões TCP
- Multipath TCP (MPTCP) é uma extensão do TCP padrão, definida na RFC 8684
- Uma única conexão MPTCP pode enviar e receber pacotes TCP usando várias interfaces ao mesmo tempo
- É possível agregar a largura de banda de várias interfaces ou priorizar a interface com menor latência
- Se um caminho cair, o tráfego pode ser reinjetado de forma transparente por outro caminho, realizando failover
- Diferentemente do TCP comum, que usa um único caminho por vez, o MPTCP pode usar vários caminhos como 5G e Wi‑Fi ao mesmo tempo por meio de subflows
Casos de uso representativos
-
Handover sem interrupção
- É possível trocar de um caminho para outro mantendo a conexão existente
- A Apple usa o Multipath TCP em smartphones principalmente por esse motivo desde 2013
-
Seleção ideal de rede
- Escolhe o “melhor” caminho entre os disponíveis com base em latência, perda, custo e largura de banda
-
Agregação de rede
- É possível aumentar o throughput usando vários caminhos simultaneamente
- Um exemplo é combinar rede fixa e rede móvel para transferir arquivos mais rapidamente
Como a conexão é estabelecida no Linux
- Ao criar um novo socket com o protocolo específico do Linux
IPPROTO_MPTCP, é criado um subflow ou path - Um subflow é uma conexão TCP normal que transmite dados por uma única interface
- Depois disso, subflows adicionais podem ser criados por meio de negociação entre os hosts
- No campo de opções TCP do subflow TCP subjacente, são adicionados novos campos para que o host remoto possa detectar o uso de MPTCP
- Entre eles está a opção
MP_CAPABLE, que informa ao par que o MPTCP está em uso
- Entre eles está a opção
- Se o host remoto ou um middlebox intermediário não suportar MPTCP, o pacote
SYN+ACKretornado não terá opções MPTCP no campo de opções TCP- Nesse caso, a conexão faz fallback para TCP comum e continua em caminho único
Gerenciador de caminhos e escalonador de pacotes
- Internamente, o MPTCP divide entre o Path Manager e o Packet Scheduler as funções de criar subflows, anunciar endereços e escolher caminhos de transmissão
-
Path Manager
- O Path Manager gerencia os subflows da criação à remoção e também cuida do anúncio de endereços
- Em geral, o lado cliente inicia os subflows, e o lado servidor anuncia endereços adicionais com as opções
ADD_ADDReREMOVE_ADDR - Na Linux v5.19, dois path managers são controlados pelo sysctl
net.mptcp.pm_type- tipo
0: modo embutido no kernel, que aplica as mesmas regras a todas as conexões; relacionado aoip mptcp - tipo
1: modo em espaço de usuário, controlado por daemons como omptcpd, permitindo regras diferentes por conexão
- tipo
-
Packet Scheduler
- O Packet Scheduler escolhe qual subflow será usado para enviar o próximo pacote de dados
- Ele pode maximizar a largura de banda disponível, escolher apenas caminhos com menor latência ou aplicar outras políticas conforme a configuração
- Na Linux v6.8, existe apenas um escalonador de pacotes, controlado por sysctls em
net.mptcp
Recursos na Linux v6.10
- Na Linux v6.10, o MPTCP oferece os seguintes recursos
- suporte ao protocolo
IPPROTO_MPTCPna chamada de sistemasocket() - fallback de MPTCP para TCP quando o par ou um middlebox não suporta MPTCP
- gerenciamento de caminhos com path manager embutido no kernel ou em espaço de usuário
- opções de socket normalmente usadas em sockets TCP
- contadores MIB, suporte a diag usado pelo comando
sse recursos de depuração incluindo tracepoints
- suporte ao protocolo
- Mais detalhes sobre as mudanças podem ser vistos no ChangeLog
Comunicação e projetos relacionados
- Canais de comunicação
- Mailing list: mptcp@lists.linux.dev, plain text only
- Archives
- Info
- A inscrição é feita enviando um e-mail em plain text vazio para mptcp+subscribe@lists.linux.dev e respondendo ao e-mail de desafio
- IRC: #mptcp na libera.chat
- Meetings online
- Blog
- Fediverse
- Mailing list: mptcp@lists.linux.dev, plain text only
- Projetos mantidos por membros da comunidade MPTCP
- Projetos que incluem melhorias relacionadas ao MPTCP
- iproute2: para o comando
ip mptcp - Network Manager: inclui recursos de MPTCP a partir da v1.40
- Multipath TCP applications: projeto que coordena atualizações de MPTCP em aplicações TCP populares
- iproute2: para o comando
1 comentários
Opiniões do Hacker News
Já tinha ouvido falar de MPTCP em 2013
Considerando que, na época, apps móveis não eram muito robustos a mudanças de rede, achei que ele seria adotado rapidamente, pois a melhoria de UX seria grande
Mas ele quase não ganhou tração nos últimos 10 anos, e é bem deprimente ver que só agora aparece como uma opção do kernel. Nesse meio-tempo, todo mundo envolveu chamadas HTTP em vários tratadores de retry, e os sistemas operacionais móveis abstraíram tanto a conectividade de rede que a sensação ficou mais próxima de usar zeromq do que TCP
Veja o exemplo em https://blog.apnic.net/2021/12/08/efficient-multipath-transp...
Quando implantamos no FreeBSD sem load balancer, não havia os patches mais recentes; e, mesmo que houvesse, exigiria bastante trabalho para não anunciar IPs de redes privadas como rotas alternativas
No Linux, atrás de um load balancer, era complicado demais enviar o stream para o lugar certo, e o load balancer também não queria fazer isso
Processar dois streams juntos coloca muita complexidade em um caminho de alto throughput, então o risco é grande, e mudanças também exigem reinicialização
Mesmo fazendo tudo isso, o benefício vai principalmente para usuários de iOS, que, para começo de conversa, tendem a usar redes melhores
https://en.wikipedia.org/wiki/Stream_Control_Transmission_Pr...
No fim, para economizar tempo de desenvolvimento, usei o SpeedFusion da PepLink, mas o custo de licença era caro. Espero que no futuro surja uma solução gratuita para usar 2 redes celulares e failover abaixo de 50 ms
UDP multipath + OpenVPN provavelmente também pode ser uma solução prática
Não sei o que é mais triste: o espaço de endereços IPv4 ter apenas 32 bits, ou o TCP usar os endereços IP de origem/destino na tupla da conexão
Se eu tivesse uma máquina do tempo, voltaria até Cerf e Kahn para fazê-los mudar as duas coisas
Você está falando da estrutura que precisa rastrear a conexão por quatro campos: os endereços IP e portas dos dois lados?
É uma pena não haver links para projetos que usam MPTCP, por exemplo projetos derivados do OpenWrt
Durante 2 anos, no GSOC, mentorei um estudante que aplicou patches de MPTCP ao OpenWrt
https://blog.freifunk.net/2017/05/29/gsoc-2017-add-mptcp-sup...
Recentemente comprei um imóvel onde não consigo instalar uma conexão de fibra completa, mas consigo 150–400 Mbps via 5G. Estou pensando em usar 2 links 5G e tunelar o tráfego via MPTCP até um VPS para agregar as conexões
https://github.com/home-assistant/operating-system/pull/3248
http://www.openmptcprouter.com/
Parece que o mais importante seria o suporte em servidores web e dispositivos móveis
Se existe uma rota alternativa transparente, não entendo por que seria necessária uma escolha explícita pela aplicação
Talvez o kernel devesse tratar isso de forma transparente para todas as conexões TCP, para conseguir tomar melhor decisões globais como agregação de rotas ou preferência de links
A implementação antiga de TCP multipath antes do upstream foi pensada para ser totalmente transparente para a aplicação, e acho que isso combina mais com o objetivo do protocolo
Claro que, em muitos casos, o MPTCP pode ser melhor com instruções da aplicação, mas, por exemplo, só uma abordagem padrão do sistema que criasse um subfluxo na conexão LTE para deixar o failover automático pronto, sem enviar dados por esse subfluxo, já teria sido suficiente em 95% dos casos
[1] https://lore.kernel.org/all/alpine.OSX.2.21.1707181728570.11...
Por exemplo, dá para imaginar uma aplicação que, no momento da conexão, compara o IP do cliente com uma whitelist e depois assume que ele não vai mudar
Para mim, o único uso prático do MPTCP é aumentar a velocidade usando a rede móvel e o Wi-Fi juntos. Tanto o iOS quanto o WeChat dão suporte a isso
Mas a rede móvel é cobrada por uso, então deixo sempre desligada. Por isso, pessoalmente, o MPTCP não me serve
É a situação em que o sinal de Wi-Fi ainda aparece, mas a conexão não funciona direito. Com MPTCP, há failover para o celular
Trabalho dando suporte, depurando e corrigindo a stack de rede e drivers do Linux, e me surpreende que isso tenha sido tão pouco adotado
Assim como coisas que tentaram substituir o TCP comum, como o SCTP, o MPTCP parece ter ficado como uma tecnologia de nicho que alguns desenvolvedores de aplicações continuam usando, enquanto o resto do mundo esqueceu
Encontrei um material que explica as diferenças estruturais entre MPTCP e QUIC e também apresenta o protocolo MPQUIC proposto pelos autores
O QUIC multiplexa streams de aplicação sobre um único fluxo UDP, e o MPTCP divide um único stream em vários subfluxos TCP. O MPQUIC combina as duas características, multiplexando streams de aplicação sobre vários subfluxos UDP
[1]: "Multipath QUIC: A Deployable Multipath Transport Protocol" https://www.researchgate.net/publication/327122884_Multipath...
Agora fico curioso para saber como esses protocolos se comparam em ambientes de produção. Alguém já usou os dois?
https://lwn.net/Articles/964377/
Os dois tentam atingir o mesmo objetivo. Tecnicamente, é possível criar comportamentos muito parecidos. O MPTCP é implementado no kernel Linux, enquanto o QUIC fica no espaço de usuário
A Apple também dá suporte e usa no Siri
https://developer.apple.com/documentation/foundation/urlsess...
Em 2011, fiquei surpreso ao ver nosso app de VoIP funcionando de forma bem robusta :D
Se qualquer equipamento intermediário não der suporte, o fato de o pacote SYN+ACK retornado não ter a opção MPTCP no campo de opções TCP parece bastante limitante
O único requisito para os equipamentos intermediários é simplesmente repassar a opção MPTCP sem alterações?
A ideia era que ele passasse corretamente ou caísse com segurança para TCP de caminho único
Em geral, se o equipamento intermediário deixa passar opções desconhecidas sem modificá-las e não exige que o espaço de sequência TCP que ele enxerga seja contínuo, o MPTCP consegue passar por ele e funcionar
Se tiver interesse, há dois artigos relacionados
[1] https://www.usenix.org/conference/nsdi12/technical-sessions/...
[2] https://www.researchgate.net/publication/229002024_Is_it_sti...
Pode ajudar em configurações de segurança e privacidade
Por exemplo, pensando no Great Firewall da China, se for possível dividir o tráfego por vários canais de uplink, isso não dificultaria para o firewall remontá-lo e aplicar as regras?