Questa è stata una domanda sollevata da uno degli ingegneri del software nella mia organizzazione. Sono interessato alla definizione più ampia.
Questa è stata una domanda sollevata da uno degli ingegneri del software nella mia organizzazione. Sono interessato alla definizione più ampia.
Risposte:
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 .
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:80
e 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.
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.
Una presa è composta da tre cose:
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:
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
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 :)
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:
TCP contiene, tra l'altro, il concetto di porte . Si tratta di endpoint di dati effettivamente diversi sullo stesso indirizzo IP a cui AF_INET
può 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 sockaddr
strutture, 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:
/var/run/database.sock
.Ecco! Questo mette in ordine le cose. Quindi nel nostro schema allora,
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;)
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?)
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.
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).
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.
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.
Questi sono concetti di base della rete, quindi li spiegherò in modo semplice ma completo per capire nei dettagli.
Quindi un socket in rete è un dispositivo di comunicazione virtuale associato a una coppia (ip, porta) = (indirizzo, servizio).
Nota:
Spero che ti chiarisca i dubbi
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
...
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.
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.
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.
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:
netstat
display 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.
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:
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.
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 .
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.
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:
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.
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.
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.
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.
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.
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.
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
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.
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 .
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 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.