Multipath TCP für Linux (2022)
(mptcp.dev)- MPTCP ist eine auf RFC 8684 basierende TCP-Erweiterung, bei der eine einzelne Verbindung mehrere Netzwerk-Interfaces gleichzeitig nutzen kann, um Bandbreite, Latenz und Ausfallsicherheit zu verbessern
- Durch die parallele Nutzung mehrerer Pfade sind Bandbreitenbündelung, die Bevorzugung von Pfaden mit niedriger Latenz und die erneute Einspeisung über andere Pfade bei Ausfällen möglich
- Unter Linux werden Sockets mit
IPPROTO_MPTCPerstellt und gewöhnliche TCP-Verbindungen als subflow aufgebaut; wenn die Gegenstelle oder zwischengeschaltete Geräte dies nicht unterstützen, erfolgt automatisch ein Fallback auf Single-Path-TCP - Für die Pfadverwaltung gibt es unter Linux mit Stand v5.19 sowohl einen im Kernel integrierten Ansatz als auch einen User-Space-Daemon-Ansatz wie
mptcpd; mit Stand Linux v6.8 gibt es nur einen Paket-Scheduler, der übernet.mptcp-sysctl gesteuert wird - Mit Stand Linux v6.10 umfasst der Funktionsumfang Unterstützung für
socket(), TCP-Fallback, Kernel-/User-Space-Pfadverwaltung, TCP-Socket-Optionen sowie MIB-,ss-Diagnose- und Tracepoint-Debug-Funktionen
Wie MPTCP die TCP-Verbindung verändert
- Multipath TCP (MPTCP) ist eine Erweiterung des Standard-TCP und in RFC 8684 definiert
- Eine einzelne MPTCP-Verbindung kann mehrere Interfaces gleichzeitig verwenden, um TCP-Pakete zu senden und zu empfangen
- Die Bandbreite mehrerer Interfaces kann gebündelt werden, oder es kann bevorzugt das Interface mit der niedrigsten Latenz genutzt werden
- Fällt ein Pfad aus, kann der Traffic nahtlos über einen anderen Pfad erneut eingespeist werden, um ein Failover durchzuführen
- Anders als normales TCP, das jeweils nur einen Pfad verwendet, kann MPTCP mehrere Pfade wie 5G und Wi‑Fi gleichzeitig als subflows nutzen
Typische Einsatzfälle
-
Unterbrechungsfreies Handover
- Es ist möglich, von einem Pfad auf einen anderen umzuschalten, ohne die bestehende Verbindung zu verlieren
- Apple verwendet Multipath TCP seit 2013 auf Smartphones hauptsächlich aus diesem Grund
-
Optimale Netzwerkauswahl
- Unter den verfügbaren Pfaden wird je nach Bedingungen wie Latenz, Verlust, Kosten und Bandbreite der „beste“ Pfad ausgewählt
-
Netzwerkbündelung
- Mehrere Pfade können gleichzeitig genutzt werden, um den Durchsatz zu erhöhen
- Ein Beispiel ist die Kombination aus Festnetz und Mobilfunknetz, um Dateien schneller zu übertragen
Wie unter Linux Verbindungen zustande kommen
- Wenn mit dem Linux-spezifischen Protokoll
IPPROTO_MPTCPein neuer Socket erstellt wird, wird ein subflow oder Pfad erzeugt - Ein subflow ist eine normale TCP-Verbindung, die Daten über ein einzelnes Interface überträgt
- Anschließend können nach einer Aushandlung zwischen den Hosts zusätzliche subflows erzeugt werden
- Im TCP-Optionsfeld des zugrunde liegenden TCP-subflow wurden neue Felder ergänzt, damit der Gegenhost erkennen kann, dass MPTCP verwendet wird
- Zu diesen Feldern gehört unter anderem die Option
MP_CAPABLE, die der Gegenstelle die Verwendung von MPTCP signalisiert
- Zu diesen Feldern gehört unter anderem die Option
- Wenn der Gegenhost oder eine zwischengeschaltete middlebox MPTCP nicht unterstützt, enthält das zurückgegebene
SYN+ACK-Paket im TCP-Optionsfeld keine MPTCP-Option- In diesem Fall wird die Verbindung auf normales TCP zurückgestuft und als Single-Path-Verbindung fortgesetzt
Path Manager und Packet Scheduler
- Intern trennt MPTCP die Aufgaben zur subflow-Erzeugung, Adressankündigung und Auswahl des Übertragungspfads zwischen Path Manager und Packet Scheduler
-
Path Manager
- Der Path Manager verwaltet subflows von der Erstellung bis zur Löschung und übernimmt auch die Adressankündigung
- In der Regel initiiert die Client-Seite die subflows, während die Server-Seite zusätzliche Adressen über die Optionen
ADD_ADDRundREMOVE_ADDRankündigt - Mit Stand Linux v5.19 werden zwei Path Manager über den sysctl-Knopf
net.mptcp.pm_typegesteuert- Typ
0: ein im Kernel integrierter Ansatz, der auf alle Verbindungen dieselben Regeln anwendet. Er ist mitip mptcpverbunden - Typ
1: ein User-Space-Ansatz, der von einem Daemon wiemptcpdgesteuert wird und pro Verbindung unterschiedliche Regeln anwenden kann
- Typ
-
Packet Scheduler
- Der Packet Scheduler wählt den subflow aus, der für das Senden des nächsten Datenpakets verwendet wird
- Er kann die verfügbare Bandbreite maximieren, nur Pfade mit geringerer Latenz auswählen oder andere konfigurierte Richtlinien anwenden
- Mit Stand Linux v6.8 gibt es nur einen Packet Scheduler, der über den sysctl-Knopf von
net.mptcpgesteuert wird
Funktionen mit Stand Linux v6.10
- Mit Stand Linux v6.10 bietet MPTCP die folgenden Funktionen
- Unterstützung des Protokolls
IPPROTO_MPTCPim Systemaufrufsocket() - Fallback von MPTCP auf TCP, wenn die Gegenstelle oder eine middlebox MPTCP nicht unterstützt
- Pfadverwaltung mit einem im Kernel integrierten oder einem User-Space-Path-Manager
- Üblicherweise verwendete Socket-Optionen für TCP-Sockets
- Debug-Funktionen einschließlich MIB-Zählern, diag-Unterstützung für den Befehl
ssund Tracepoints
- Unterstützung des Protokolls
- Detaillierte Änderungen finden sich im ChangeLog
Kommunikation und zugehörige Projekte
- Kommunikationskanäle
- Mailingliste: mptcp@lists.linux.dev, nur Plain Text
- Archives
- Info
- Für ein Abonnement sendet man eine leere Plain-Text-E-Mail an mptcp+subscribe@lists.linux.dev und antwortet anschließend auf die Challenge-E-Mail
- IRC: #mptcp auf libera.chat
- Online-Meetings
- Blog
- Fediverse
- Mailingliste: mptcp@lists.linux.dev, nur Plain Text
- Von Mitgliedern der MPTCP-Community gepflegte Projekte
- Projekte mit MPTCP-bezogenen Verbesserungen
- iproute2: für den Befehl
ip mptcp - Network Manager: enthält MPTCP-Funktionen ab v1.40
- Multipath TCP applications: ein Projekt zur Koordination von MPTCP-Updates für verbreitete TCP-Anwendungen
- iproute2: für den Befehl
1 Kommentare
Meinungen auf Hacker News
Von MPTCP hatte ich schon 2013 gehört
Wenn man bedenkt, dass mobile Apps damals nicht besonders robust gegenüber Netzwerkwechseln waren, dachte ich, die UX-Verbesserung wäre so groß, dass es schnell übernommen würde
Aber in den letzten 10 Jahren hat es kaum Traktion bekommen, und dass erst jetzt eine Kernel-Option auftaucht, ist ziemlich deprimierend. In der Zwischenzeit haben alle ihre HTTP-Aufrufe mit mehreren Retry-Handlern umwickelt, und mobile Betriebssysteme abstrahieren Netzwerkkonnektivität so stark, dass es sich eher anfühlt, als würde man zeromq nutzen statt TCP
Ein Beispiel siehe https://blog.apnic.net/2021/12/08/efficient-multipath-transp...
Als wir es ohne Load Balancer auf FreeBSD ausgerollt haben, fehlten die neuesten Patches; und selbst wenn sie vorhanden gewesen wären, hätte es erheblichen Aufwand bedeutet, private Netzwerk-IPs nicht als alternative Pfade zu annoncieren
Unter Linux hinter einem Load Balancer war es viel zu kompliziert, die Streams an die richtige Stelle zu schicken, und die Load Balancer wollten das auch nicht tun
Zwei Streams gemeinsam zu verarbeiten bringt viel Komplexität in einen High-Throughput-Pfad, was ein großes Risiko ist, und Änderungen erfordern auch einen Neustart
Selbst wenn man all das erledigt, liegt der Nutzen hauptsächlich bei iOS-Nutzern, die ohnehin tendenziell bessere Netze verwenden
https://en.wikipedia.org/wiki/Stream_Control_Transmission_Pr...
Am Ende haben wir PepLinks SpeedFusion genutzt, um Entwicklungszeit zu sparen, aber die Lizenzkosten waren hoch. Ich hoffe, dass es künftig eine kostenlose Lösung für zwei Mobilfunknetze und Failover unter 50 ms geben wird
Multipath-UDP + OpenVPN könnte wahrscheinlich ebenfalls eine praktikable Lösung sein
Ich weiß nicht, was trauriger ist: dass der IPv4-Adressraum nur 32 Bit hat oder dass TCP Quell-/Ziel-IP-Adressen im Verbindungstupel verwendet
Wenn ich eine Zeitmaschine hätte, würde ich zu Cerf und Kahn zurückreisen und sie dazu bringen, beides zu ändern
Meinst du die Struktur, bei der Verbindungen über die IP-Adressen und Ports beider Seiten verfolgt werden, also über vier Felder?
Schade, dass keine Links zu Projekten fehlen, die MPTCP nutzen, etwa zu OpenWrt-Derivaten
Ich habe im Rahmen von GSOC zwei Jahre lang Studenten betreut und MPTCP in OpenWrt gepatcht
https://blog.freifunk.net/2017/05/29/gsoc-2017-add-mptcp-sup...
Ich habe kürzlich eine Immobilie gekauft, an der ich keinen vollständigen Glasfaseranschluss bekomme, aber über 5G 150–400 Mbit/s erreiche. Ich überlege, zwei 5G-Leitungen zu nutzen und den Traffic per MPTCP bis zu einem VPS zu tunneln, um die Leitungen zu bündeln
https://github.com/home-assistant/operating-system/pull/3248
http://www.openmptcprouter.com/
Am wichtigsten scheint mir die Unterstützung auf Webservern und mobilen Geräten zu sein
Wenn es transparente alternative Pfade gibt, verstehe ich nicht, warum die Anwendung explizit dafür optieren muss
Der Kernel sollte das doch transparent für alle TCP-Verbindungen handhaben, damit er globale Entscheidungen wie Pfadaggregation oder Link-Präferenzen besser treffen kann, oder?
Die ältere Multipath-TCP-Implementierung vor dem Upstreaming war als vollständig transparent für Anwendungen gedacht, und das passt meiner Ansicht nach besser zum Zweck des Protokolls
Natürlich kann MPTCP in vielen Fällen besser sein, wenn es Hinweise von der Anwendung bekommt, aber ein Standard-Systemansatz, bei dem man zum Beispiel einen Subflow über LTE aufbaut, um automatisches Failover bereitzuhalten, ohne Daten über diesen Subflow zu senden, hätte in 95 % der Fälle wohl ausgereicht
[1] https://lore.kernel.org/all/alpine.OSX.2.21.1707181728570.11...
Man kann sich zum Beispiel eine Anwendung vorstellen, die beim Verbindungsaufbau die Client-IP gegen eine Whitelist prüft und danach annimmt, dass sie sich nicht mehr ändert
Der einzige praktische Nutzen von MPTCP ist für mich, Mobilfunknetz und Wi‑Fi gemeinsam zu verwenden, um die Geschwindigkeit zu erhöhen. Sowohl iOS als auch WeChat unterstützen das.
Da Mobilfunknetze aber nach Verbrauch abgerechnet werden, lasse ich das immer ausgeschaltet. Für mich persönlich ist MPTCP daher nutzlos.
Das Wi‑Fi-Signal ist noch sichtbar, aber die Verbindung funktioniert nicht richtig. Mit MPTCP erfolgt ein Failover auf Mobilfunk.
Ich arbeite daran, den Linux-Netzwerk-Stack und Treiber zu unterstützen, zu debuggen und zu korrigieren, und es überrascht mich, dass das so wenig verbreitet ist.
Wie bei SCTP und anderen Ansätzen, die normales TCP ersetzen wollten, scheint MPTCP eine Nischentechnologie zu bleiben, die einige Anwendungsentwickler weiter nutzen, während der Rest der Welt sie vergisst.
Ich habe Material gefunden, das die strukturellen Unterschiede zwischen MPTCP und QUIC erklärt und auch das von den Autoren vorgeschlagene MPQUIC-Protokoll vorstellt.
QUIC multiplext Anwendungs-Streams über einen einzelnen UDP-Flow, während MPTCP einen einzelnen Stream auf mehrere TCP-Subflows aufteilt. MPQUIC kombiniert beide Eigenschaften und multiplext Anwendungs-Streams über mehrere UDP-Subflows.
[1]: "Multipath QUIC: A Deployable Multipath Transport Protocol" https://www.researchgate.net/publication/327122884_Multipath...
Jetzt frage ich mich, wie sich diese Protokolle in Produktionsumgebungen vergleichen. Hat jemand beide eingesetzt?
https://lwn.net/Articles/964377/
Beide versuchen, dasselbe Ziel zu erreichen. Technisch lässt sich ein sehr ähnliches Verhalten erzeugen. MPTCP ist im Linux-Kernel implementiert, QUIC liegt eher im Userspace.
Apple unterstützt es ebenfalls und verwendet es für Siri.
https://developer.apple.com/documentation/foundation/urlsess...
2011 war ich überrascht, wie robust unsere VoIP-App lief :D
Dass im zurückkommenden SYN+ACK-Paket das MPTCP-Optionsfeld fehlt, wenn auch nur eine der Middleboxes es nicht unterstützt, klingt ziemlich einschränkend.
Ist die einzige Anforderung an Middleboxes, dass sie die MPTCP-Option unverändert weiterleiten?
Entweder sollte es korrekt durchkommen oder sicher auf Single-Path-TCP zurückfallen.
Im Allgemeinen kann MPTCP durch eine Middlebox hindurch funktionieren, wenn diese unbekannte Optionen unverändert passieren lässt und nicht erzwingt, dass der von ihr gesehene TCP-Sequenzraum kontinuierlich ist.
Falls es dich interessiert: Dazu gibt es zwei relevante Paper.
[1] https://www.usenix.org/conference/nsdi12/technical-sessions/...
[2] https://www.researchgate.net/publication/229002024_Is_it_sti...
Es könnte bei Sicherheits- und Privatsphäre-Einstellungen hilfreich sein.
Denkt man zum Beispiel an die Great Firewall of China: Wenn sich Traffic auf mehrere Uplink-Kanäle aufteilen lässt, würde es für die Firewall dann nicht schwieriger, ihn wieder zusammenzusetzen und Regeln durchzusetzen?