Zum Hauptinhalt springen

Jeden Host vom Mac, iPhone oder iPad anpingen

Echte ICMP-Echo-Anfragen auf Mac, iPhone und iPad, mit der Latenz, dem Paketverlust und dem Jitter, mit denen Sie wirklich etwas anfangen.

Von Lucas Russo, Entwickler von SSHive · Aktualisiert am

Auch auf iPhone und iPad

Die App für iPhone und iPad gibt es auf Englisch, Französisch und Spanisch, nicht auf Deutsch; die Sprache stellen Sie in den Einstellungen der App ein. Die Mac-App ist auf Deutsch.

Eine Seite braucht acht Sekunden zum Laden, eine SSH-Sitzung friert mitten in einem Befehl ein, ein Videoanruf wird zur Diashow. Bevor Sie irgendetwas anderes anfassen, brauchen Sie zwei Zahlen: wie lange ein Hin- und Rückweg zum Host tatsächlich dauert, und wie viele Sonden nie zurückgekommen sind. Genau das liefert Ping, und es ist immer noch der schnellste Weg, „der Server ist tot“ von „der Weg zum Server ist schlecht“ zu trennen. An diese Zahlen zu kommen ist auf Apple-Hardware schwerer als nötig. macOS lieferte jahrelang das Netzwerkdienstprogramm mit einem Ping-Tab; es wurde in Big Sur als veraltet markiert, funktionierte ab Monterey nicht mehr und ist in aktuellen macOS-Versionen gar nicht mehr vorhanden. Das Terminal gibt es noch, aber es ist ein unbequemer Umweg, wenn Sie ohnehin schon in einem Sitzungsmanager arbeiten. Auf iPhone und iPad gibt es überhaupt nichts zu öffnen: iOS stellt Nutzern keine Shell bereit, ping ist dort also kein Befehl, den Sie ausführen können, sondern eine Fähigkeit, die eine App implementieren muss. SSHive implementiert sie selbst auf jeder Apple-Plattform, für die es erscheint: iPhone, iPad und Mac-App-Store-Version. Alle senden echte ICMP-Echo-Requests (zehn auf dem Mac, zwanzig auf iPhone und iPad) und melden die Laufzeit jeder Antwort, die TTL, mit der sie zurückkam, und wie viele nie zurückkamen. Das gehört ausgesprochen, denn weithin gilt es innerhalb von Apples App Sandbox als unmöglich. Diese Annahme verwechselt zwei verschiedene Dinge. Ein Raw-Socket braucht tatsächlich root, und die Sandbox verweigert ihn. Ein Datagramm-ICMP-Socket (socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)) braucht keines von beidem: Darwin gibt ihn an unprivilegierte Prozesse heraus, und die Sandbox erlaubt ihn. Es ist derselbe Mechanismus, den Apples eigener SimplePing-Beispielcode unter iOS verwendet. SSHive öffnet diesen Socket direkt, weshalb die App-Store-Version in der Sandbox echte Laufzeiten misst und keine Näherung. Eine TCP-Connect-Sonde gegen einen Port Ihrer Wahl bleibt verfügbar, und sie ist das richtige Werkzeug, wenn ICMP durchgehend gefiltert wird. Sie ist eine bewusste Wahl in der Oberfläche, kein stiller Austausch: Die Karte sagt Ihnen, welche Engine die Zahlen erzeugt hat, die Sie gerade lesen. Das Werkzeug ist auf jeder Plattform kostenlos. Keines von SSHives Netzwerkwerkzeugen hängt an einer Pro-Lizenzprüfung, und es gibt weder Werbung noch ein Konto.

Was SSHive dabei leistet

Echtes ICMP auf jeder Apple-Plattform

SSHive sendet ICMP-Echo-Requests (zehn auf dem Mac, zwanzig auf iPhone und iPad) von einem unprivilegierten Datagramm-Socket und gibt jede Antwort aus, sobald sie eintrifft, in der vertrauten BSD-Form: Sequenznummer, TTL und Laufzeit pro Zeile, dann ein Abschlussblock mit Paketverlust und min/avg/max/stddev. Dieselbe Engine läuft in der Mac-App-Store-Version, auf dem iPhone und auf dem iPad, die Zahlen sind also geräteübergreifend vergleichbar. Antworten werden nach vier Kriterien zugeordnet, darunter ein zufälliges Acht-Byte-Cookie in der Nutzlast, denn ein ICMP-Datagramm-Socket empfängt auch Kopien der Antworten anderer Prozesse.

TCP-Connect-Sonden dort, wo ICMP gefiltert wird

Viele Hosts verwerfen ICMP am Netzrand, während sie den Datenverkehr einwandfrei bedienen, und eine Firewall, die Echo Requests schluckt, lässt einen kerngesunden Server tot aussehen. Für solche Fälle kann SSHive eine TCP-Verbindung zu einem Port öffnen, den Sie nennen, und stattdessen den Handshake messen. Die Karte versieht den Lauf mit einem TCP-Abzeichen, damit eine Erreichbarkeitsprüfung nie mit einer Latenzmessung verwechselt wird. Es ist außerdem der automatische Rückfall, wenn das native ICMP-Modul nicht geladen werden kann.

Eine abgelehnte Verbindung zählt weiterhin als erreichbar

Wenn Sie bewusst die TCP-Engine wählen, ist ein Reset ein Lebenszeichen: Der Host hat Ihr SYN erhalten und beantwortet. SSHive zählt eine abgelehnte Verbindung als erfolgreiche Sonde und versieht die Zeile mit dem Hinweis auf einen geschlossenen Port, statt sie als verloren zu markieren. Diese Unterscheidung bewahrt Sie davor, eine Firewall-Regel als Ausfall zu melden, obwohl die Maschine läuft und schlicht nicht auf dem gewählten Port lauscht.

Lesbare Ergebnisse auf iPhone und iPad

Die Ansicht unter iOS und iPadOS ist kein Log-Abwurf. Vier Statistikkarten zeigen gesendet, empfangen, Verlustquote und mittleren RTT; ein Balkendiagramm trägt jede Sonde der Reihe nach ein, Erfolge grün und Fehlschläge rot, sodass ein Verlustschub oder ein steigender Latenztrend auf einen Blick sichtbar ist. Darunter steht jede Sonde, die neueste zuerst, mit Sequenznummer und RTT.

Laufende Messungen, die Sie abbrechen können

Auf dem Desktop trifft die Ausgabe Zeile für Zeile ein, während der Lauf noch läuft, mit einer Plakette „Läuft…“ in der Kartenkopfzeile und automatischem Scrollen im Log-Bereich. Stopp bricht sofort ab, statt die verbleibenden Sonden abzuwarten: praktisch, wenn ein Host in den Timeout läuft und jede Sonde drei Sekunden kostet. Auf iPhone und iPad löscht eine Taste in der Symbolleiste die Ergebnisse des vorherigen Laufs.

Auf jeder Plattform kostenlos

Ping ist nirgends eine Pro-Funktion. Keines der sechs Netzwerkwerkzeuge von SSHive hängt auf Mac, iPhone oder iPad an der Lizenzprüfung: Sie laufen in der kostenlosen Stufe, ohne Werbung und ohne anzulegendes Konto. SSHive Pro ist ein separater Einmalkauf, der die Grenzen der kostenlosen Stufe aufhebt und RDP- und VNC-Sitzungen, Remote-Tunnel, Broadcast und den Rest freischaltet, nicht die Diagnose.

So gehen Sie vor, Schritt für Schritt

  1. 1

    Netzwerkwerkzeuge auf dem Mac öffnen

    Klicken Sie in der macOS-App auf das Netzwerksymbol in der linken Seitenleiste (sein Tooltip lautet Netzwerkwerkzeuge) oder auf die Schaltfläche Netzwerkwerkzeuge im Willkommensbildschirm. Beides öffnet einen eigenen Tab neben Ihren Sitzungen, der das gesamte Diagnose-Panel enthält. Ping ist die erste Karte des Abschnitts Erreichbarkeit, unten im Panel.

  2. 2

    Oder den Werkzeug-Tab auf iPhone und iPad öffnen

    Tippen Sie auf dem iPhone unten in der Tableiste auf Tools (das Netzwerksymbol) und wählen Sie dann Ping, die erste Zeile im Abschnitt Diagnostic. Auf dem iPad öffnen Sie Network tools in der Seitenleiste der geteilten Ansicht und wählen Ping aus derselben Liste. Das Werkzeug verhält sich auf beiden gleich; nur die Navigation ist anders aufgebaut. Die Bezeichnungen stammen aus der englischen Oberfläche der App.

  3. 3

    Den zu prüfenden Host eingeben

    Tippen Sie einen Hostnamen oder eine IP-Adresse in das Feld; der Platzhaltertext schlägt etwa google.com vor. ICMP ist die Vorgabe und braucht keinen Port. Wenn Sie auf die TCP-Engine umstellen, weil der Host ICMP filtert, kommt es auf den Port an: Wählen Sie einen, auf dem der Host voraussichtlich lauscht.

  4. 4

    Den Test starten und live mitlesen

    Drücken Sie auf dem Desktop auf Ping, oder starten Sie den Lauf unter iOS. Das Desktop-Log füllt sich Zeile für Zeile in einem dicktengleichen, automatisch scrollenden Bereich, während in der Kopfzeile eine Plakette „Läuft…“ steht; Stopp bricht auf der Stelle ab. Auf iPhone und iPad aktualisieren sich die vier Statistikkarten und das RTT-Balkendiagramm Sonde für Sonde, während die zwanzig Ergebnisse eintreffen.

  5. 5

    Die Zusammenfassung lesen

    Lesen Sie den abschließenden Statistikblock: gesendete und empfangene Pakete, Verlustquote und Laufzeit min/avg/max/stddev. Auf der TCP-Engine erscheinen dieselben vier Werte, ohne die Standardabweichung. Auf iPhone und iPad stehen sie in den Karten Sent, Received, Loss und Average über der Sondenliste.

Wie Sie ein Ping-Ergebnis lesen, ohne sich zu täuschen

Fangen Sie bei der Streuung an, nicht beim Mittelwert. Ein Lauf mit min/avg/max von 24/26/28 ms beschreibt einen gesunden Pfad. Einer mit 24/58/410 ms hat denselben Boden, staut sich aber irgendwo erheblich, und der Mittelwert verdeckt das. Die Statistikzeile gibt Ihnen eine vierte Zahl, stddev: Das ist Ihr Jitter-Wert. Ein paar Millisekunden sind in Ordnung; eine Standardabweichung, die sich dem Mittelwert nähert oder ihn übersteigt, heißt, dass der Pfad instabil ist, und alles Echtzeitnahe (VoIP, Remote-Desktop, interaktives Tippen über SSH) fühlt sich schlecht an, selbst wenn große Downloads noch normal durchlaufen. Paketverlust braucht Kontext, und die Prozentzahl allein ist fast nutzlos. Sehen Sie sich die icmp_seq-Werte oder die Reihenfolge der Sonden an, um seine Form zu erkennen. Zehn Sonden mit einer einzelnen Lücke irgendwo in der Mitte sind auf dem Papier 10 %, aber meist nur ein ICMP-Paket, das ein Router mit Wichtigerem zu tun nachrangig behandelt hat; TCP überträgt es erneut und Sie merken nichts. Zehn Sonden, bei denen die Nummern 4, 5, 6 und 7 hintereinander verschwinden, sind etwas anderes (ein Link-Flap, eine Umleitung oder ein WLAN-Wechsel) und sie bringen eine interaktive Sitzung sichtbar ins Stocken. Über WLAN und Mobilfunk ist gelegentlicher Einzelverlust normal. Anhaltender Verlust auf einer kabelgebundenen Strecke ist ein Fehler, dem man nachgehen sollte, und ein Traceroute hilft, den Hop zu finden, an dem er beginnt. Lesen Sie auch das Feld ttl. Hosts starten bei 64 (Linux, BSD, macOS), 128 (Windows) oder 255 (viele Netzwerkgeräte), und jeder Router zieht eins ab. Eine Antwort mit ttl=52 kam von etwas, das bei 64 startete und zwölf Hops überquert hat: eine schnelle Plausibilitätsprüfung, ob Sie mit der Maschine sprechen, die Sie meinen, und ein Hinweis darauf, welche OS-Familie geantwortet hat. Die erste Sonde ist oft die langsamste. Schuld sind ARP oder Neighbor Discovery, die DNS-Auflösung und ein kalter Route-Cache, nicht der Server. Beurteilen Sie den Lauf ab der zweiten Sonde. Und lesen Sie 100 % Verlust nicht als „tot“. Viele Hosts, CDNs und Edge-Netze verwerfen ICMP-Echo aus Prinzip. Auf der TCP-Engine ändert sich die Bedeutung zudem vollständig: Sie messen einen Drei-Wege-Handshake zu dem Port, den Sie gewählt haben, jeder Wert trägt also die Kosten des Verbindungsaufbaus zusätzlich zur echten Netzlaufzeit, und ein Host, dessen Firewall diesen Port stillschweigend verwirft, meldet Totalverlust und ist dabei kerngesund. Der Vermerk „Port geschlossen“ ist das gute Ergebnis: Er heißt, dass der Host mit einem Reset geantwortet hat.

Häufige Fragen

Kann man von einem iPhone aus wirklich pingen?+
Ja, mit echtem ICMP. iOS liefert kein Terminal und keinen für Nutzer erreichbaren ping-Befehl, und Network.framework, Apples High-Level-Netzwerk-API, hat überhaupt keinen ICMP-Transport, weshalb viele iOS-Apps stillschweigend einen TCP-Handshake unterschieben. SSHive steigt unter diese API hinab zu einem BSD-Datagramm-Socket, socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP), demselben, den Apples eigenes SimplePing-Beispiel verwendet. Er braucht weder Jailbreak noch ein besonderes Entitlement und sendet echte Echo Requests. Für Hosts, die ICMP filtern, wird weiterhin eine TCP-Sonde angeboten, deutlich als solche gekennzeichnet.
Sendet SSHive echte ICMP-Pakete?+
In jeder Apple-Version: Die Mac-App-Store-Fassung, iPhone und iPad senden alle echte ICMP Echo Requests und lesen die Echo Replies, zehn Sonden auf dem Mac und zwanzig auf iPhone und iPad, mit TTL und Laufzeit je Antwort. Es gibt keine Version zweiter Klasse. Die TCP-Connect-Sonde existiert weiterhin, aber als ausdrückliche Wahl für Hosts, die ICMP filtern, und wenn sie läuft, trägt die Karte ein TCP-Abzeichen, damit eine Erreichbarkeitsprüfung nie mit einer Latenzmessung verwechselt wird.
Eine Seite funktioniert im Browser, aber Ping zeigt 100 % Paketverlust. Warum?+
Zwei häufige Ursachen. Erstens verwerfen viele Hosts, CDNs und Edge-Firewalls ICMP-Echo aus Prinzip: Der Server ist in Ordnung, er beantwortet diesen Sondentyp nur nicht. Genau dann wechseln Sie auf die TCP-Engine und zielen auf einen Port, den der Host wirklich bedient. Zweitens: Wenn Sie schon auf der TCP-Engine sind, prüfen Sie den Port. Ein Host, der nur HTTPS auf 443 bedient, meldet auf Port 80 Totalverlust und ist dabei völlig gesund. Gleichen Sie mit einer DNS-Abfrage ab, dass Sie die Adresse testen, die der Browser tatsächlich erreicht, bevor Sie auf einen Ausfall schließen.
Kann ich Port, Sondenzahl oder Paketgröße ändern?+
Größtenteils geht das nicht. Sie wählen die Engine (ICMP oder TCP) und, auf der TCP-Engine, den Port. Darüber hinaus ist der Lauf fest: zehn Sonden auf dem Mac, zwanzig auf iPhone und iPad, ohne Einstellungen für Paketgröße, Intervall oder Anzahl. IPv6-Ziele werden automatisch behandelt und nicht über einen eigenen Modus. Wenn Sie auf dem Mac beliebige Optionen brauchen, ist das Terminal weiterhin da; SSHives Ping ist auf eine schnelle, ehrliche Antwort gebaut, nicht darauf, jede Option der CLI nachzubilden.
Warum sind SSHives Latenzwerte höher als beim Ping im Terminal?+
Weil Sie auf der TCP-Engine nicht dasselbe messen. Ein ICMP-Echo wird vom Netzwerkstack des Ziels fast sofort beantwortet. Eine TCP-Sonde muss einen Drei-Wege-Handshake abschließen, und das Listener-Backlog des Ziels, der Scheduler des Betriebssystems und jede Middlebox auf dem Weg kommen hinzu. Rechnen Sie damit, dass TCP-Connect-Werte für denselben Host über der entsprechenden ICMP-Laufzeit liegen. Vergleichen Sie einen Host über die Zeit mit sich selbst, statt eine Engine mit der anderen.
Ab wann ist Paketverlust wirklich ein Problem?+
Das Muster zählt mehr als die Prozentzahl. Einzelne, isolierte Verluste über WLAN oder Mobilfunk sind Alltag, und TCP überträgt sie unsichtbar erneut. Mehrere aufeinanderfolgende Verluste deuten auf einen Link-Flap, eine Umleitung oder einen WLAN-Wechsel und bringen interaktive Sitzungen sichtbar ins Stocken. Anhaltender Verlust auf einer kabelgebundenen Strecke ist eine Untersuchung wert. Und Verlust, der nur gegen das Ping-Ziel auftritt, während der Durchsatz anderswo normal bleibt, heißt meist ICMP-Ratenbegrenzung auf diesem Host statt eines echten Netzfehlers.
Ist das Ping-Werkzeug kostenlos oder Teil von Pro?+
Kostenlos, auf jeder Plattform. Keines der sechs Netzwerkwerkzeuge von SSHive (Ping, Traceroute, DNS-Abfrage, Whois, MX-Abfrage und DNSBL-Prüfung) hängt auf Mac, iPhone oder iPad an einer Lizenzprüfung. SSHive Pro ist ein separater Einmalkauf (etwa 14,99 €, als Universal Purchase für Mac, iPhone und iPad, ohne Abo und ohne Konto), der die Grenzen der Gratisversion bei SSH-Sitzungen, Profilen und Tunneln aufhebt und RDP und VNC freischaltet. Die Diagnose läuft in der kostenlosen Stufe, ohne Werbung.

Warum ICMP ein Privileg ist, und was SSHive stattdessen tut

Ping ist nicht eine einzige Sache. Das klassische Werkzeug sendet einen ICMP Echo Request (Typ 8) und wartet auf eine Echo Reply (Typ 0), ordnet beide über Identifier und Sequenznummer einander zu und zieht die Zeitstempel voneinander ab. ICMP hat keine Ports und keine gewöhnlichen Sockets; um eines zu senden, brauchen Sie entweder einen Raw-Socket oder, unter Darwin, einen Datagramm-ICMP-Socket (SOCK_DGRAM mit IPPROTO_ICMP). Historisch hieß das root. Auf modernem macOS ist das setuid-Bit von /sbin/ping verschwunden: Darwin lässt jeden Prozess einen unprivilegierten Datagramm-ICMP-Socket (SOCK_DGRAM mit IPPROTO_ICMP) öffnen, und genau den nutzt das System-Binary ping. /usr/sbin/traceroute dagegen wird weiterhin setuid root installiert. Die verbreitete Meinung lautet, Apples App Sandbox verbiete all das. Tut sie nicht, und die Unterscheidung lohnt sich. Eine Mac-App-Store-Anwendung in der Sandbox hält com.apple.security.network.client, was ausgehendes TCP und UDP erlaubt. Ein Raw-Socket wird tatsächlich verweigert, und das Starten eines setuid-Helfers ebenso. Ein Datagramm-ICMP-Socket ist ein anderes Objekt, und die Sandbox lässt ihn durch. Das wurde gemessen statt vermutet, unter sandbox-exec mit den echten Entitlements der App, und das Ergebnis enthält eine Falle. Mit network.client allein gelingt socket() und gelingt sendto(), aber recvfrom() liefert EPERM. Die Sonde geht hinaus und kommt nie zurück, was genau wie ein Netz aussieht, das ICMP filtert, und sich miserabel debuggen lässt. Für den vollständigen Zyklus werden network.client und network.server gebraucht. SSHive deklariert beide, weshalb sich Ping innerhalb und außerhalb der Sandbox identisch verhält. iOS wirkt strenger und ist es, auf der Ebene, auf der die meisten Apps arbeiten, auch: Network.framework stellt TCP, UDP, QUIC und TLS bereit und hat überhaupt kein ICMP-Transport. Deshalb timen so viele iOS-Apps, die einen „Ping“ bewerben, in Wahrheit stillschweigend einen TCP-Handshake. Aber Network.framework ist nicht der Boden. Die BSD-Socket-Schicht darunter ist weiterhin vorhanden und weiterhin erlaubt, und socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) ist genau das, was Apples eigenes SimplePing-Beispiel öffnet. SSHive öffnet es ebenfalls, mit IPPROTO_ICMPV6 für IPv6-Ziele. Es gibt also ein Verhalten zu lernen, nicht vier. Unter macOS passiert die Arbeit in einem kleinen nativen N-API-Addon, auf iPhone und iPad in einem Swift-Typ, der auf demselben Socket aufsetzt. Beide setzen den Echo Request selbst zusammen, berechnen die ICMP-Prüfsumme und setzen IP_TTL, wenn ein Traceroute es braucht. Beide ordnen Antworten nach vier Kriterien zu (Identifier, Sequenznummer, Quelladresse und ein zufälliges Acht-Byte-Cookie in der Nutzlast), denn ein Datagramm-ICMP-Socket erhält eine Kopie jeder ICMP-Antwort, die die Maschine bekommt, auch der für andere Prozesse bestimmten. Zwei gleichzeitige Läufe gegen verschiedene Hosts verunreinigen einander nicht. Die TCP-Connect-Sonde ist nicht verschwunden; sie wurde auf die Rolle zurückgestuft, die ihr immer zustand. Viele Hosts verwerfen ICMP am Netzrand und bedienen den Verkehr dabei einwandfrei, und für die ist ein Handshake gegen einen von Ihnen genannten Port die ehrliche Messung. Sie wird als bewusste Wahl angeboten, mit einem TCP-Abzeichen gekennzeichnet, und nur dann automatisch verwendet, wenn das native ICMP-Modul sich nicht laden lässt. Ihre Kompromisse bleiben bestehen: Die Latenz enthält die Handshake-Kosten, die Werte liegen also höher als eine echte ICMP-Laufzeit zum selben Host, und ein Host, der ICMP beantwortet, aber Ihren gewählten Port verwirft, liest sich als Totalverlust.

Verwandte Tools