it-swarm.it

Che cos'è un socket?

Qualcuno potrebbe spiegarmi cos'è una presa? Lo vedo in molti acronimi nel contesto di SSL, ecc.

Inoltre, perché si chiama socket? È solo perché era quello che un nome hanno inventato? O era il primo nome che hanno inventato?

57
chrisjlee

Un socket è solo un endpoint logico per la comunicazione. Esistono sul livello di trasporto. Puoi inviare e ricevere cose su un socket, puoi associare e ascoltare un socket. Un socket è specifico di un protocollo, una macchina e una porta e viene indirizzato come tale nell'intestazione di un pacchetto.

Le guide di Beej a Programmazione di rete e Comunicazione tra processi hanno entrambe buone informazioni su come utilizzare i socket e persino rispondi a questa domanda esatta .

48
Shawn J. Goff

In parole povere, un socket è uno pseudo-file che rappresenta una connessione di rete. Una volta creato un socket (utilizzando le primitive appropriate e i parametri corretti per identificare l'altro host), le scritture sul socket vengono trasformate in pacchetti di rete che vengono inviati e i dati ricevuti dalla rete possono essere letti dal socket.

Da un lato, i socket sono molto simili ai pipe: sembrano file ai programmi che li usano, ma non danno luogo a lettura o scrittura su disco; piuttosto, consentono la comunicazione con un altro programma (locale nel caso di tubi e possibilmente remoto nel caso di prese). Offrono anche, come dici tu, comunicazione bidirezionale (proprio come una coppia di tubi correttamente collegati potrebbe).

Infine, è comune che i programmi su un singolo computer comunichino tramite protocolli di rete standard, come TCP; sarebbe inutile andare fino all'hardware di rete (se presente!), checksum di calcolo, ecc., solo per tornare allo stesso host: ecco dove entrano i socket dei domini Unix. Questi sono molto simili ai normali socket, tranne che connettono i processi sullo stesso host anziché i processi remoti e non tentano affatto di utilizzare alcuna risorsa di rete. In questo modo, sono un mezzo di comunicazione tra processi.

Come menzionato da Tripleee, nel corso della storia di BSD, le pipe sono state introdotte prima delle prese e sono state reimplementate usando le prese una volta che esistevano. Lo stesso riferimento, La progettazione e l'implementazione del sistema operativo FreeBSD, menziona che le pipe sono state poi convertite in un'implementazione senza socket per motivi di prestazioni: questo certamente sottolinea il fatto che le pipe condividono somiglianze.

74
dhag

Ora che cos'è?

Un socket o "socket" può essere diverse cose:

Innanzitutto, si tratta di un modello di pensiero e di un'interfaccia di programmazione dell'applicazione (API) . Ciò significa che hai una serie di regole che devi seguire e una serie di funzioni che puoi usare per scrivere programmi che fanno qualcosa, secondo un contratto specificato con precisione. In questo caso particolare, qualcosa significa scambiare dati con un altro programma.

L'API socket estrae ampiamente i dettagli della "comunicazione" in generale. Incapsula con chi parli e come, attraverso un form (quasi) coerente e identico cookie-cutter.
È possibile creare socket in diversi "domini" (come ad esempio un "socket unix" o un "socket internet") e di diversi tipi di comunicazione (ad esempio un socket "datagramma" o un socket "stream") e parlare con destinatari diversi, e tutto funziona esattamente allo stesso modo (beh, 99%, ci sono ovviamente delle minuscole differenze che dovrai tenere in considerazione).

Non hai bisogno di sapere (e non vuoi nemmeno sapere!) Se parli con un altro programma sullo stesso computer o su un altro computer, o se c'è una rete IPv4 o IPv6 tra quei computer, o forse qualche altro protocollo di cui non hai mai sentito parlare.

socket è anche il nome della funzione di libreria (o syscall) che crea "il socket", che è un tipo speciale di file (tutto in Unix è un file).

Come si confronta con ...

le prese rientrano nella stessa categoria delle pipe e delle pipe dei nomi

Una pipe è un mezzo di comunicazione a senso unico tra un lettore e uno scrittore (entrambi programmi) sullo stesso computer. Simula un stream di dati (proprio come ad es. TCP).
Cioè, dal punto di vista della pipe non esistono "messaggi" o "blocchi di dati" individuali. Puoi copiare qualsiasi quantità di dati in "un'estremità" e qualcun altro può leggere qualsiasi quantità di dati (non necessariamente la stessa, e non necessariamente in una sola volta) dall'altra estremità nello stesso ordine di byte che hai lo spinse dentro.

A named pipe è, beh, semplicemente pipe che possiede un nome nel filesystem. Cioè, è qualcosa che assomiglia e si comporta proprio come un file, appare nell'elenco delle directory e puoi aprirlo, scriverlo, ecc. Ecc. Nota che puoi anche creare file speciali socket (che sarebbe un socket chiamato) .

Un socket, d'altra parte, è un mezzo di comunicazione bidirezionale ("duplex"), il che significa che è possibile scrivere e leggere dallo stesso presa e non sono necessarie due prese separate per una comunicazione a due vie.
Inoltre, un socket può fungere da stream (identico a una pipe) oppure può inviare messaggi discreti e inaffidabili oppure può inviare messaggi discreti ordinati (i primi due funzionano su qualsiasi dominio, l'ultimo solo su "dominio unix"). Può inviare messaggi (o simulare un flusso) a qualcuno su un computer completamente diverso. Un socket può persino eseguire una forma di comunicazione uno-a-molti (multicast) in alcune condizioni.

Tenendo presente ciò, è chiaro che le prese fanno qualcosa di molto più complicato e in generale hanno un overhead maggiore rispetto alle pipe (che in pratica non sono altro che un semplice memcpy da e verso un buffer!), ma se si creano socket locali (ovvero sullo stesso computer), il sistema operativo applica di solito un percorso veloce fortemente ottimizzato, quindi non c'è davvero molta differenza.

comunicazione tra processi talvolta menzionata per quanto riguarda le reti

Sì, i socket sono un possibile modo di comunicazione tra processi (memoria condivisa e pipe come esempi di alternative). Allo stesso tempo, vengono utilizzati per il "networking", come spiegato sopra.

8
Damon

Una presa un'astrazione. Fornisce un'interfaccia per le applicazioni per utilizzare una risorsa di sistema (in questo caso la connessione di rete) in modo da consentire al sistema operativo di mediare e organizzare l'uso di una risorsa limitata da un numero qualsiasi di applicazioni.

Se i dati inviati attraverso il socket potrebbero essere considerati buste di posta, il socket sarebbe la tua casella di posta. Alleghi una cassetta postale (presa) a casa tua (programma) e inserisci la tua posta (dati) in uscita. A un orario prestabilito arriva il postino (sistema operativo) che preleva la posta in uscita e rilascia la posta in arrivo nella stessa cassetta postale. La tua posta in uscita viene trasmessa per tuo conto al destinatario tramite il camion del postino (connessione di rete) insieme a tutta la posta dei tuoi vicini. Ciò consente di comunicare con persone lontane senza la necessità di spese, tempi, difficoltà, ecc. Di consegnare la lettera da soli.

Per quanto riguarda il motivo per cui vengono chiamati "socket" bene, l'idea che gli inventori riescano a chiamarlo come vogliono probabilmente gioca un ruolo importante lì. Tuttavia, secondo me non è un brutto nome :)

7
Andrew Lambert

Per udp o tcp su IP,

Un indirizzo socket è la combinazione di un indirizzo IP e un numero di porta.

Un indirizzo IP è l'indirizzo di una macchina su Internet, ad es. unix.stackexchange.com has address 198.252.206.140

Tuttavia, ogni macchina deve essere in grado di fornire più di un servizio, quindi la maggior parte delle macchine fornirà http (pagine Web) sulla porta 80 e ssh sulla porta 22 e così via.

Così unix.stackexchange.com:80 port 80 di unix.stackexchange.com (un socket) è il punto di accesso di questo sito web.

Tuttavia, esistono altri tipi di socket, vedere i commenti di seguito.

2
ctrl-alt-delor

Credo che tu abbia chiesto del networking. Quindi TCP utilizzano i socket come punto di comunicazione e sono composti da un indirizzo IP, protocollo e numero di porta.

0
Dragos Alexe