GNU/Linux >> Linux Esercitazione >  >> Linux

Perché le interfacce di rete non sono in /dev come altri dispositivi?

Sono principalmente curioso, ma perché le interfacce di rete non sono in /dev?
Ci sono altri tipi di dispositivi che non sono rappresentati come nodi in /dev?

Risposta accettata:

Su molti dispositivi, le operazioni principali sono l'invio di byte dal computer a una periferica o la ricezione di byte da una periferica del computer. Tali dispositivi sono simili alle pipe e funzionano bene come dispositivi dei personaggi. Per le operazioni che non sono lettura e scrittura (come il controllo del flusso su una linea seriale), il dispositivo fornisce comandi ad hoc chiamati ioctl.

Alcuni dispositivi sono molto simili ai normali file:sono costituiti da un numero finito di byte e ciò che scrivi in ​​una determinata posizione può essere letto in seguito dalla stessa posizione. Questi dispositivi sono chiamati dispositivi a blocchi.

Le interfacce di rete sono più complesse:ciò che leggono e scrivono non sono byte ma pacchetti. Mentre sarebbe ancora possibile utilizzare la solita interfaccia con read e write , sarebbe imbarazzante:presumibilmente ogni chiamata a write invierebbe un pacchetto e ogni chiamata a read riceverebbe un pacchetto (e se il buffer è troppo piccolo per contenere il pacchetto, il pacchetto andrebbe perso).

Le interfacce di rete potrebbero esistere come dispositivi che forniscono solo ioctl . In effetti, questo è ciò che fanno alcune varianti di Unix, ma non Linux. C'è qualche vantaggio in questo approccio; ad esempio, su Linux, le interfacce di rete potrebbero sfruttare udev. Ma i vantaggi sono limitati, motivo per cui non è stato fatto.

La maggior parte delle applicazioni relative alla rete non si preoccupano delle singole interfacce di rete, funzionano a un livello superiore. Ad esempio, un browser Web desidera effettuare connessioni TCP e un server Web desidera ascoltare le connessioni TCP. A questo scopo, sarebbero utili dispositivi per protocolli di rete di alto livello, ad es.

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

Infatti ksh e bash forniscono tale interfaccia per i client TCP e UDP. In generale, tuttavia, le applicazioni di rete sono più complesse delle applicazioni di accesso ai file. Sebbene la maggior parte degli scambi di dati siano condotti con chiamate analoghe a read e write , per stabilire la connessione sono necessarie più informazioni rispetto al semplice nome di un file. Ad esempio, l'ascolto delle connessioni TCP richiede due passaggi:uno da eseguire quando il server inizia l'ascolto e uno da eseguire ogni volta che un client si connette. Tali passaggi aggiuntivi non si adattano bene all'API dei file, motivo principale per cui la rete ha una propria API.

Correlati:condensatori di accoppiamento CA per interfacce differenziali ad alta velocità?

Un'altra classe di dispositivi che in genere non ha voci in /dev su Linux (ma su alcune altre varianti di Unix) ci sono adattatori video. In linea di principio, semplici adattatori video potrebbero essere esposti come dispositivi framebuffer, che potrebbero essere dispositivi a blocchi costituiti da blocchi che rappresentano il colore di ciascun pixel. Le schede video accelerate possono essere rappresentate come dispositivi a caratteri su cui le applicazioni inviano comandi. Qui, lo svantaggio dell'interfaccia del dispositivo è che è lenta:l'applicazione di visualizzazione (in pratica, un server X) dovrebbe effettuare chiamate al kernel ogni volta che visualizza qualcosa. Quello che succede invece è che il server X scrive principalmente direttamente nella memoria della scheda video, perché è più veloce.


Linux
  1. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  2. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0?

  3. Quanto sono portatili /dev/stdin, /dev/stdout e /dev/stderr?

  4. Cosa sono i file /dev/zero e /dev/null in Linux

  5. Perché i contenuti di /dev/shm/ vengono rimossi automaticamente

Come codificare in base64 /dev/random o /dev/urandom?

Perché find -exec mv {} ./target/ + non funziona?

Quando dovrei usare /dev/shm/ e quando dovrei usare /tmp/?

Perché ci sono così tanti /dev/tty in Linux?

Linux:differenza tra /dev/console , /dev/tty e /dev/tty0

kernel:disabilitare /dev/kmem e /dev/mem