Archiv der Kategorie: Linux

Videostreaming per Multipath TCP

Dieser Artikel sollte mehr als „Proof of Concept“ verstanden werden. Ich bin weder ein Netzwerkspezialist, noch habe ich tiefgreifende Erfahrung mit Linux Kernel kompilieren.

Vorausgesetzt werden mindestens zwei Internetverbindungen, die Multipath TCP Verbindungen zulassen. Bei Internet über Kabel (Kabel Deutschland), hatte ich z.B. Probleme. Telekom sollte hier keine Probleme machen. Schreibt gerne auch, wenn ihr hier Erfahrungen gemacht habt.

Basis System ist Ubuntu 16.04, benötigt werden diese Pakete:

Anschließend holt man sich den Kernel von github:

Konfiguriert ihn mit:

Es sollten folgende Optionen aktiviert sein:

  • Networking support->Networking options->TCP/IP networking->MPTCP protocol (MPTCP)
  • Networking support->Networking options->TCP/IP networking->MPTCP: advanced scheduler control
    (alle aktivieren)
  • Networking support->Networking options->TCP: advanced congestion control->MPTCP Linked Increase
    (default habe ich hier: lia)
  • Networking support->Networking options->IP: advanced router->IP: policy routing (IP_MULTIPLE_TABLES)

Hier ist meine config: https://gist.github.com/jb-alvarado

Zum kompilieren verwende ich dieses Script:

Quelle: https://github.com/multipath-tcp/mptcp-scripts/blob/master/scripts/debian_build/create_kernel.sh

Pfade nach Bedürfnis anpassen.

Nach dem Kompilieren installieren:

und neu starten.

Wenn das System den neuen Kernel nicht als Default einrichtet, muss man das Händisch machen:

die Zeilen zählen beginnend mit 0, bis zum gewünschten Kernel. Ist das ganze in dem „Advanced options“ eingeklammert braucht man folgenden Eintrag in der Datei /etc/default/grub:

GRUB_DEFAULT=“1>ZeilenNummer“
# z.B.
GRUB_DEFAULT=“1>7″

Nach dem Neustart sollte mit uname -a in etwas das raus kommen:

Als nächste kann man die multipath tcp Kernel Einstellungen prüfen:

Das Ergebnis sollte in etwas so sein:

Möchte man den default scheduler wechseln geht das mit:

Bei mir ging roundrobin nur nach diesem Befehl:

Laut Doku wird roundrobin nicht empfohlen.

redundant wird nur empfohlen wenn man sehr niedrige Latencen möchte, und verbrauchte mbit keine Rolle spielen.

Weitere Optimierungen gibt es hier: ConfigureMPTCP

Nun braucht es noch ein Routing:

der Einfachheit halber gehen wir von eth0 und eth1 aus. Dann könnte ein Script dafür in etwa so aussehen:

Ist noch kein schönes Script, besser wären zwei unter /etc/network/if-down.d/ und /etc/network/if-up.d/

Sind die Routen angelegt noch mal prüfen:

Um nun eine Videostream über multipath tcp laufen zu lassen, braucht es auf der Empfängerseite noch einen Kernel der auch multipath tcp versteht. Allerdings reicht es hier die kompilierte Version zu installieren und aktivieren. Alles ander kann gespart werden.

Als Streamingserver bietet sich srs an.

Streamen könnte man dann in etwa so:

Anschauen würde so gehen:

Achtung: streamt man auf einen Domainnamen, braucht man einen korrekten „Reverse DNS Eintrag“, hat man den nicht besser die IP nehmen.

Prüfen ob über beide Verbindungen Traffic läuft kann man auf der Senderseite mit:

und auf der Empfängerseite mit:

Wird nur über eine IP gesendet, stimmt was nicht, ansonsten hat man es geschafft :).

Wenn wir nun ein Interface blocken, sollte der Stream munter weiter streamen:

Wenn das der Fall ist kann die iptables Regel wieder entfernt werden:

 

Zweite Route über eine andere Internetverbindung anlegen

Hat man zwei Internetverbindungen kann man für bestimmte Subnetze oder einzelne IPs eine andere Route definieren.

Gehen wir davon aus, dass unsere Default Verbindung über Internet1 geht:

Möchten wir eine zweite Route für ein ganzes Subnetz erstellen müsste man den IP Bereich definieren, z.B. 192.168.1.0/24. Brauchen wir die Route nur für eine IP nehmen wir einfach die IP.

Zur Umsetzung muss Anfangs eine Tabelle definiert werden. Das geschieht in der Datei: /etc/iproute2/rt_tables

Die erste Spalte steht für die ID und die zweite für die Tabelle. Wir brauchen später die ID. (Im Prinzip würde auch ein Tabelle reichen.)

Nun füllen wir unsere Tabelle mit der IP die wir umleiten wollen:

Dann definieren wir über welches Interface die IP kommunizieren soll:

Und zum Schluss legen wir einen neuen Default Gateway für die Tabelle fest:

Das Gateway ist in den meisten Fällen das Modem. Möchte man das Default Gateway für alle Verbindungen abfrage kann man das mit: ip route

Und das neue Gateway der Tabelle 2 lässt sich so prüfen: ip route list table 2

Nun sollte die neue Route stehen und Traffic von der IP 192.168.0.128 wird nun über Telekom geleitet.

Möchte man die Regel später wieder löschen (ein Neustart würde sie auch zurücksetzen) nimmt man einfach die gleichen Befehle und ersetzt add mit del.