Configurazione della connessione TCP
Quando navighiamo sul web, inviamo un'e-mail o giochiamo online, spesso non pensiamo alla complessa connessione di rete che si cela dietro a tutto ciò. Eppure, sono proprio questi passaggi apparentemente insignificanti a garantire una comunicazione stabile tra noi e il server. Uno dei passaggi più importanti è la configurazione della connessione TCP, il cui fulcro è la fase di handshake a tre vie.
Questo articolo tratterà in dettaglio il principio, il processo e l'importanza dell'handshake a tre vie. Passo dopo passo, spiegheremo perché l'handshake a tre vie è necessario, come garantisce la stabilità e l'affidabilità della connessione e quanto sia importante per il trasferimento dei dati. Una comprensione più approfondita dell'handshake a tre vie ci permetterà di comprendere meglio i meccanismi alla base della comunicazione di rete e di avere una visione più chiara dell'affidabilità delle connessioni TCP.
Processo di handshake a tre vie TCP e transizioni di stato
TCP è un protocollo di trasporto orientato alla connessione, che richiede l'instaurazione di una connessione prima della trasmissione dei dati. Questo processo di instaurazione della connessione avviene tramite un handshake a tre vie.
Analizziamo più da vicino i pacchetti TCP inviati in ogni connessione.
Inizialmente, sia il client che il server sono CHIUSI. Innanzitutto, il server è in ascolto attivo su una porta e si trova nello stato LISTEN, il che significa che il server deve essere avviato. Successivamente, il client è pronto per iniziare ad accedere alla pagina web. Deve stabilire una connessione con il server. Il formato del primo pacchetto di connessione è il seguente:
Quando un client avvia una connessione, genera un numero di sequenza iniziale casuale (client_isn) e lo inserisce nel campo "Numero di sequenza" dell'intestazione TCP. Contemporaneamente, il client imposta la posizione del flag SYN a 1 per indicare che il pacchetto in uscita è un pacchetto SYN. Il client indica la sua intenzione di stabilire una connessione con il server inviando il primo pacchetto SYN al server. Questo pacchetto non contiene dati a livello applicativo (ovvero, dati inviati). A questo punto, lo stato del client viene contrassegnato come SYN-SENT.
Quando un server riceve un pacchetto SYN da un client, inizializza casualmente il proprio numero di serie (server_isn) e lo inserisce nel campo "Numero di serie" dell'intestazione TCP. Successivamente, il server inserisce client_isn + 1 nel campo "Numero di riconoscimento" e imposta i bit SYN e ACK a 1. Infine, il server invia il pacchetto al client, che non contiene dati a livello applicativo (e nessun dato da inviare per il server). In questa fase, il server si trova nello stato SYN-RCVD.
Una volta ricevuto il pacchetto dal server, il client deve eseguire le seguenti ottimizzazioni per rispondere al pacchetto di risposta finale: innanzitutto, imposta il bit ACK dell'intestazione TCP del pacchetto di risposta a 1; in secondo luogo, inserisce il valore server_isn + 1 nel campo "Numero di risposta di conferma"; infine, invia il pacchetto al server. Questo pacchetto può trasportare dati dal client al server. Al termine di queste operazioni, il client passerà allo stato ESTABLISHED.
Una volta ricevuto il pacchetto di risposta dal client, il server passa anch'esso allo stato ESTABLISHED.
Come si può notare dal processo descritto sopra, durante un handshake a tre vie, il terzo handshake può trasportare dati, mentre i primi due no. Questa è una domanda che viene spesso posta durante i colloqui di lavoro. Una volta completato l'handshake a tre vie, entrambe le parti passano allo stato ESTABLISHED, a indicare che la connessione è stata stabilita con successo, a quel punto client e server possono iniziare a scambiarsi dati.
Perché tre strette di mano? Non due, ma quattro?
La risposta più comune è: "Perché la stretta di mano a tre garantisce la possibilità di ricevere e inviare". Questa risposta è corretta, ma è solo una spiegazione superficiale e non coglie la ragione principale. Di seguito, analizzerò le ragioni della stretta di mano a tre vie da tre punti di vista diversi, per approfondire la nostra comprensione di questo argomento.
La stretta di mano a tre vie può evitare efficacemente l'inizializzazione di connessioni ripetute in passato (il motivo principale)
La stretta di mano a tre garantisce che entrambe le parti abbiano ricevuto un numero di sequenza iniziale affidabile.
La stretta di mano a tre evita lo spreco di risorse.
Motivo 1: Evitare join duplicati storici
In sintesi, il motivo principale dell'handshake a tre vie è evitare la confusione causata da vecchie inizializzazioni di connessione duplicate. In un ambiente di rete complesso, la trasmissione dei pacchetti di dati non sempre avviene all'host di destinazione nei tempi previsti, e i vecchi pacchetti di dati potrebbero arrivare per primi a causa della congestione della rete o di altri motivi. Per evitare ciò, TCP utilizza un handshake a tre vie per stabilire la connessione.
Quando un client invia più pacchetti SYN di stabilimento della connessione in successione, in situazioni come la congestione della rete, possono verificarsi i seguenti eventi:
1- I vecchi pacchetti SYN arrivano al server prima degli ultimi pacchetti SYN.
2- Il server invierà un pacchetto SYN + ACK al client dopo aver ricevuto il vecchio pacchetto SYN.
3- Quando il client riceve il pacchetto SYN + ACK, determina, in base al proprio contesto, che la connessione è una connessione storica (numero di sequenza scaduto o timeout) e quindi invia il pacchetto RST al server per interrompere la connessione.
Con una connessione a due fasi di handshake, non c'è modo di determinare se la connessione corrente sia una connessione storica. L'handshake a tre fasi consente al client di determinare se la connessione corrente è una connessione storica in base al contesto quando è pronto a inviare il terzo pacchetto:
1- Se si tratta di una connessione storica (numero di sequenza scaduto o timeout), il pacchetto inviato dal terzo handshake è un pacchetto RST per interrompere la connessione storica.
2- Se non si tratta di una connessione storica, il pacchetto inviato per la terza volta è un pacchetto ACK e le due parti comunicanti stabiliscono correttamente la connessione.
Pertanto, il motivo principale per cui TCP utilizza l'handshake a tre vie è che inizializza la connessione per prevenire connessioni pregresse.
Motivo 2: Per sincronizzare i numeri di sequenza iniziali di entrambe le parti
Entrambi i lati del protocollo TCP devono mantenere un numero di sequenza, che è un fattore chiave per garantire una trasmissione affidabile. I numeri di sequenza svolgono un ruolo importante nelle connessioni TCP. Essi svolgono le seguenti funzioni:
Il ricevitore può eliminare i dati duplicati e garantire l'accuratezza dei dati.
Il ricevitore può ricevere i pacchetti nell'ordine del numero di sequenza per garantire l'integrità dei dati.
● Il numero di sequenza può identificare il pacchetto di dati ricevuto dall'altra parte, consentendo una trasmissione dati affidabile.
Pertanto, una volta stabilita una connessione TCP, il client invia pacchetti SYN con il numero di sequenza iniziale e richiede al server di rispondere con un pacchetto ACK che indichi la corretta ricezione del pacchetto SYN del client. Successivamente, il server invia al client il pacchetto SYN con il numero di sequenza iniziale e attende la risposta del client, una volta per tutte, per garantire che i numeri di sequenza iniziali siano sincronizzati in modo affidabile.
Sebbene sia possibile sincronizzare in modo affidabile i numeri di sequenza iniziali di entrambe le parti anche con un handshake a quattro vie, il secondo e il terzo passaggio possono essere combinati in un unico passaggio, dando luogo a un handshake a tre vie. Tuttavia, i due handshake garantiscono solo che il numero di sequenza iniziale di una parte venga ricevuto correttamente dall'altra, ma non garantiscono la conferma del numero di sequenza iniziale di entrambe le parti. Pertanto, l'handshake a tre vie rappresenta la scelta migliore per garantire la stabilità e l'affidabilità delle connessioni TCP.
Motivo 3: Evitare di sprecare risorse
Se è previsto solo un "handshake a due fasi", quando la richiesta SYN del client viene bloccata nella rete, il client non può ricevere il pacchetto ACK inviato dal server, quindi il SYN verrà reinviato. Tuttavia, poiché non è previsto un terzo handshake, il server non può determinare se il client ha ricevuto una conferma ACK per stabilire la connessione. Pertanto, il server può stabilire una connessione solo in modo proattivo dopo aver ricevuto ogni richiesta SYN. Ciò comporta quanto segue:
Spreco di risorse: se la richiesta SYN del client viene bloccata, con conseguente trasmissione ripetuta di più pacchetti SYN, il server stabilirà più connessioni non valide e ridondanti dopo aver ricevuto la richiesta. Ciò comporta un inutile spreco di risorse del server.
Persistenza dei messaggi: a causa della mancanza di un terzo handshake, il server non ha modo di sapere se il client ha ricevuto correttamente la conferma ACK per stabilire la connessione. Di conseguenza, se i messaggi rimangono bloccati nella rete, il client continuerà a inviare ripetutamente richieste SYN, costringendo il server a stabilire continuamente nuove connessioni. Ciò aumenterà la congestione e il ritardo della rete, influenzando negativamente le prestazioni complessive della rete.
Pertanto, al fine di garantire la stabilità e l'affidabilità della connessione di rete, TCP utilizza il protocollo di handshake a tre vie per stabilire la connessione ed evitare il verificarsi di questi problemi.
Riepilogo
ILBroker di pacchetti di reteLa creazione di una connessione TCP avviene tramite un handshake a tre vie. Durante l'handshake, il client invia innanzitutto un pacchetto con il flag SYN al server, indicando la sua intenzione di stabilire una connessione. Dopo aver ricevuto la richiesta dal client, il server risponde con un pacchetto contenente i flag SYN e ACK, indicando che la richiesta di connessione è stata accettata e inviando il proprio numero di sequenza iniziale. Infine, il client risponde al server con un flag ACK per indicare che la connessione è stata stabilita con successo. A questo punto, entrambe le parti si trovano nello stato ESTABLISHED e possono iniziare a scambiarsi dati.
In generale, il processo di handshake a tre vie per la creazione di una connessione TCP è progettato per garantire la stabilità e l'affidabilità della connessione, evitare confusione e spreco di risorse a causa di connessioni pregresse e assicurare che entrambe le parti siano in grado di ricevere e inviare dati.
Data di pubblicazione: 08-gen-2025






