Multipath TCP para Linux (2022)
(mptcp.dev)- MPTCP es una extensión de TCP basada en RFC 8684, que permite que una sola conexión use simultáneamente varias interfaces de red para mejorar el ancho de banda, la latencia y la respuesta ante fallas
- Como usa varias rutas en paralelo, permite agregación de ancho de banda, preferir rutas de baja latencia y reinyectar tráfico por otra ruta cuando una falla
- En Linux, se crea un socket con
IPPROTO_MPTCPy se configuran subflows, que son conexiones TCP normales; si el otro extremo o algún equipo intermedio no lo soporta, se degrada automáticamente a TCP de ruta única - Para la gestión de rutas, en Linux v5.19 existen el modo integrado en el kernel y el modo con un demonio de espacio de usuario como
mptcpd; en Linux v6.8 solo hay un planificador de paquetes, controlado mediante sysctl ennet.mptcp - En Linux v6.10, las funciones incluyen soporte de
socket(), degradación a TCP, gestión de rutas en kernel/espacio de usuario, opciones de socket TCP, contadores MIB, diagnósticos conssy depuración con tracepoints
Cómo MPTCP cambia la forma de las conexiones TCP
- Multipath TCP(MPTCP) es una extensión del TCP estándar, definida en RFC 8684
- Una sola conexión MPTCP puede enviar y recibir paquetes TCP usando varias interfaces al mismo tiempo
- Puede agregar el ancho de banda de varias interfaces o priorizar la interfaz con menor latencia
- Si una ruta se cae, reinyecta el tráfico de forma fluida por otra ruta para realizar una conmutación por falla
- A diferencia del TCP común, que usa una sola ruta a la vez, MPTCP puede usar varias rutas, como 5G y Wi‑Fi, en conjunto como subflows
Casos de uso representativos
-
Handover sin interrupciones
- Permite cambiar de una ruta a otra manteniendo la conexión existente
- Apple usa Multipath TCP en smartphones desde 2013 principalmente por este motivo
-
Selección de la red óptima
- Elige la “mejor” ruta entre las disponibles según condiciones como latencia, pérdida, costo y ancho de banda
-
Agregación de redes
- Permite aumentar el throughput usando varias rutas al mismo tiempo
- Un ejemplo es combinar una red fija con una red móvil para transferir archivos más rápido
Cómo se establece una conexión en Linux
- Al crear un nuevo socket con el protocolo exclusivo de Linux
IPPROTO_MPTCP, se genera un subflow o path - Un subflow es una conexión TCP normal que transmite datos a través de una interfaz
- Luego, mediante negociación entre hosts, se pueden crear subflows adicionales
- En el campo de opciones TCP del subflow TCP subyacente se agregan nuevos campos para que el host remoto pueda detectar el uso de MPTCP
- Este campo incluye, entre otras, la opción
MP_CAPABLE, que informa al otro extremo que se usará MPTCP
- Este campo incluye, entre otras, la opción
- Si el host remoto o un middlebox intermedio no soporta MPTCP, el campo de opciones TCP del paquete
SYN+ACKdevuelto no incluye opciones MPTCP- En ese caso, la conexión se degrada a TCP normal y continúa por una sola ruta
Gestor de rutas y planificador de paquetes
- Internamente, MPTCP divide el trabajo entre un Path Manager y un Packet Scheduler, que se encargan de crear subflows, anunciar direcciones y elegir la ruta de transmisión
-
Path Manager
- El Path Manager gestiona los subflows desde su creación hasta su eliminación, y también se encarga de anunciar direcciones
- Por lo general, el lado cliente inicia los subflows, y el lado servidor anuncia direcciones adicionales mediante las opciones
ADD_ADDRyREMOVE_ADDR - En Linux v5.19, dos path managers se controlan mediante el knob sysctl
net.mptcp.pm_type- type
0: modo integrado en el kernel; aplica las mismas reglas a todas las conexiones. Está relacionado conip mptcp - type
1: modo de espacio de usuario; lo controla un demonio comomptcpdy puede aplicar reglas distintas por conexión
- type
-
Packet Scheduler
- El Packet Scheduler selecciona el subflow que se usará para enviar el siguiente paquete de datos
- Puede maximizar el ancho de banda disponible, elegir solo rutas con menor latencia o aplicar otras políticas según la configuración
- En Linux v6.8 solo hay un planificador de paquetes, controlado mediante knobs sysctl de
net.mptcp
Funciones en Linux v6.10
- En Linux v6.10, MPTCP ofrece las siguientes funciones
- Soporte del protocolo
IPPROTO_MPTCPen la llamada al sistemasocket() - Degradación de MPTCP a TCP cuando el otro extremo o un middlebox no soporta MPTCP
- Gestión de rutas con un path manager integrado en el kernel o de espacio de usuario
- Opciones de socket usadas comúnmente en sockets TCP
- Contadores MIB, soporte de diag usado por el comando
ssy funciones de depuración que incluyen tracepoints
- Soporte del protocolo
- Los cambios detallados se pueden consultar en el ChangeLog
Comunicación y proyectos relacionados
- Canales de comunicación
- Lista de correo: mptcp@lists.linux.dev, solo texto plano
- Archivos
- Información
- Para suscribirse, hay que enviar un correo vacío en texto plano a mptcp+subscribe@lists.linux.dev y responder el correo de desafío
- IRC: #mptcp en libera.chat
- Reuniones en línea
- Blog
- Fediverse
- Lista de correo: mptcp@lists.linux.dev, solo texto plano
- Proyectos mantenidos por integrantes de la comunidad MPTCP
- Proyectos que incluyen mejoras relacionadas con MPTCP
- iproute2: para el comando
ip mptcp - Network Manager: incluye funciones de MPTCP desde v1.40
- Aplicaciones Multipath TCP: proyecto que coordina actualizaciones MPTCP para aplicaciones TCP populares
- iproute2: para el comando
1 comentarios
Opiniones de Hacker News
Ya había oído hablar de MPTCP en 2013
Considerando que en ese entonces las apps móviles no eran muy resistentes a los cambios de red, pensé que se adoptaría rápido porque la mejora de UX era grande
Pero en los últimos 10 años casi no ganó traction, y es bastante deprimente que recién ahora aparezca como opción del kernel. Mientras tanto, todos envolvieron las llamadas HTTP con varios manejadores de reintentos, y los sistemas operativos móviles abstrajeron tanto la conectividad de red que se siente más cercano a usar zeromq que TCP
Para un ejemplo, ver https://blog.apnic.net/2021/12/08/efficient-multipath-transp...
Cuando lo desplegamos en FreeBSD sin balanceador de carga, no tenía los parches más recientes; e incluso si los hubiera tenido, habría requerido bastante trabajo evitar que anunciara IPs de redes privadas como rutas alternativas
En Linux, cuando estaba detrás de un balanceador de carga, enviar el stream al lugar correcto era demasiado complejo, y el balanceador tampoco quería hacerlo
Procesar dos streams juntos implica meter mucha complejidad en la ruta de alto rendimiento, así que es muy riesgoso, y para cambiarlo también hace falta reiniciar
Incluso haciendo todo eso, el beneficio va principalmente a usuarios de iOS, que para empezar suelen usar mejores redes
https://en.wikipedia.org/wiki/Stream_Control_Transmission_Pr...
Al final usamos SpeedFusion de PepLink para ahorrar tiempo de desarrollo, pero el costo de licencia era alto. Espero que en el futuro aparezca una solución gratuita para usar 2 redes celulares y tener conmutación por error de menos de 50 ms
UDP multipath + OpenVPN probablemente también podría ser una solución práctica
No sé qué es más triste: que el espacio de direcciones IPv4 tenga solo 32 bits, o que TCP use las direcciones IP de origen/destino en la tupla de conexión
Si tuviera una máquina del tiempo, volvería con Cerf y Kahn para que cambiaran ambas cosas
¿Te refieres a la estructura en la que hay que rastrear una conexión con las direcciones IP y puertos de ambos lados, es decir, 4 campos?
Es una lástima que no haya enlaces a proyectos que usen MPTCP, por ejemplo algún proyecto derivado de OpenWrt
Durante 2 años en GSOC mentoreé a un estudiante que parcheó OpenWrt con MPTCP
https://blog.freifunk.net/2017/05/29/gsoc-2017-add-mptcp-sup...
Hace poco compré una propiedad donde no puedo contratar una línea completa de fibra, pero con 5G obtengo entre 150 y 400 Mbps. Estoy pensando en usar 2 líneas 5G y tunelizar el tráfico con MPTCP hasta un VPS para agrupar las conexiones
https://github.com/home-assistant/operating-system/pull/3248
http://www.openmptcprouter.com/
Me parece que lo más importante sería que lo soporten los servidores web y los dispositivos móviles
Si existe una ruta alternativa transparente, no entiendo por qué hace falta que la aplicación lo elija explícitamente
¿No podría el kernel manejarlo de forma transparente para todas las conexiones TCP, y así tomar mejores decisiones globales como agregación de rutas o preferencia de enlaces?
La vieja implementación de Multipath TCP anterior a upstream estaba pensada para ser completamente transparente para las aplicaciones, y creo que eso encaja mejor con el propósito del protocolo
Claro que en muchos casos MPTCP puede funcionar mejor si recibe instrucciones de la aplicación, pero por ejemplo, con solo tener un enfoque estándar del sistema que cree un subflujo sobre la conexión LTE para tener lista la conmutación por error automática, pero sin enviar datos por ese subflujo, habría sido suficiente en el 95% de los casos
[1] https://lore.kernel.org/all/alpine.OSX.2.21.1707181728570.11...
Por ejemplo, se puede imaginar una aplicación que al momento de conectar compara la IP del cliente con una lista blanca y luego asume que no cambiará
Para mí, el único uso práctico de MPTCP es aumentar la velocidad usando la red móvil y Wi‑Fi juntos. Tanto iOS como WeChat lo soportan.
Pero como la red móvil se cobra por consumo, siempre la tengo apagada. Así que, personalmente, MPTCP no me sirve.
Es la situación en la que la señal Wi‑Fi todavía aparece, pero no hay una conexión adecuada. Con MPTCP, se hace failover a la red celular.
Trabajo dando soporte, depurando y corrigiendo el stack de red y los drivers de Linux, y me sorprende que esto haya tenido tan poca adopción.
Al igual que otras cosas que intentaron reemplazar al TCP común, como SCTP, parece que MPTCP se queda como una tecnología de nicho que algunos desarrolladores de aplicaciones siguen usando, mientras el resto del mundo la olvida.
Encontré un material que explica las diferencias estructurales entre MPTCP y QUIC, y también presenta el protocolo MPQUIC propuesto por los autores.
QUIC multiplexa streams de aplicación sobre un único flujo UDP, mientras que MPTCP divide un único stream en varios subflujos TCP. MPQUIC combina ambas características y multiplexa streams de aplicación sobre varios subflujos UDP.
[1]: "Multipath QUIC: A Deployable Multipath Transport Protocol" https://www.researchgate.net/publication/327122884_Multipath...
Ahora me da curiosidad cómo se comparan estos protocolos en entornos de producción. ¿Alguien ha usado ambos?
https://lwn.net/Articles/964377/
Ambos intentan lograr el mismo objetivo. Técnicamente, se puede crear un comportamiento muy similar. MPTCP está implementado en el kernel de Linux, mientras que QUIC está del lado del espacio de usuario.
Apple también lo soporta y lo usa en Siri.
https://developer.apple.com/documentation/foundation/urlsess...
En 2011 me sorprendió ver que nuestra app de VoIP funcionaba de forma bastante robusta :D
Suena bastante limitante que, si cualquiera de los equipos intermedios no lo soporta, el paquete SYN+ACK devuelto no tenga la opción MPTCP en el campo de opciones TCP.
¿El único requisito para los equipos intermedios es pasar la opción MPTCP tal cual?
Se buscó que pasara correctamente o que hiciera fallback de forma segura a TCP de una sola ruta.
En general, si un equipo intermedio deja pasar opciones desconocidas sin modificarlas y no exige que el espacio de secuencia TCP que ve sea continuo, MPTCP puede funcionar atravesando ese equipo.
Si te interesa, hay dos papers relacionados.
[1] https://www.usenix.org/conference/nsdi12/technical-sessions/...
[2] https://www.researchgate.net/publication/229002024_Is_it_sti...
Puede ayudar en configuraciones de seguridad y privacidad.
Por ejemplo, pensando en el Great Firewall de China, si se puede dividir el tráfico entre varios canales de uplink, ¿no se le haría más difícil al firewall reensamblarlo y aplicar sus reglas?