TCP - Handshake a tre vie, quale porta?

6

Sto cercando di capire l'handshake a tre vie nell'impostazione della connessione TCP. Il mio libro afferma che il client contatta prima il server, diciamo che vogliamo una connessione HTTP, quindi invia un SYN alla porta 80. (1)

Il server risponde quindi a un pacchetto SYN ACK. (Ecco la mia domanda) (2)

E ora il client invia un ACK finale. (3)

Nel libro il grafico mostra che (2) passa dal socket del server alla cartella del client iniziale. Quindi il grafico mostra che (3) va dal socket del client a "Welcoming Socket". Il socket di benvenuto non è lo stesso del socket di connessione da (2).

Ho scaricato il http.cap dal wiki di Wireshark e sto dando un'occhiata ai 3 pacchetti iniziali. Qui abbiamo il SYN con la porta 3372 - > 80 quindi un SYNACK 80 - > 3372 e infine ACK 3372 - > 80 (con potenziali dati già).

Ciò che mi confonde è che l'ACK finale va anche alla porta 80 sul server. Ho pensato che abbiamo creato un nuovo socket di benvenuto con una nuova porta, in modo che il socket di connessione con la porta 80 possa continuare ad ascoltare nuove connessioni.

    
posta spooky 28.01.2016 - 12:34
fonte

2 risposte

4

Il tuo libro parla dell'interfaccia di sistema per i socket, che è un po 'diversa dal vero socket TCP.

RFC TCP non dice "socket accogliente".

Quindi, diamo un'occhiata alle definizioni. Da RFC:

The "three-way handshake" is the procedure used to establish a connection.

Quindi, qual è la connessione?

connection - A logical communication path identified by a pair of sockets.

Ok, quindi ora abbiamo bisogno di sapere cos'è il socket. Trovato:

socket - An address which specifically includes a port identifier, that is, the concatenation of an Internet Address with a TCP port.

Quindi il socket TCP è solo una coppia <address, port> che può accettare connessioni, che devono essere stabilite con three-way handshake . Quale è l'invio tra questi due socket (e poiché port è parte del socket, non c'è una porta di benvenuto).

Che cos'è questo "socket accogliente"?

La maggior parte dei sistemi (ad esempio Linux) utilizza un modello un po 'più astratto, che è reso più facile da usare per i programmatori. (Quindi non dobbiamo scrivere sulla stessa struttura per ogni connessione.)

Per prima cosa creiamo abstract socket che rappresenta il nostro server addr / port (il cosiddetto welcoming socket ), e poi, quando qualcuno si connette ad esso, otteniamo (tramite accept () ) dal nostro sistema operativo un socket astratto che rappresenta la nostra connessione tra client e server .

Ciò causa alcuni fraintendimenti ...

    
risposta data 28.01.2016 - 13:08
fonte
3

Il socket restituito da accept mantiene la stessa porta su cui si stava ascoltando originariamente.

Solo l'intero (indirizzo client: porta, indirizzo server: porta) 4-tupla deve essere univoco, e il client end è già univoco, quindi il server non ha bisogno di sprecare un numero di porta effimero.

Per inciso, questo rende anche molto più facile vedere, ad es. tutti i tuoi socket HTTP usando netstat, dato che avranno tutti un 80 nella porta.

    
risposta data 28.01.2016 - 14:10
fonte

Leggi altre domande sui tag