Cos'è una presa?


48

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?


9
In parole povere: una presa è un telefono. È la cosa che tieni in mano che ti consente di conversare con un altro telefono. L'analogia si interrompe un po ': la maggior parte delle conversazioni telefoniche è peer-to-peer. Le connessioni socket sono client-server. Il client (come, ma non limitato a, software workstation come browser) si connette a un server (come un server Web, un file server, un server di autenticazione o altro). Un altro difetto dell'analogia: quando si chiude una connessione socket, il socket viene distrutto ed è necessario creare un nuovo socket prima di poter stabilire una nuova connessione.
G-Man dice "Ripristina Monica" il

Non è poi così male per un'analogia. Un server è solo un call center e può avere contemporaneamente centinaia di chiamate attive.
Salterio

Risposte:


42

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 alla programmazione in rete e alla comunicazione tra processi hanno entrambe buone informazioni su come utilizzare i socket e persino rispondere a questa domanda esatta .


65

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.


3
Forse anche menzionare che le pipe precedono le prese, ma una volta che l'interfaccia socket è stata aggiunta a Unix, ha avuto molto senso reimplementare le pipe usando le prese locali.
tripleee

@tripleee: questo è un grande punto storico. Vuoi fornire un riferimento?
dhag,

Il googling rapido mostra la pagina 40 in La progettazione e l'implementazione del sistema operativo FreeBSD ; il testo menziona questo cambiamento in 4.2BSD ma chiarisce anche che non è più così, per motivi di prestazioni.
tripleee

Eccellente, lo aggiungerò alla mia risposta.
dhag

La migliore risposta techno in assoluto
Chaosguru,

7

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

Ora che cos'è?

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

Innanzitutto, è un modello di pensiero e 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 "flusso") 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 unidirezionale tra un lettore e uno scrittore (entrambi programmi) sullo stesso computer. Simula un flusso di dati (proprio come ad esempio TCP).
Cioè, dal punto di vista della pipe non esistono singoli "messaggi" o "blocchi di dati". 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.

Una pipe con nome è, beh, semplicemente una 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 a due vie ("duplex"), il che significa che è possibile scrivere e leggere dalla stessa presa e non sono necessarie due prese separate per una comunicazione a due vie.
Inoltre, un socket può fungere da flusso (identico a una pipe), oppure può inviare messaggi discreti e inaffidabili oppure può inviare messaggi ordinati e discreti (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.

Con questo in mente, è chiaro che i socket fanno qualcosa di molto più complicato e generalmente hanno un overhead maggiore rispetto alle pipe (che in pratica non sono altro che un semplice memcpyda e verso un buffer!), Ma se si creano socket locali (cioè sullo stesso computer), il sistema operativo di solito applica un percorso rapido 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 sono esempi di alternative). Allo stesso tempo, vengono utilizzati per il "networking", come spiegato sopra.


1

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.

Quindi la unix.stackexchange.com:80porta 80di unix.stackexchange.com(un socket) è il punto di accesso di questo sito web.

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


5
tcp / ip è solo un tipo di socket. Ci sono altri che non hanno nulla a che fare con tcp / ip.
psusi

quanti diversi tipi di prese ci sono?
Abdul Al Hazred,

1
@AbdulAlHazred, conosco quattro tipi comuni usati con la rete ip, lo stesso con ip6, due con unix e due con IPX. Non ho visto ax25, atm o appletalk. Ci sono altri protocolli supportati su Linux e ci sono protocolli che Linux non supporta. Nella maggior parte dei casi ogni protocollo ha socket stream (tcp) e datagram (udp). Anche i socket grezzi sono comuni e imcp può anche avere un'interfaccia socket.
hildred

Il punto è che questa risposta è incompleta in quanto copre solo un tipo di socket e fuorviante in quanto rappresenta i socket in generale come se fossero sempre socket di rete, e in particolare AF_INETsocket IP ( ).
tripleee

0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.