2009-12-03 13 views
5

Sto cercando di capire perché mysql usa socket Unix (/tmp/mysql.sock) per impostazione predefinita, invece dei normali socket TCP/IP.C'è qualche ragione legittima per usare i socket Unix su TCP/IP con mysql?

Non sembra una cosa di sicurezza, in quanto è possibile ascoltare solo su 127.0.0.1 che dovrebbe essere ugualmente sicuro (il file socket è scrivibile in tutto il mondo, quindi non si ottiene la protezione basata sugli account Unix).

E sicuramente tutti i sistemi operativi si basano su TCP/IP ad alte prestazioni, tanto che non può essere significativamente più lento dei socket Unix - Linux fa tutti i tipi di trucchi con zero copie anche per il traffico di rete, quindi sicuramente deve essere veloce per il loopback .

Quindi c'è qualche motivo legittimo per l'utilizzo di socket Unix qui, o è solo un bizzarro incidente storico?

+0

Questo appartiene a serverfault. – monksy

risposta

6

C'è meno sovraccarico nell'utilizzo di socket Unix invece di TCP/IP, in quanto si tratta fondamentalmente di un flusso di byte senza la contabilità di rete aggiuntiva. Vedi wikipedia per qualche informazione in più.

Le connessioni di dominio Unix vengono visualizzate come flussi di byte, proprio come le connessioni di rete, ma tutti i dati rimangono all'interno del computer locale. I socket di dominio UNIX usano il file system come spazio dei nomi di indirizzo, cioè sono referenziati da processi come inode nel file system. Ciò consente a due processi distinti di aprire lo stesso socket per comunicare. Tuttavia, la comunicazione effettiva (lo scambio di dati) non utilizza il file system, ma i buffer nella memoria del kernel.

8

Mentre non si preme l'intero stack IP quando si passa a localhost, si colpisce ancora una grande parte di esso. Un socket unix è essenzialmente solo un pipe a 2 vie. È più veloce e leggero.

I socket Unix consentono inoltre di controllare l'accesso senza gestire le regole del firewall, in quanto l'accesso può essere concesso tramite le autorizzazioni del file system.

Un'altra caratteristica di unix socket è la possibilità di passare il descrittore di file da un processo all'altro.

+0

Qualsiasi descrittore di file può essere inviato da un processo a un altro utilizzando sendmsg() e ricevuto tramite receivemsg(), consultare http://stackoverflow.com/questions/2358684/can-i-share-a-file-descriptor-to- un altro processo-on-linux-o-sono-essi-local-to-t. Questo non è specifico per socket UNIX. – damjan

+0

@damjan No, non è questo il caso. Non è possibile inviare il descrittore di file tramite pipe, o un socket UDP o un socket TCP, o qualsiasi altra cosa eccetto un socket unix. Puoi provare, ma non funzionerà. – nos

Problemi correlati