Warum werden TCP / IP-Sockets als "offene Dateien" betrachtet?

29

Ich brauche Unterstützung, um zu verstehen, was meines Erachtens ein grundlegendes Konzept in Linux ist: das Limit für offene Dateien. Insbesondere bin ich verwirrt darüber, warum offene Sockets zur Gesamtzahl der "offenen Dateien" auf einem System zählen können.

Kann jemand bitte den Grund erläutern, warum? Ich verstehe, dass dies wahrscheinlich auf das gesamte Prinzip "Alles ist eine Datei" in Linux zurückgeht, aber jedes weitere Detail wäre willkommen.

Mike B
quelle

Antworten:

34

Das Limit für "offene Dateien" gilt nicht nur für Dateien. Die Anzahl der Kernel-Handles, die ein einzelner Prozess gleichzeitig verwenden kann, ist begrenzt. In der Vergangenheit war das einzige, was Programme normalerweise häufig öffnen, das Öffnen von Dateien. Daher wurde dies als Begrenzung der Anzahl der geöffneten Dateien bekannt. Es gibt eine Grenze, die verhindert, dass Prozesse beispielsweise viele Dateien öffnen und versehentlich vergessen, diese zu schließen, was schließlich zu systemweiten Problemen führen kann.

Eine Socket-Verbindung ist auch ein Kernel-Handle. Aus den gleichen Gründen gelten die gleichen Grenzwerte. Es ist möglich, dass ein Prozess Netzwerkverbindungen öffnet und vergisst, diese zu schließen.

Wie in den Kommentaren erwähnt, werden Kernel-Handles in Unix-ähnlichen Systemen traditionell als Dateideskriptoren bezeichnet.

Greg Hewgill
quelle
23
"Kernel-Handles" ist eine Windows-Terminologie. Sie beziehen sich lieber auf "Dateideskriptoren", wie diese Entitäten im Allgemeinen unter Unix und Linux genannt werden.
Juli
11
Diese Antwort sichert zu viel ab. Sockets sind Dateien. Sie bieten Zugriff auf Byteströme über die Schnittstelle read/ write, die das Herzstück dessen ist, was es bedeutet, eine Datei zu sein.
4
@ WumpusQ.Wumbley, aber dann hast du den shutdown(2)Syscall drauf, aber nicht auf Dateien, und du kannst nicht mit einem Socket lesen cat- das ist der Grund, warum netcatdas erstellt wurde. Ich würde sagen, dass sich (glücklicherweise) Sockets in Unix-ähnlichen Kerneln wie Dateien in Bezug auf E / A verhalten, aber die Ähnlichkeit endet genau dort. (Ganz ehrlich, ich würde auch gerne von jemandem mit Plan 9-Erfahrung hören, da ich gehört habe, dass sie diese Dinge weiter vereinheitlichen als herkömmliche Unices).
Kostix
@MikeB, dieses Buch soll Sie mit den meisten Unix-bezogenen Konzepten vertraut machen . Sehr empfehlenswert.
Kostix
3
Die Idee "Alles ist eine Datei" bedeutet, dass "Datei" ein abstrakter Datentyp mit vielen Untertypen ist. Die meisten Subtypen unterstützen zusätzlich zu den grundlegenden Funktionen, die alle Dateien unterstützen, zusätzliche Methoden. Steckdosen haben viele Extras. Geräte sperren und normale Dateien suchen lassen. Verzeichnisse sind wirklich seltsam (Schreiben funktioniert nicht und wenn Lesen funktioniert, ist es nicht nützlich). Das Vorhandensein zusätzlicher Methoden bedeutet nicht, dass diese Dinge nicht Teil der allgemeinen Kategorie von Dingen sind, die wir "Dateien" nennen.
27

Der Grund , warum TCP / IP - Sockets verwenden Filedeskriptoren das heißt, wenn die Sockets - Schnittstelle erste (entworfen und implementiert wurde im Jahr 1983 in BSD Unix, ), die Designer das Gefühl , dass eine Netzwerkverbindung zu einer Datei analog war - man kann read, writeund closebeide , und dass es gut zur Unix-Idee "Alles ist eine Datei" passt.

Andere TCP / IP-Netzwerkstapelimplementierungen waren nicht unbedingt in das Datei-E / A-Subsystem ihres Betriebssystems integriert, beispielsweise MacTCP . Aber weil die BSD-Sockets-Schnittstelle so beliebt war, haben sich auch diese anderen Implementierungen dafür entschieden, die Socket-API mit ihren Unix-ähnlichen Funktionen zu replizieren, sodass Sie "Dateideskriptoren" erhalten, die nur für die TCP / IP-Kommunikation auf Systemen verwendet werden, auf denen dies nicht der Fall war Dateideskriptoren haben.

Der andere Teil Ihrer Frage ist, warum es ein Limit gibt. Dies liegt daran, dass eine Nachschlagetabelle für Dateideskriptoren am schnellsten mit einem Array implementiert werden kann. In der Vergangenheit war das Limit im Kernel fest programmiert.

Hier ist der Code in Unix Release 7 (1979) mit einer fest codierten Beschränkung von 20 Dateideskriptoren pro Prozess:

  • user.h :struct file *u_ofile[NOFILE]
  • param.h :#define NOFILE 20

Zum Vergleich: Linux reserviert dynamisch Speicherplatz für die Dateideskriptortabelle eines Prozesses. Das absolute Limit ist standardmäßig 8192, aber Sie können es auf jeden beliebigen Wert einstellen. Mein System listet 191072 in /proc/sys/fs/file-max.

Obwohl es unter Linux kein absolutes Limit mehr gibt, möchten wir Programme nicht verrückt machen, weshalb der Administrator (oder der Distributions-Packager) im Allgemeinen Ressourcenlimits festlegt. Schauen Sie sich das an /etc/security/limits.confoder rennen Sie davon ulimit -n.

Stuart Caie
quelle
Eine der besten Antworten in diesem Thema, danke
user859375
6

Dateien sind nicht nur Dateien auf der Festplatte oder im Speicher. Sie sind Datenströme, von denen dies nur zwei Beispiele sind.

Remote-Endpunkte sind ein drittes Beispiel, mit denen Sie über Sockets interagieren.

Leichtigkeit Rennen mit Monica
quelle
2
Willkommen bei U & L.SE. Ich mag diese Antwort.
Eyoung100