Mosh, ssh done right?

Mosh, so nennt sich ein relativ neues Projekt (so neu, dass es noch nicht einmal einen Wikipedia-Artikel gibt), dass sich vorgenommen hat, SSH von Grund auf zu erneuern. Die Mobile Shell bietet einige spannende Ansätze um auch bei wechselnden Netzwerkverbindungen und hohen Latenzzeiten ein angenehmes arbeiten zu ermöglichen.

Was kann Mosh, was SSH nicht kann? Eine der wichtigsten Vorzügen von Mosh im Vergleich zu SSH ist die Fähigkeit zu roamen also von einer Netzwerkverbindung zu einer anderen zu wechseln, ohne dass die Verbindung unterbrochen wird. Ein Notebook wird in der Arbeit zum Beispiel per LAN mit dem Netzwerk verbunden, während einer Besprechung wechselt man in das firminterne WLAN und während man unterwegs ist nutzt man eventuell eine mobile Datenverbindung mittels 3G oder vielleicht sogar schon LTE. Mit Mosh ist es möglich, zwischen diesen Verbindungen zu wechseln, ohne dass die Sitzung unterbrochen wird und das selbst dann, wenn der Clientcomputer für mehrere Stunden gar keine Verbindung hat. Wie das ganze technisch funktioniert erklärt Entwickler Keith Winstein in einem Vortrag der usenix.

Mosh baut dazu auf einem neuen Protokoll auf, dem so genannten State Synchronisation Protocol, das im Gegensatz zu SSH nicht auf TCP sondern auf UDP beruht. Dadurch funktioniert Mosh auch dann noch, wenn die Verbindung zum Server sehr schlecht ist und viele Pakete verloren gehen. Das Protokoll an sich ist relativ simpel gestrickt und erfordert nur zwei Methoden diff und patch. Der Client fordert vom Server ein Diff von seinem letzten bekannten zum aktuellen Status an und implementiert es mithilfe eines Patch. Durch den Einsatz des neuen Protokolls SSP und UDP als darunterliegendes Netzwerkprotokoll ergeben sich einige Vorteile gegenüber SSH. So funktioniert unter anderem die Tastenkombination Strg+C auch dann noch, wenn große Datenmengen übertragen werden und SSH längst mit übervollen Puffern kämpft.

Ein weiterer grundlegender Unterschied zwischen Mosh und SSH liegt in der Verarbeitung des User Interfaces. Während SSH jeden Tastendruck zuerst zum Server schicken muss und dann auf eine Antwort wartet bis es etwas auf dem Bildschirm schreibt, verwendet Mosh ein so genanntes Predictive Local Echoing um die Reaktionszeit selbst bei hohen Latenzen, wie sie in Mobilen Netzwerken häufig vorkommen (der Autor nennt im Video 5 – 40 Sekunden Round Trip Times im LTE-Netzwerken), zu minimieren. Dazu werden die Tasteneingaben in Gruppen zusammengefasst und Wahrscheinlichkeiten berechnet ob die jeweilige Eingabe direkt wiedergegeben werden soll. Stellt sich heraus das ein Teil der Gruppe sicher local “gechoed” werden soll, wird die gesamte Gruppe angezeigt. Noch nicht vom Server verifizierte Eingaben werden dabei unterstrichen.

Mosh zeigt einen Unterbrechung der Verbindung an und funktioniert anschließend ohne Probleme.

Obwohl Mosh als SSH-Ersatz auftritt, braucht es SSH dennoch zum bootstrapping. Der Mosh-Client baut zuerst eine SSH-Verbindung zum Server auf, authentifiziert sich darüber und startet anschließend den Mosh-Serverprozess. Das hat den Vorteil, das bisher verwendete Authentifizierungsmethoden weiterhin funktionieren und keine zusätzlichen Daemons auf derm Server gestartet werden müssen. Mosh benötigt somit nie root-Rechte und kann sogar von einem einfachen Nutzer in sein Homeverzeichnis installiert werden.

Wer interesse hat und mehr Informationen über Mosh sucht, der sollte sich unbedingt einmal die wirklich tolle Website der Entwickler ansehen (und einen genaueren Blick auf den Screenshot werfen!). Ausprobieren geht auch ganz einfach. Ubuntu hat Mosh ab Version 12.04 im universe-Repository and für ältere Versionen (wie man sie häufig noch auf Servern findet) in den Backports. Auch für Debian Stable gibt es einen Backport und Fedora User finden es ab Version 15 im Repositorium. Arch Linux (durch dessen ausgezeichnetes Wiki ich überhaupt erst auf Mosh gestoßen bin) hat das Programm übrigens ebenfalls in den Paketquellen.

Ob Mosh es tatsächlich schafft ssh komplett zu ersetzen, wage ich momentan noch zu bezweifeln. Es hat einige wirklich interessante Ansätze, manche Teile der Implementierung könnten sich aber auch als hinderlich bei der Verbreitung herausstellen (etwa die vielen Portfreigaben für UDP). Obwohl Mosh in meinen Tests wirklich gut funktioniert hat, gibt es einige Programme die Probleme verursachen. So wird beim Prozessmonitoringtool htop die untere Leiste mit den Tastenkombinationen nicht richtig angezeigt. Alles in allem finde ich die Idee, SSH eine Grunderneuerung zu spendieren aber toll und Funktionen wie Roaming mittlerweile fast unentbehrlich.

  1. Yggdrasil sagt:

    Mosh?
    Screen in der .bashrc eintragen reicht…

    # Start screen, if ssh connection etablished.
    if [ "$TERM" != "screen" ] && [ "$SSH_CONNECTION" != "" ]; then
    #/usr/bin/screen -S sshscreen -d -R && exit
    /usr/bin/screen -S sshscreen -dRR
    fi

    • Higgi sagt:

      Damit hast du aber nur einen Teilaspekt von Mosh abgedeckt, nämlich der Fortsetzung bei Verbindungsabbrüchen. Mosh versucht ja die Reaktionszeit bei hohen Roundtripzeiten zu minimieren. Das kannst du mit deiner “Lösung” nicht. ;)

    • schneida sagt:

      Mhm, eigentlich auch ein cooler Einfall! Zwar nicht ganz so komfortabel wie mosh (man muss sich selbst wieder neu verbinden), aber trotzdem sehr schlau!

    • dakira sagt:

      Äh. Mosh und Screen ergänzen sich. Screen bringt dir quasi nichts, wenn die Internet-Verbindung schrottig ist. Wenn die Internetverbindung abreisst, klappt dir das Terminal zu. Dann musst du dich neu einloggen und den screen re-attachen (oder du machst das automatisch). Das Problem hast du mit Mosh nicht. Da kannst du sogar den Rechner in standby schicken und nach dem Aufwachen steht die Verbimdung noch. Kurz mal das Kabel ziehen ist auch kein Problem. Das Fenster bleibt offen und du bleibst eingeloggt.

      Damit ist Mosh aber kein Screen-Ersatz und will es auch nicht sein. Screen kann ja durchaus ein bisschen mehr (und mosh auch), also ergänzen sie sich super. In einer anderen Antwort schreibe ich gleich mal etwas mehr zu Mosh ;)

  2. claw sagt:

    Hört sich sehr interessant an.
    Danke für die Info!

  3. dakira sagt:

    Hallo, ein schöner und ausführlicher Artikel zu mosh, danke. Ich verstehe nur nicht, was dich zum letzten Absatz verleitet hat. Mosh will SSH überhaupt nicht ersetzen. Wie du ja selber schreibst, nutzt Mosh SSH zur Authentifikation. Das kann SSH sehr gut und es gibt momentan keinen mir bekannten Grund das zu duplizieren. Das schöne ist ja, dass Mosh so trotzdem noch funktioniert, wenn jmd. z.B. PAM-Module wie google-authenticator eingehängt hat.

    Mosh will übrigens auch nicht screen ersetzen. Screen macht ja im Wesentlichen zwei Dinge. Es erlaubt einem a) eine Sitzung mit mehreren virtuellen terminals zu starten und b) diese zu einem späteren Zeitpunkt wieder aufzurufen.

    Was Mosh tatsächlich ersetzt ist die Terminal Emulation. Darauf wird ja auf der Homepage genügend eingegangen (Stichwort: UTF-8-Probleme).

    • schneida sagt:

      Danke, freut mich, dass dir der Artikel gefällt.

      Ich zitiere mal den zweiten Absatz der Entwickler:

      Mosh is a replacement for SSH.

      Du hast natürlich recht das Mosh momentan auf SSH aufbaut (steht ja auch oben), aber ob sie planen, dass das immer so bleibt wenn sie ganz offensichtlich schreiben, dass Mosh SSH ersetze…?

  1. Es gibt noch keine Trackbacks für diesen Post!

Kommentar hinterlassen