Sockets und Dateideskriptoren

Veröffentlicht am:

Die wichtigsten Befehle zum Merken

  • ss -ltnp — lauschende TCP-Sockets und ihre Prozesse untersuchen.
  • ls -l /proc/PID/fd — offene Dateideskriptoren eines Prozesses untersuchen.

Befehle und Optionen

Diese Befehle kommen im kurzen Beispiel unten vor.

Befehl oder Option Bedeutung
ss -ltnp -l wählt lauschende Sockets, -t TCP, -n numerische Adressen und Ports; -p ergänzt Prozessinformationen, soweit erlaubt.
ls -l "/proc/$$/fd" Die Deskriptoren der aktuellen Shell auflisten. -l zeigt auch die Ziele der nummerierten Links.

$$ ist Bash-Syntax: Es enthält die PID der aktuellen Shell. /proc ist die Live-Sicht von Linux auf Kernel und Prozesse.

Die entscheidenden Konzepte

1. Ein Dateideskriptor ist der Zugriff eines Prozesses auf eine Ressource

Ein Dateideskriptor (FD) ist eine kleine ganze Zahl, mit der ein Prozess auf eine offene Ressource zugreift. Das kann eine reguläre Datei, ein Terminal, eine Pipe oder ein Socket sein.

Deskriptornummern gelten pro Prozess. FD 3 in einem Prozess muss nicht dieselbe Ressource meinen wie FD 3 in einem anderen. Ein Deskriptor ist eine Zugriffskennung, kein Dateiname und keine Netzwerkadresse.

2. Auch Ein- und Ausgabe verwenden Deskriptoren

Die üblichen Anfangsdeskriptoren sind 0: Standardeingabe, 1: Standardausgabe und 2: Standardfehlerausgabe. In einer interaktiven Sitzung zeigen sie häufig auf das Terminalgerät.

Shell-Umleitungen können sie stattdessen mit Dateien oder Pipes verbinden. Mehrere Deskriptoren können dasselbe Ziel haben. Ihre Anzahl entspricht deshalb nicht automatisch der Anzahl unterschiedlicher Dateien.

3. Ein Socket ist ein Endpunkt; ein Port gehört zu seiner Adresse

Ein Socket ist ein Kommunikationsendpunkt des Betriebssystems, auf den über einen Deskriptor zugegriffen wird. TCP-Sockets verwenden lokale und entfernte IP-Adressen samt Ports. Unix-Domain-Sockets ermöglichen lokale Kommunikation ohne TCP- oder UDP-Ports.

Ein lauschender Socket wartet auf Verbindungen. Nimmt ein Server eine TCP-Verbindung an, erhält er einen separaten verbundenen Socket. Der Listener bleibt für neue Clients verfügbar.

Mehrere Verbindungen können denselben Serverport verwenden, weil ihre lokalen und entfernten Adress-/Portkombinationen sie unterscheiden. Eine Portnummer allein identifiziert keine bestimmte Prozessressource.

4. PID, FD und Port identifizieren unterschiedliche Dinge

Die PID identifiziert den Prozess. Der FD identifiziert dessen lokalen Zugriff. Der Port gehört zur Adresse eines Netzwerkendpunkts.

ss kann diese Sichtweisen verbinden: Seine Prozessinformationen können Programmname, PID und fd enthalten. Unter /proc/PID/fd kennzeichnet ein Link wie socket:[Nummer] ein Socket-Objekt. Diese Nummer ist dessen Inode-Kennung, nicht sein Port.

Die Unterscheidung hilft bei belegten Ports und „too many open files“. Ein Prozess kann sein Deskriptorlimit durch nicht geschlossene Dateien oder Verbindungen ausschöpfen. Ein lauschender Socket zeigt außerdem nur, dass etwas lauscht, nicht dass die Anwendung Anfragen korrekt bearbeitet.

Ein kleines Beispiel

Optional: Führe diese Befehle in einem Bash-Terminal unter Linux aus:

ss -ltnp
ls -l "/proc/$$/fd"

Suche in ss nach LISTEN, lokaler Adresse und Port sowie sichtbaren Prozessinformationen. 127.0.0.1 bedeutet IPv4-Loopback; 0.0.0.0 steht für eine Bindung an alle lokalen IPv4-Adressen. Die Bindung allein beweist keine Erreichbarkeit durch Firewalls. Bei Listenern zählt Recv-Q Verbindungen, die auf Annahme warten, und Send-Q zeigt die Backlog-Grenze, keine Anwendungsdaten in Bytes.

Keine Socket-Zeilen sind ein gültiges Ergebnis, wenn keine TCP-Listener existieren. Prozessdetails anderer Benutzer können aufgrund fehlender Berechtigungen verborgen bleiben.

Der zweite Befehl untersucht deine Shell, die möglicherweise keinen Netzwerksocket besitzt. Suche die Einträge 0, 1 und 2 und lies ihre Linkziele. Zusätzliche Deskriptoren können erscheinen. Die Befehle zeigen die Listener des Systems und die Ressourcen eines Prozesses, ohne einen Listener der Shell vorauszusetzen.

Es wird nichts gestartet oder geändert. Aufräumen ist nicht erforderlich.

Merke dir: Der Port gehört zum Netzwerkendpunkt, die PID identifiziert den Prozess und der FD ist dessen Zugriff auf die Ressource.