GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum sind Netzwerkschnittstellen nicht wie andere Geräte in /dev?

Ich bin vor allem neugierig, aber warum sind Netzwerkschnittstellen nicht in /dev?
Gibt es andere Arten von Geräten, die nicht als Knoten unter /dev dargestellt werden?

Akzeptierte Antwort:

Bei vielen Geräten besteht die Hauptoperation darin, Bytes vom Computer an ein Peripheriegerät zu senden oder Bytes von einem Peripheriegerät auf dem Computer zu empfangen. Solche Geräte ähneln Pipes und funktionieren gut als Zeichengeräte. Für Vorgänge, bei denen es sich nicht um Lesen und Schreiben handelt (z. B. Flusskontrolle auf einer seriellen Leitung), bietet das Gerät Ad-hoc-Befehle namens ioctl.

Einige Geräte ähneln sehr normalen Dateien:Sie bestehen aus einer endlichen Anzahl von Bytes, und was Sie an einer bestimmten Position schreiben, kann später an derselben Position gelesen werden. Diese Geräte werden als Blockgeräte bezeichnet.

Netzwerkschnittstellen sind komplexer:Was sie lesen und schreiben, sind keine Bytes, sondern Pakete. Dabei wäre es immer noch möglich, die gewohnte Schnittstelle mit read zu verwenden und write , wäre es umständlich:vermutlich jeder Aufruf von write würde ein Paket senden und bei jedem Aufruf read würde ein Paket erhalten (und wenn der Puffer zu klein für das Paket ist, würde das Paket verloren gehen).

Netzwerkschnittstellen könnten als Geräte existieren, die nur ioctl bereitstellen . Tatsächlich tun dies einige Unix-Varianten, aber nicht Linux. Dieser Ansatz hat einige Vorteile; Beispielsweise könnten Netzwerkschnittstellen unter Linux udev nutzen. Aber die Vorteile sind begrenzt, weshalb es nicht getan wurde.

Die meisten netzwerkbezogenen Anwendungen kümmern sich nicht um einzelne Netzwerkschnittstellen, sie arbeiten auf einer höheren Ebene. Beispielsweise möchte ein Webbrowser TCP-Verbindungen herstellen und ein Webserver möchte auf TCP-Verbindungen lauschen. Zu diesem Zweck wären Vorrichtungen für High-Level-Netzwerkprotokolle nützlich, z. B.

{ echo $'GET http://www.google.com/ HTTP/1.0r';
  echo $'Host: www.google.comr';
  echo $'r' >&0; cat; } <>/dev/tcp/www.google.com/80

Tatsächlich bieten ksh und bash eine solche Schnittstelle für TCP- und UDP-Clients. Im Allgemeinen sind Netzwerkanwendungen jedoch komplexer als Anwendungen für den Dateizugriff. Während die meisten Datenaustausche mit Aufrufen analog zu read durchgeführt werden und write , erfordert der Verbindungsaufbau mehr Informationen als nur einen Dateinamen. Beispielsweise umfasst das Abhören von TCP-Verbindungen zwei Schritte:einen, der ausgeführt wird, wenn der Server mit dem Abhören beginnt, und einen, der jedes Mal ausgeführt wird, wenn ein Client eine Verbindung herstellt. Solche zusätzlichen Schritte passen nicht gut in die Datei-API, was der Hauptgrund dafür ist, dass das Netzwerk über eine eigene API verfügt.

Verwandte:AC-Kopplungskondensatoren für Hochgeschwindigkeits-Differentialschnittstellen?

Eine weitere Geräteklasse, die normalerweise keine Einträge in /dev hat unter Linux (aber bei einigen anderen Unix-Varianten) sind Videoadapter. Im Prinzip könnten einfache Videoadapter als Framebuffer-Geräte verfügbar gemacht werden, bei denen es sich um Blockgeräte handeln könnte, die aus Blöcken bestehen, die die Farbe jedes Pixels darstellen. Beschleunigte Videoadapter könnten als Zeichengeräte dargestellt werden, an die Anwendungen Befehle senden. Hier besteht der Nachteil der Geräteschnittstelle darin, dass sie langsam ist:Die anzeigende Anwendung (in der Praxis ein X-Server) müsste immer Kernel-Aufrufe durchführen, wenn etwas angezeigt wird. Was stattdessen passiert, ist, dass der X-Server meistens direkt in den Speicher der Grafikkarte schreibt, weil er schneller ist.


Linux
  1. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

  2. Linux – Warum sind „/dev/ptmx“ und „/dev/pts/ptmx“ keine Gerätedateien?

  3. Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

  4. Warum funktioniert find -exec mv {} ./target/ + nicht?

  5. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

Wann sollte /dev/random vs. /dev/urandom verwendet werden?

Linux – Warum lässt mich Linux nicht mit /dev/dsp spielen?

Was sind /dev/zero- und /dev/null-Dateien in Linux

Warum gibt es unter Linux so viele /dev/tty?

Warum wird der Inhalt von /dev/shm/ automatisch entfernt