Qual è la differenza tra una porta e un socket?


928

Questa è stata una domanda sollevata da uno degli ingegneri del software nella mia organizzazione. Sono interessato alla definizione più ampia.


19
Solo per ribadire, i socket non si limitano all'IO di rete. Sono disponibili in ogni tipo di situazione per lo streaming di dati tra varie applicazioni.
Oli,

Risposte:


977

Sommario

Un socket TCP è un'istanza dell'endpoint definita da un indirizzo IP e una porta nel contesto di una particolare connessione TCP o dello stato di ascolto.

Una porta è un identificatore di virtualizzazione che definisce un endpoint del servizio (come distinto da un endpoint dell'istanza del servizio o identificatore di sessione).

Un socket TCP non è una connessione , è l'endpoint di una connessione specifica.

Possono esserci connessioni simultanee a un endpoint del servizio , poiché una connessione viene identificata dagli endpoint sia locali che remoti , consentendo il routing del traffico verso un'istanza di servizio specifica.

Può esserci un solo socket di ascolto per una data combinazione indirizzo / porta .

Esposizione

Questa è stata una domanda interessante che mi ha costretto a riesaminare una serie di cose che pensavo di sapere a fondo. Penseresti che un nome come "socket" sarebbe autoesplicativo: è stato ovviamente scelto per evocare immagini dell'endpoint in cui si collega un cavo di rete, con forti parallelismi funzionali. Tuttavia, nel linguaggio di rete la parola "presa" porta così tanto bagaglio che è necessario un attento riesame.

Nel senso più ampio possibile, una porta è un punto di ingresso o uscita. Sebbene non sia utilizzato in un contesto di rete, la parola francese porte significa letteralmente porta o gateway , sottolineando ulteriormente il fatto che le porte sono endpoint di trasporto sia per la spedizione di dati che per i grandi contenitori di acciaio.

Ai fini di questa discussione limiterò la considerazione al contesto delle reti TCP-IP. Il modello OSI è tutto molto buono ma non è mai stato completamente implementato, tanto meno ampiamente implementato in condizioni di traffico intenso e stressante.

La combinazione di un indirizzo IP e una porta è strettamente nota come endpoint e talvolta viene chiamata socket. Questo utilizzo ha origine con RFC793, la specifica TCP originale.

Una connessione TCP è definita da due endpoint detti socket .

Un endpoint (socket) è definito dalla combinazione di un indirizzo di rete e un identificatore di porta . Si noti che l'indirizzo / porto non non identificare completamente un socket (ne parleremo più avanti).

Lo scopo delle porte è differenziare più endpoint su un determinato indirizzo di rete. Si potrebbe dire che una porta è un endpoint virtualizzato. Questa virtualizzazione rende possibili più connessioni simultanee su un'unica interfaccia di rete.

È la coppia di socket (la 4 tupla costituita dall'indirizzo IP del client, dal numero di porta del client, dall'indirizzo IP del server e dal numero di porta del server) che specifica i due endpoint che identificano in modo univoco ogni connessione TCP in una rete. ( TCP-IP Illustrated Volume 1 , W. Richard Stevens)

Nella maggior parte dei linguaggi derivati ​​da C, le connessioni TCP vengono stabilite e manipolate usando metodi su un'istanza di una classe Socket. Sebbene sia comune operare su un livello più elevato di astrazione, in genere un'istanza di una classe NetworkStream, in genere questo espone un riferimento a un oggetto socket. Per il programmatore questo oggetto socket sembra rappresentare la connessione perché la connessione viene creata e manipolata usando i metodi dell'oggetto socket.

In C #, per stabilire una connessione TCP (a un listener esistente) devi prima creare un TcpClient . Se non si specifica un endpoint al costruttore TcpClient , utilizza le impostazioni predefinite: in un modo o nell'altro viene definito l'endpoint locale. Quindi invochi il metodo Connect sull'istanza che hai creato. Questo metodo richiede un parametro che descrive l'altro endpoint.

Tutto ciò è un po 'confuso e ti porta a credere che una presa sia una connessione, che è un blocco. Lavoravo sotto questa incomprensione fino a quando Richard Dorman non fece la domanda.

Avendo letto e riflettuto molto, ora sono convinto che avrebbe molto più senso avere una classe TcpConnection con un costruttore che accetta due argomenti, LocalEndpoint e RemoteEndpoint . Probabilmente potresti supportare un singolo argomento RemoteEndpoint quando le impostazioni predefinite sono accettabili per l'endpoint locale. Ciò è ambiguo su computer multihomed, ma l'ambiguità può essere risolta utilizzando la tabella di routing selezionando l'interfaccia con il percorso più breve verso l'endpoint remoto.

La chiarezza sarebbe migliorata anche sotto altri aspetti. Un socket non è identificato dalla combinazione di indirizzo IP e porta:

[...] TCP demultiplica i segmenti in entrata utilizzando tutti e quattro i valori che comprendono gli indirizzi locali ed esteri: indirizzo IP di destinazione, numero di porta di destinazione, indirizzo IP di origine e numero di porta di origine. TCP non è in grado di determinare quale processo ottiene un segmento in entrata guardando solo la porta di destinazione. Inoltre, l'unico dei [vari] endpoint in [un determinato numero di porta] che riceverà richieste di connessione in entrata è quello nello stato di ascolto. (p255, TCP-IP Illustrated Volume 1 , W. Richard Stevens)

Come puoi vedere, non è solo possibile, ma è molto probabile che un servizio di rete abbia numerosi socket con lo stesso indirizzo / porta, ma solo un socket listener su una particolare combinazione indirizzo / porta. Le implementazioni di librerie tipiche presentano una classe socket, un'istanza della quale viene utilizzata per creare e gestire una connessione. Questo è estremamente sfortunato, poiché provoca confusione e ha portato a una diffusa conflazione dei due concetti.

Hagrawal non mi crede (vedi commenti) quindi ecco un vero esempio. Ho collegato un browser Web a http://dilbert.com e quindi ho eseguito netstat -an -p tcp. Le ultime sei righe dell'output contengono due esempi del fatto che indirizzo e porta non sono sufficienti per identificare in modo univoco un socket. Esistono due connessioni distinte tra 192.168.1.3 (la mia workstation) e 54.252.94.236:80 (il server HTTP remoto)

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

Poiché un socket è l'endpoint di una connessione, esistono due socket con la combinazione indirizzo / porta 207.38.110.62:80e altri due con la combinazione indirizzo / porta 54.252.94.236:80.

Penso che l'incomprensione di Hagrawal derivi dal mio uso molto attento della parola "identifica". Intendo "identifica in modo completo, inequivocabile e univoco". Nell'esempio sopra ci sono due endpoint con la combinazione indirizzo / porta 54.252.94.236:80. Se tutto ciò che hai è l'indirizzo e la porta, non hai abbastanza informazioni per distinguere questi socket. Non sono sufficienti informazioni per identificare un socket.

appendice

Il paragrafo due della sezione 2.7 della RFC793 recita

Una connessione è completamente specificata dalla coppia di prese alle estremità. Un socket locale può partecipare a molte connessioni a diversi socket esterni.

Questa definizione di socket non è utile dal punto di vista della programmazione perché non è la stessa di un oggetto socket , che è l'endpoint di una particolare connessione. Per un programmatore, e la maggior parte del pubblico di questa domanda è programmatore, questa è una differenza funzionale vitale.

Riferimenti

  1. TCP-IP Illustrated Volume 1 The Protocols , W. Richard Stevens, 1994 Addison Wesley

  2. RFC793 , Information Sciences Institute, University of Southern California per DARPA

  3. RFC147 , The Definition of a Socket, Joel M. Winett, Lincoln Laboratory


6
Forse, un'analogia del mondo reale con le parole chiave socket e port aiuterebbe coloro che hanno votato a favore della domanda. Ancora un'ottima spiegazione!
rohitverma,

5
@rationalcoder - Leggi l'intera risposta. C'è una differenza tra l'essere definito da qualcosa e l'essere identificato da esso. Ad esempio, le istanze di una classe sono definite dalla classe. Sono parzialmente ma non completamente identificati da esso.
Peter Wone,

6
Non ho votato perché non sono d'accordo con questa affermazione: " Un socket non è identificato dalla combinazione di indirizzo IP e porta: " .. Leggi TCP RFC - tools.ietf.org/html/rfc793 .. È molto chiaro che socket è una combinazione di IP e porta, se conosci IP e porta allora hai identificato un socket o endpoint, se conosci una coppia di socket ovvero porta IP + client e porta IP + server allora hai identificato una connessione unica ..
hagrawal

6
"Nell'esempio sopra ci sono due endpoint con la combinazione indirizzo / porta 54.252.94.236:80. Se tutto ciò che hai è indirizzo e porta, non hai abbastanza informazioni per distinguere questi socket. Non sono sufficienti informazioni per identificare un zoccolo." Non sono gli stessi socket, ma connessioni diverse, tra le due connessioni hai 3 socket, 2 locali e uno stesso server socket a cui sei collegato; o sono in realtà due prese diverse? Non sarebbe possibile distinguerli perché sono uguali, ma per distinguere le connessioni sono necessari i diversi socket locali.
Andrew Clavin,

6
-1 La tua risposta è semplicemente sbagliata. Tu: "Un socket TCP è ... l'endpoint di una connessione specifica ." RFC 793 : "un socket può essere utilizzato contemporaneamente in più connessioni ". Non sono sicuro di quali librerie stai utilizzando, ma nelle librerie che ho usato, gli oggetti socket sono stati definiti in modo univoco da un IP e una porta e hanno generato oggetti di connessione per ciascun socket remoto.
Zaz,

187

Una presa è composta da tre cose:

  1. Un indirizzo IP
  2. Un protocollo di trasporto
  3. Un numero di porta

Una porta è un numero compreso tra 1 e 65535 incluso che indica un gate logico in un dispositivo. Ogni connessione tra un client e un server richiede un socket univoco.

Per esempio:

  • 1030 è una porta.
  • (10.1.1.2, TCP, porta 1030) è un socket.

80
No. Un socket è composto da cinque elementi: {protocollo, indirizzo locale, porta locale, indirizzo remoto, porta remota}.
Marchese di Lorne,

19
@EJP No, di nuovo. Vedi la risposta selezionata per maggiori informazioni.
Kehlan Krumme,

2
@KorayTugay È nell'intestazione IP. Cosa ti fa pensare che il layer TCP non riesca a vederlo?
Marchese di Lorne,

1
@EJP come posso vedere nella risposta più votata sopra che un socket NON è la connessione stessa ma è il punto finale di una connessione, quindi come mai può includere sia porte locali che remote e indirizzi IP. Un socket rappresenterà solo un lato della connessione, ovvero porta locale e indirizzo IP locale OPPURE porta remota e accesso IP remoto. Gentilmente correggimi se sbaglio.
RBT

7
@EJP Still RFC 793: "Una coppia di socket identifica in modo univoco ogni connessione. Cioè, un socket può essere utilizzato contemporaneamente in più connessioni." Se una presa consisteva già di cinque cose, come potrebbe esserci "un paio di prese" nella mia citazione?
Gab 是 好人

100

Un socket rappresenta una singola connessione tra due applicazioni di rete. Queste due applicazioni funzionano nominalmente su computer diversi, ma i socket possono anche essere utilizzati per la comunicazione tra processi su un singolo computer. Le applicazioni possono creare più socket per comunicare tra loro. I socket sono bidirezionali, il che significa che entrambi i lati della connessione sono in grado di inviare e ricevere dati. Pertanto un socket può essere creato teoricamente a qualsiasi livello del modello OSI da 2 in poi. I programmatori usano spesso socket nella programmazione di rete, anche se indirettamente. Le librerie di programmazione come Winsock nascondono molti dei dettagli di basso livello della programmazione dei socket. Le prese sono state ampiamente utilizzate dai primi anni '80.

Una porta rappresenta un endpoint o "canale" per le comunicazioni di rete. I numeri di porta consentono a diverse applicazioni sullo stesso computer di utilizzare le risorse di rete senza interferire tra loro. I numeri di porta compaiono più comunemente nella programmazione di rete, in particolare la programmazione socket. A volte, tuttavia, i numeri di porta sono resi visibili all'utente occasionale. Ad esempio, alcuni siti Web visitati da una persona su Internet utilizzano un URL come il seguente:

http://www.mairie-metz.fr:8080/ In questo esempio, il numero 8080 si riferisce al numero di porta utilizzato dal browser Web per connettersi al server Web. Normalmente, un sito Web utilizza il numero di porta 80 e questo numero non deve essere incluso nell'URL (sebbene possa essere).

Nella rete IP, i numeri di porta possono teoricamente variare da 0 a 65535. Le applicazioni di rete più popolari, tuttavia, utilizzano i numeri di porta nella parte bassa dell'intervallo (come 80 per HTTP).

Nota: il termine porta si riferisce anche a molti altri aspetti della tecnologia di rete. Una porta può fare riferimento a un punto di connessione fisico per dispositivi periferici come porte seriali, parallele e USB. Il termine porta si riferisce anche ad alcuni punti di connessione Ethernet, come quelli su un hub, switch o router.

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm


2
Il livello 2 sul modello OSI è una connessione tra nodi, non ha alcun meccanismo di connessione dei processi. Non credo che si possa considerare un socket esistente in OSI l2.
Antonio Haley,

18
Un circuito è una connessione - una presa è un endpoint. Una connessione è composta da 2 prese.
Mark Brackett,

" Un socket rappresenta una singola connessione tra due applicazioni di rete. " Che non corrisponde a RFC 793, protocollo di controllo della trasmissione che spiega: " Per consentire a molti processi all'interno di un singolo host di utilizzare contemporaneamente le strutture di comunicazione TCP, il TCP fornisce un set di indirizzi o porte all'interno di ciascun host. Concatenato con la rete e gli indirizzi host dal livello di comunicazione Internet, questo forma un socket. Una coppia di socket identifica in modo univoco ogni connessione. "
Ron Maupin,

84

Con qualche analogia

Anche se sono già state fornite molte cose tecniche per i socket ... Vorrei aggiungere la mia risposta, per ogni evenienza, se qualcuno ancora non avvertisse la differenza tra ip, porta e socket

Considera un server S ,

e dire che la persona X, Y, Z ha bisogno di un servizio (ad esempio servizio di chat) da quel server S

poi

L'indirizzo IP dice -> chi? è quel server di chat 'S' che X, Y, Z vogliono contattare

okay, hai "chi è il server"

ma supponiamo che il server "S" fornisca anche altri servizi ad altre persone, diciamo che "S" fornisce servizi di archiviazione alle persone A, B, C

poi

porta dice ---> quale? servizio di cui hai bisogno (X, Y, Z), ad esempio il servizio di chat e non quel servizio di archiviazione

okay, fai in modo che il server venga a sapere che il "servizio di chat" è ciò che desideri e non lo spazio di archiviazione

ma

sei tre e il server potrebbe voler identificare tutti e tre in modo diverso

arriva la presa

ora socket dice -> quale? connessione particolare

cioè, diciamo,

presa 1 per persona X

presa 2 per persona Y

e presa 3 per persona Z

Spero che aiuti qualcuno che era ancora confuso :)


Quindi X, Y, Z si collegherebbero alla stessa porta, cioè allo stesso servizio, ma hanno socket diversi sul lato server? Quindi, diciamo, X invia un pacchetto al server, dirà: "trova me (protocollo, IP di X, porta di X, IP di S, porta di S)" e invia all'app di chat. Presumo che ci debba essere un legame tra alcuni oggetti specifici dell'applicazione e oggetti socket? Ad esempio, quando ottengo alcuni dati dal socket-1, voglio visualizzarlo come messaggio utente, ma l'app deve sapere che i messaggi dal socket A provengono da User-X.
monolito

44

In primo luogo, penso che dovremmo iniziare con una piccola comprensione di ciò che costituisce ottenere un pacchetto da A a B.

Una definizione comune per una rete è l'uso del modello OSI che separa una rete in un numero di livelli in base allo scopo. Ce ne sono alcuni importanti, che tratteremo qui:

  • Il livello di collegamento dati . Questo livello è responsabile per il trasferimento di pacchetti di dati da un dispositivo di rete a un altro ed è appena sopra il livello che esegue effettivamente la trasmissione. Parla di indirizzi MAC e sa come trovare host in base al loro indirizzo MAC (hardware), ma niente di più.
  • Il livello di rete è il livello che consente di trasportare dati tra macchine e oltre limiti fisici, come i dispositivi fisici. Il livello di rete deve essenzialmente supportare un meccanismo basato sull'indirizzo aggiuntivo che si collega in qualche modo all'indirizzo fisico; inserire il protocollo Internet (IPv4). Un indirizzo IP può ottenere il tuo pacchetto da A a B su Internet, ma non sa nulla su come attraversare i singoli hop. Questo è gestito dal livello sopra in accordo con le informazioni di routing.
  • Lo strato di trasporto . Questo livello è responsabile della definizione del modo in cui le informazioni arrivano da A a B e di eventuali restrizioni, controlli o errori su tale comportamento. Ad esempio, TCP aggiunge ulteriori informazioni a un pacchetto in modo che sia possibile dedurre se i pacchetti sono stati persi.

TCP contiene, tra l'altro, il concetto di porte . Si tratta di endpoint di dati effettivamente diversi sullo stesso indirizzo IP a cui AF_INETpuò collegarsi un Internet Socket ( ).

In questo caso, anche UDP e altri protocolli del livello di trasporto. Non hanno tecnicamente bisogno di disporre di porte, ma queste porte forniscono un modo per più applicazioni nei livelli sopra per utilizzare lo stesso computer per ricevere (e in effetti) effettuare connessioni in uscita.

Il che ci porta all'anatomia di una connessione TCP o UDP. Ciascuno presenta una porta e un indirizzo di origine, nonché una porta e un indirizzo di destinazione. In tal modo, in una determinata sessione, l'applicazione di destinazione può rispondere, oltre a ricevere, dall'origine.

Quindi le porte sono essenzialmente un modo su specifica richiesta di consentire più connessioni simultanee che condividono lo stesso indirizzo.

Ora, dobbiamo dare un'occhiata al modo in cui comunichi dal punto di vista dell'applicazione al mondo esterno. Per fare ciò, è necessario chiedere gentilmente al proprio sistema operativo e poiché la maggior parte dei SO supporta il modo Berkeley Socket di fare le cose, vediamo che possiamo creare socket che coinvolgono porte da un'applicazione come questa:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...

Grande! Quindi nelle sockaddrstrutture, specificheremo il nostro porto e bam! Lavoro fatto! Bene, quasi, tranne:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

è anche possibile. Urgh, è stata lanciata una chiave inglese nelle opere!

Ok, beh in realtà non l'ha fatto. Tutto quello che dobbiamo fare è trovare alcune definizioni appropriate:

  • Una presa Internet è la combinazione di un indirizzo IP, un protocollo e il numero di porta associato su cui un servizio può fornire dati. Quindi, porta tcp 80, stackoverflow.com è una presa internet.
  • Un socket unix è un endpoint IPC rappresentato nel file system, ad es /var/run/database.sock.
  • Un'API socket è un metodo per richiedere a un'applicazione di leggere e scrivere dati su un socket.

Ecco! Questo mette in ordine le cose. Quindi nel nostro schema allora,

  • Una porta è un identificatore numerico che, nell'ambito di un protocollo del livello di trasporto, identifica il numero di servizio che dovrebbe rispondere alla richiesta fornita.

Quindi davvero una porta è un sottoinsieme dei requisiti per formare una presa internet. Sfortunatamente, è proprio così che il significato della parola socket è stato applicato a diverse idee. Quindi ti consiglio vivamente di nominare il tuo prossimo socket del progetto, solo per aggiungere confusione;)


Questo è il motivo per cui i proiettili non escono e non lasceranno Powerpoint; lavorano!
Anurag Kalia

Bellissima introduzione a tcp-ip e comunicazione di rete. Principianti, leggi prima questo.
Colin

32

Un socket = indirizzo IP + una porta (indirizzo numerico)
Insieme identificano un end-point per una connessione di rete su una macchina. (Ho appena smantellato la rete 101?)


7
Credo che port abbia un significato più ampio della tua definizione.
Richard Dorman,

2
E i socket non sono solo soggetti allo stack TCP / IP. Vedere socket di dominio UNIX o socket di comunicazione tra processi in generale.
matthias krull,

non sono sicuro di questa risposta. È possibile utilizzare HTTP per comunicare con un altro processo tramite socket senza assegnare una porta.
SeF

31

Generalmente, otterrai molti aspetti teorici, ma uno dei modi più semplici per differenziare questi due concetti è il seguente:

Per ottenere un servizio, è necessario un numero di servizio. Questo numero di servizio è chiamato porta. Semplice come quella.

Ad esempio, HTTP come servizio è in esecuzione sulla porta 80.

Ora, molte persone possono richiedere il servizio ed è stata stabilita una connessione dal client-server. Ci saranno molte connessioni. Ogni connessione rappresenta un client. Al fine di mantenere ogni connessione, il server crea un socket per connessione per mantenere il proprio client.


Ogni socket richiede la propria porta?
Lunedì

Eccezionale. Il modo più semplice per presentare una conoscenza della montagna.
Asif Mehmood,

5
Non sono sicuro che la tua affermazione: "il server crea socket per connessione per mantenere il suo client" è corretta.
Rushi Agrawal,

1
@RushiAgrawal Quindi ti suggerisco di cercarlo. In particolare, vedi accettazione dell'uomo.
Marchese di Lorne,

1
Ciò implica che per ogni socket che il server crea per connessione per mantenere il proprio client può avere lo stesso numero di porta (come la porta 80 per la continuazione delle connessioni HTTP) ma con indirizzo IP diverso dei client da cui vengono inviate le richieste di connessioni. destra?
Randika Vishman,

25

Sembra che ci siano molte risposte che equiparano socket alla connessione tra 2 PC ... che penso sia assolutamente errato. Un socket è sempre stato l' endpoint su 1 PC, che può essere collegato o meno - sicuramente abbiamo usato tutti listener o socket UDP * a un certo punto. La parte importante è che è indirizzabile e attivo. Non è probabile che l'invio di un messaggio a 1.1.1.1:1234 funzioni, poiché non è stato definito alcun socket per quell'endpoint.

I socket sono specifici del protocollo - quindi l'implementazione dell'unicità che sia TCP / IP che UDP / IP utilizza * (indirizzo IP: porta), è diversa rispetto ad es. IPX (Rete, Nodo e ... ahem, socket - ma un diverso socket di quello che si intende con il termine "socket" generale. I numeri di socket IPX sono equivalenti alle porte IP). Ma offrono tutti un endpoint indirizzabile univoco.

Poiché l'IP è diventato il protocollo dominante, una porta (in termini di rete) è diventata sinonimo di un numero di porta UDP o TCP, che è una parte dell'indirizzo del socket.

  • UDP è senza connessione, il che significa che non viene mai creato alcun circuito virtuale tra i 2 endpoint. Tuttavia, ci riferiamo ancora ai socket UDP come endpoint. Le funzioni API chiariscono che entrambi sono solo diversi tipi di socket: SOCK_DGRAMè UDP (sta solo inviando un messaggio) ed SOCK_STREAMè TCP (creando un circuito virtuale).

  • Tecnicamente, l'intestazione IP contiene l'indirizzo IP e il protocollo sopra IP (UDP o TCP) contiene il numero di porta. Ciò consente di avere altri protocolli (ad es. ICMP che non hanno numeri di porta, ma dispongono di informazioni di indirizzamento IP).


25

Breve breve risposta

Una porta può essere descritta come un indirizzo interno all'interno di un host che identifica un programma o un processo.

Un socket può essere descritto come un'interfaccia di programmazione che consente a un programma di comunicare con altri programmi o processi, su Internet o localmente.


3
La parola "interna" nella descrizione della porta mi sembra piuttosto "non pubblica".
Jonas N,

Quindi potremmo dire: Socket funziona all'interno delle porte? o porte scorre all'interno di socket?
Gucho Ca,

@GuchoCa Non possiamo dire che i socket o le porte funzionino affatto, figuriamoci uno dentro l'altro. Non è chiaro cosa stai chiedendo.
Marchese di Lorne,

16

Sono termini di due domini diversi: "porta" è un concetto della rete TCP / IP, "socket" è una cosa API (di programmazione). Un 'socket' viene creato (nel codice) prendendo una porta e un nome host o una scheda di rete e combinandoli in una struttura di dati che è possibile utilizzare per inviare o ricevere dati.


Per la risposta più generale, barrare "creato prendendo una porta e un nome host o una scheda di rete e combinandoli in un". Ad esempio, un socket UNIX è (nel codice) una struttura di dati (o oggetto) che è possibile utilizzare per inviare o ricevere dati.
Josiah Yoder,

14

Questi sono concetti di base della rete, quindi li spiegherò in modo semplice ma completo per capire nei dettagli.

  • Una presa è come un telefono (cioè un dispositivo end-to-end per la comunicazione)
  • IP è come il tuo numero di telefono (es. Indirizzo per la tua presa)
  • La porta è come la persona con cui vuoi parlare (ovvero il servizio che desideri ordinare da quell'indirizzo)
  • Un socket può essere un client o un socket del server (ovvero in un'azienda il telefono dell'assistenza clienti è un server ma un telefono in casa è principalmente un client)

Quindi un socket in rete è un dispositivo di comunicazione virtuale associato a una coppia (ip, porta) = (indirizzo, servizio).

Nota:

  • Una macchina, un computer, un host, un cellulare o un PC possono avere più indirizzi, più porte aperte e quindi più socket. Come in un ufficio, puoi avere più telefoni con più numeri di telefono e più persone con cui parlare.
  • L'esistenza di una porta aperta / attiva richiede che sia necessario avere un socket associato ad esso, poiché è il socket che rende accessibile la porta. Tuttavia, potresti avere porte inutilizzate per il momento.
  • Inoltre, in un socket del server è possibile collegarlo a (una porta, un indirizzo specifico di una macchina) o a (una porta, tutti gli indirizzi di una macchina) poiché nel telefono è possibile collegare molte linee telefoniche (numeri di telefono) a un telefono o una linea telefonica specifica a un telefono e puoi comunque raggiungere una persona attraverso tutte queste linee telefoniche o attraverso una linea telefonica specifica.
  • Non è possibile associare (associare) una presa a due porte poiché nel telefono di solito non è sempre possibile avere due persone che utilizzano lo stesso telefono contemporaneamente.
  • Avanzato: sullo stesso computer non è possibile avere due socket con lo stesso tipo (client o server) e stessa porta e IP. Tuttavia, se sei un client puoi aprire due connessioni, con due socket, a un server perché la porta locale in ciascuno di questi socket client è diversa)

Spero che ti chiarisca i dubbi


È interessante vedere tutte queste comprensioni e analogie di socket / porte / indirizzi IP sotto questa domanda. E mi piace questa risposta.
Bloodmoon,

12

Dopo aver letto le eccellenti risposte votate in alto, ho scoperto che il punto seguente necessitava di enfasi per me, un nuovo arrivato nella programmazione di rete:

Le connessioni TCP-IP sono percorsi bidirezionali che collegano un indirizzo: combinazione di porte con un altro indirizzo: combinazione di porte. Pertanto, ogni volta che apri una connessione dal tuo computer locale a una porta su un server remoto (ad esempio www.google.com:80), stai anche associando un nuovo numero di porta sul tuo computer alla connessione, per consentire al server di inviare cose a te (ad es. 127.0.0.1:65234). Può essere utile utilizzare netstat per esaminare le connessioni della macchina:

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...

12

Un indirizzo socket è un indirizzo IP e un numero di porta

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

Si verifica una connessione quando 2 socket sono collegati insieme.


Non esiste un collegamento tra due socket. La parola "associato" significa qualcos'altro con le porte.
Marchese di Lorne,

10

Un socket è un tipo speciale di handle di file utilizzato da un processo per richiedere servizi di rete dal sistema operativo. Un indirizzo socket è il triplo: {protocollo, indirizzo locale, processo locale} in cui il processo locale è identificato da un numero di porta.

Nella suite TCP / IP, ad esempio:

{tcp, 193.44.234.3, 12345}

Una conversazione è il collegamento di comunicazione tra due processi che rappresenta un'associazione tra due. Un'associazione è la 5 tupla che specifica completamente i due processi che comprendono una connessione: {protocollo, indirizzo locale, processo locale, indirizzo esterno, processo esterno}

Nella suite TCP / IP, ad esempio:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

potrebbe essere un'associazione valida.

Una mezza associazione è: {protocollo, indirizzo locale, processo locale}

o

{protocollo, indirizzo esterno, processo estero}

che specifica ogni metà di una connessione.

La mezza associazione è anche chiamata socket o indirizzo di trasporto. Cioè, un socket è un punto finale per la comunicazione che può essere nominato e indirizzato in una rete. L'interfaccia socket è una delle numerose interfacce di programmazione dell'applicazione (API) ai protocolli di comunicazione. Progettato per essere un'interfaccia di programmazione di comunicazione generica, è stato introdotto per la prima volta dal sistema 4.2BSD UNIX. Sebbene non sia stato standardizzato, è diventato di fatto uno standard industriale.


Questa risposta è quella che l'ha fatto per me. Immagino sia perché nessun altro ha menzionato la parola associazione. Buona spiegazione
rationalcoder

Non esiste un numero di processo in nessuno dei tuoi esempi. La parola che stai cercando è "port".
Marchese di Lorne,

Leggi il primo paragrafo .. È menzionato chiaramente lì. Fammi sapere di ogni ambiguità citando la frase esatta .. Sarebbe utile per me improvvisare.
Krishna,

7

Un socket è un endpoint di comunicazione. Un socket non è direttamente correlato alla famiglia di protocolli TCP / IP, ma può essere utilizzato con qualsiasi protocollo supportato dal sistema. L'API socket C prevede che tu ottenga innanzitutto un oggetto socket vuoto dal sistema che puoi quindi associare a un indirizzo socket locale (per recuperare direttamente il traffico in entrata per protocolli senza connessione o per accettare richieste di connessione in entrata per protocolli orientati alla connessione) o che è possibile connettersi a un indirizzo socket remoto (per entrambi i tipi di protocollo). Puoi anche fare entrambe le cose se vuoi controllare entrambi, l'indirizzo del socket locale a cui è associato un socket e l'indirizzo del socket remoto a cui è collegato un socket. Per i protocolli senza connessione, la connessione di un socket è persino facoltativa, ma se non lo fai, Dovrò anche passare l'indirizzo di destinazione con ogni pacchetto che si desidera inviare tramite il socket, in quale altro modo il socket saprebbe dove inviare questi dati? Il vantaggio è che è possibile utilizzare un singolo socket per inviare pacchetti a diversi indirizzi di socket. Una volta configurata la presa e forse anche collegata, considerala come una pipa di comunicazione bidirezionale. Puoi usarlo per passare i dati ad alcune destinazioni e alcune destinazioni possono usarli per restituirti i dati. Ciò che scrivi su un socket viene inviato e ciò che è stato ricevuto è disponibile per la lettura. Puoi usarlo per passare i dati ad alcune destinazioni e alcune destinazioni possono usarli per restituirti i dati. Ciò che scrivi su un socket viene inviato e ciò che è stato ricevuto è disponibile per la lettura. Puoi usarlo per passare i dati ad alcune destinazioni e alcune destinazioni possono usarli per restituirti i dati. Ciò che scrivi su un socket viene inviato e ciò che è stato ricevuto è disponibile per la lettura.

Le porte invece sono qualcosa che solo alcuni protocolli dello stack del protocollo TCP / IP hanno. I pacchetti TCP e UDP hanno porte. Una porta è solo un numero semplice. La combinazione di porta di origine e porta di destinazione identifica un canale di comunicazione tra due host. Ad esempio potresti avere un server che deve essere sia un semplice server HTTP che un semplice server FTP. Se ora arriva un pacchetto per l'indirizzo di quel server, come farebbe a sapere se si tratta di un pacchetto per il server HTTP o FTP? Bene, lo saprà in quanto il server HTTP verrà eseguito sulla porta 80 e il server FTP sulla porta 21, quindi se il pacchetto arriva con una porta di destinazione 80, è per il server HTTP e non per il server FTP. Inoltre il pacchetto ha una porta di origine poiché senza tale porta di origine, un server potrebbe avere solo una connessione a un indirizzo IP alla volta. La porta di origine consente a un server di distinguere connessioni altrimenti identiche: hanno tutte la stessa porta di destinazione, ad es. Porta 80, lo stesso IP di destinazione (l'IP del server) e lo stesso IP di origine, da cui provengono tutti lo stesso client, ma poiché hanno porte di origine diverse, il server può distinguerle le une dalle altre. E quando il server invia risposte, lo farà alla porta da cui proviene la richiesta, in questo modo il client può anche distinguere le diverse risposte che riceve dallo stesso server.


2
Questo non è corretto Un socket non è un endpoint. Un socket è definito da due endpoint. Ogni endpoint è definito da un indirizzo di rete e una porta. Lo scopo delle porte è di differenziare più endpoint sullo stesso indirizzo di rete, in modo da poter supportare più socket simultanei.
Peter Wone,

1
Ho notato che RFC793 (specifica TCP originale) si riferisce alla combinazione di un indirizzo di rete e una porta come socket, quindi posso vedere dove l'hai trovato, ma è ancora errato in quanto un socket è necessariamente definito da due endpoint.
Peter Wone,

2
Riflettendoci, la letteratura è contraddittoria e mi scuso. La comunicazione in senso molto stretto non avviene fino a quando non viene stabilita una connessione TCP tra due endpoint (ovvero socket), ciascuno dei quali è identificato da un indirizzo di rete e una porta. Mi arrendo.
Peter Wone,

6

La porta era la parte più semplice, è solo un identificatore univoco per un socket. Un socket è qualcosa che i processi possono usare per stabilire connessioni e per comunicare tra loro. Tall Jeff aveva un'ottima analogia telefonica che non era perfetta, quindi ho deciso di risolverlo:

  • ip e porta ~ numero di telefono
  • presa ~ dispositivo telefonico
  • connessione ~ telefonata
  • stabilire una connessione ~ chiamando un numero
  • processi, applicazioni remote ~ persone
  • messaggi ~ discorso

Buoni chiarimenti (soprattutto se si considera la cronologia dei cambi telefonici che fa parte delle basi della terminologia della rete ..)
oɔɯǝɹ

Dai un'occhiata a un netstatdisplay qualche volta. Tutte le prese accettate da una presa di ascolto condividono la stessa porta. Ergo a port non è un identificatore univoco per un socket.
Marchese di Lorne,

6

Un'applicazione è costituita da una coppia di processi che comunicano sulla rete (coppia client-server). Questi processi inviano e ricevono messaggi, da e verso la rete attraverso un'interfaccia software chiamata socket . Considerando l'analogia presentata nel libro "Computer Networking: Top Down Approach". C'è una casa che vuole comunicare con un'altra casa. Qui, la casa è analoga a un processo e porta a una presa. Il processo di invio presuppone che dall'altra parte della porta sia presente un'infrastruttura che trasporterà i dati alla destinazione. Una volta che il messaggio è arrivato dall'altra parte, passa attraverso la porta del ricevitore (presa) nella casa (processo). Questa illustrazione dello stesso libro può aiutarti:
inserisci qui la descrizione dell'immagine
I socket fanno parte del livello di trasporto, che fornisce comunicazioni logiche alle applicazioni. Ciò significa che dal punto di vista dell'applicazione entrambi gli host sono direttamente collegati tra loro, anche se ci sono numerosi router e / o switch tra di loro. Quindi un socket non è una connessione in sé, è il punto finale della connessione. I protocolli del livello di trasporto sono implementati solo sugli host e non sui router intermedi.
Portsfornire mezzi di indirizzamento interno a una macchina. Lo scopo principale è consentire a più processi di inviare e ricevere dati sulla rete senza interferire con altri processi (i loro dati). Tutti i socket sono dotati di un numero di porta. Quando un segmento arriva a un host, il livello di trasporto esamina il numero di porta di destinazione del segmento. Inoltra quindi il segmento al socket corrispondente. Questo lavoro di consegna dei dati in un segmento del livello di trasporto al socket corretto è chiamato de-multiplexing . I dati del segmento vengono quindi inoltrati al processo collegato al socket.


5

Un socket è una struttura nel tuo software. È più o meno un file; ha operazioni come leggere e scrivere. Non è una cosa fisica; è un modo per il tuo software di riferirsi a cose fisiche.

Una porta è una cosa simile a un dispositivo. Ogni host ha una o più reti (quelle sono fisiche); un host ha un indirizzo su ogni rete. Ogni indirizzo può avere migliaia di porte.

Un solo socket può utilizzare una porta a un indirizzo. Il socket alloca la porta approssimativamente come allocare un dispositivo per l'I / O del file system. Una volta allocata la porta, nessun altro socket può connettersi a quella porta. La porta verrà liberata quando il socket è chiuso.

Dai un'occhiata alla terminologia TCP / IP .


3
Questa descrizione di socket è piuttosto fuori base. Un socket riguarda la connessione tra una coppia di tuple in cui una tupla fa riferimento a una coppia di ADDR IP e porta. Inoltre, molti socket possono connettersi alla stessa porta. Come pensi che un server web prenda più connessioni sulla porta 80? Questa è una risposta scadente
Tall Jeff,

1
Scusate. Prese multiple non sono collegate alla porta 80. Una presa è collegata e genera prese aggiuntive dove avviene il trasferimento reale. Vedi opengroup.org/onlinepubs/009695399/functions/listen.html .
S.Lott

1
In realtà, la descrizione su opengroup.org/onlinepubs/009695399/functions/connect.html è migliore. Il socket peer restituito da una connessione NON si trova sulla porta 80.
S.Lott

1
Questo post non è corretto sotto molti aspetti e fuorviante sotto diversi aspetti.
Peter Wone,

@Peter Wone: quali particolari? Quali aspetti? Spero di imparare dai miei errori.
S.Lott

5

da Oracle Java Tutorial :

Un socket è un endpoint di un collegamento di comunicazione bidirezionale tra due programmi in esecuzione sulla rete. Un socket è associato a un numero di porta in modo che il livello TCP possa identificare l'applicazione a cui sono destinati i dati da inviare.


Questo è solo un tutorial e certamente non un riferimento normativo.
Marchese di Lorne,

"Un socket è un endpoint di un collegamento di comunicazione bidirezionale" Non è una definizione socket, non un tutorial Java?
prayagupd,

@prayagupd Naturalmente è una definizione, ma proviene da un tutorial, non da una specifica.
Marchese di Lorne,

4

Porta e socket possono essere confrontati con la succursale bancaria.

Il numero di edificio della "Banca" è analogo all'indirizzo IP. Una banca ha diverse sezioni come:

  1. Reparto conto di risparmio
  2. Dipartimento prestiti personali
  3. Dipartimento di mutuo per la casa
  4. Dipartimento di reclamo

Quindi 1 (dipartimento del conto di risparmio), 2 (dipartimento del prestito personale), 3 (dipartimento del mutuo per la casa) e 4 (dipartimento per i reclami) sono porti.

Ora diciamo che vai ad aprire un conto di risparmio, vai in banca (indirizzo IP), quindi vai al "dipartimento del conto di risparmio" (numero porta 1), quindi incontri uno dei dipendenti che lavorano nel "dipartimento del conto di risparmio ". Chiamiamolo SAVINGACCOUNT_EMPLOYEE1 per l'apertura dell'account.

SAVINGACCOUNT_EMPLOYEE1 è il descrittore del socket, quindi potrebbero esserci SAVINGACCOUNT_EMPLOYEE1 su SAVINGACCOUNT_EMPLOYEEN. Questi sono tutti descrittori di socket.

Allo stesso modo, altri reparti avranno sotto il loro lavoro un dipendente e sono analoghi al socket.


3

Un socket è un meccanismo I / O di dati. Una porta è un concetto contrattuale di un protocollo di comunicazione . Un socket può esistere senza una porta. Una porta può esistere senza un socket specifico (ad esempio se più socket sono attivi sulla stessa porta, il che può essere consentito per alcuni protocolli).

Una porta viene utilizzata per determinare a quale socket il destinatario deve instradare il pacchetto, con molti protocolli, ma non è sempre necessario e la selezione del socket di ricezione può essere effettuata con altri mezzi: una porta è interamente uno strumento utilizzato dal gestore del protocollo in il sottosistema di rete. ad es. se un protocollo non utilizza una porta, i pacchetti possono andare a tutte le prese di ascolto o qualsiasi presa.


3

La terminologia relativa TCP / IP, che presumo sia implicita nella domanda. In parole povere:

Un PORT è come il numero di telefono di una casa particolare in un determinato codice postale. Il codice postale della città potrebbe essere considerato come l'indirizzo IP della città e di tutte le case di quella città.

D'altra parte, una PRESA è più simile a una telefonata stabilita tra telefoni di un paio di case che parlano tra loro. Tali chiamate possono essere stabilite tra case nella stessa città o due case in città diverse. È quel SOCKET il percorso temporaneo stabilito tra la coppia di telefoni che parlano tra loro.


2
Un socket è un endpoint. Esiste prima che venga stabilita una connessione (TCP) o in assenza di una connessione (UDP). Ergo non è esso stesso la connessione.
Marchese di Lorne,

2

In senso lato, Socket - è proprio questa, una presa, proprio come la tua presa elettrica, via cavo o telefonica. Un punto da cui "materiale necessario" (potenza, segnale, informazioni) può uscire e entrare. Nasconde molte cose dettagliate, che non sono necessarie per l'uso delle "cose ​​necessarie". Nel linguaggio del software, fornisce un modo generico per definire un meccanismo di comunicazione tra due entità (tali entità potrebbero essere qualsiasi cosa: due applicazioni, due dispositivi fisicamente separati, spazio utente e kernel all'interno di un sistema operativo, ecc.)

Una porta è un discriminatore di endpoint. Differenzia un endpoint da un altro. A livello di rete, differenzia un'applicazione da un'altra, in modo che lo stack di rete possa trasmettere informazioni all'applicazione appropriata.


2

Sono già state fornite risposte teoriche a questa domanda. Vorrei fare un esempio pratico di questa domanda, che chiarirà la tua comprensione di Socket e Port.

L'ho trovato qui

Questo esempio ti guiderà attraverso il processo di connessione a un sito Web, come Wiley. Aprire il browser Web (come Mozilla Firefox) e digitare www.wiley.com nella barra degli indirizzi. Il browser Web utilizza un server DNS (Domain Name System) per cercare il nome www.wiley.com per identificare il suo indirizzo IP. Per questo esempio, l'indirizzo è 192.0.2.100.

Firefox stabilisce una connessione all'indirizzo 192.0.2.100 e alla porta su cui è in esecuzione il server Web del livello applicazione. Firefox sa quale porta aspettarsi perché è una porta ben nota. La porta nota per un server Web è la porta TCP 80.

Il socket di destinazione che Firefox tenta di connettersi è scritto come socket: port o, in questo esempio, 192.0.2.100:80. Questo è il lato server della connessione, ma il server deve sapere dove inviare la pagina Web che si desidera visualizzare in Mozilla Firefox, quindi è disponibile anche un socket per il lato client della connessione.

La connessione lato client è composta dal tuo indirizzo IP, come 192.168.1.25, e da un numero di porta dinamica scelto casualmente. Il socket associato a Firefox sembra 192.168.1.25:49175. Poiché i server Web funzionano sulla porta TCP 80, entrambi questi socket sono socket TCP, mentre se ci si connettesse a un server che opera su una porta UDP, entrambi i socket server e client sarebbero socket UDP.


Citazione di qualità molto scadente. Il terzo paragrafo abusa della parola "socket" come se significasse "indirizzo IP". Non
Marchese di Lorne,

2

Socket è un'astrazione fornita dal kernel alle applicazioni utente per l'I / O dei dati. Un tipo di socket è definito dal protocollo la sua gestione, una comunicazione IPC ecc. Quindi, se qualcuno crea un socket TCP, può fare manipolazioni come leggere dati su socket e scrivere dati su di esso con metodi semplici e la gestione del protocollo di livello inferiore come conversioni TCP e l'inoltro dei pacchetti ai protocolli di rete di livello inferiore viene eseguito dalla particolare implementazione del socket nel kernel. Il vantaggio è che l'utente non deve preoccuparsi di gestire le nitigrità specifiche del protocollo e deve semplicemente leggere e scrivere i dati nel socket come un normale buffer. Lo stesso vale per IPC, l'utente legge e scrive i dati nel socket e il kernel gestisce tutti i dettagli di livello inferiore in base al tipo di socket creato.

La porta insieme all'IP è come fornire un indirizzo al socket, sebbene non sia necessario, ma aiuta nelle comunicazioni di rete.


2

Una singola porta può avere una o più prese collegate con diversi IP esterni come una presa elettrica multipla.

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312
  TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312
  TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312
  TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312

2

Socket è l'astrazione SW dell'endpoint di rete, utilizzato come interfaccia per l'applicazione. In Java, C # è rappresentato dall'oggetto, in Linux, Unix è un file.

La porta è solo una proprietà di un socket specificato se si desidera stabilire una comunicazione. Per ricevere un pacchetto da un socket, è necessario associarlo a una porta locale specifica e alla scheda NIC (con indirizzo IP locale) o a tutte le schede NIC (INADDR_ANY è specificato nella chiamata di bind). Per inviare il pacchetto, è necessario specificare la porta e l'IP del socket remoto.


1

Un socket è fondamentalmente un endpoint per la comunicazione di rete, costituito da almeno un indirizzo IP e una porta. In Java / C # un socket è un'implementazione di livello superiore di un lato di una connessione bidirezionale.

Inoltre, una definizione nella documentazione Java .


Nel Java Turorial, intendi.
Marchese di Lorne,

1

Porta:

Una porta può fare riferimento a un punto di connessione fisico per dispositivi periferici come porte seriali, parallele e USB. Il termine porta si riferisce anche ad alcuni punti di connessione Ethernet, come quelli su un hub, switch o router.

Socket:

Un socket rappresenta una singola connessione tra due applicazioni di rete. Queste due applicazioni funzionano nominalmente su computer diversi, ma i socket possono anche essere utilizzati per la comunicazione tra processi su un singolo computer. Le applicazioni possono creare più socket per comunicare tra loro. I socket sono bidirezionali, il che significa che entrambi i lati della connessione sono in grado di inviare e ricevere dati.


Una porta TCP o UDP non fa riferimento a nulla di fisico o ai punti di connessione Ethernet. Non hai risposto alla domanda.
Marchese di Lorne,

1

Una porta indica un endpoint di comunicazione nei trasporti TCP e UDP per il protocollo di rete IP. Un socket è un'astrazione software per un endpoint di comunicazione comunemente utilizzato nelle implementazioni di questi protocolli (socket API). Un'implementazione alternativa è l'API XTI / TLI.

Guarda anche:

Stevens, WR 1998, UNIX Programmazione di rete: API di rete: Socket e XTI; Volume 1, Prentice Hall.
Stevens, WR, 1994, TCP / IP Illustrated, Volume 1: The Protocols, Addison-Wesley.

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.