Misteri chiave delle connessioni TCP del Network Packet Broker: svelata la necessità del Triple Handshake

Impostazione della connessione TCP
Quando navighiamo sul web, inviamo un'email o giochiamo online, spesso non pensiamo alla complessa connessione di rete che sta dietro a tutto questo. Tuttavia, sono proprio questi passaggi apparentemente piccoli a garantire una comunicazione stabile tra noi e il server. Uno dei passaggi più importanti è la configurazione della connessione TCP, il cui fulcro è il three-way handshake.

Questo articolo discuterà in dettaglio il principio, il processo e l'importanza dell'handshake a tre vie. Spiegheremo passo dopo passo perché è necessario, come garantisce stabilità e affidabilità della connessione e quanto sia importante per il trasferimento dati. Con una comprensione più approfondita dell'handshake a tre vie, acquisiremo una migliore comprensione dei meccanismi alla base della comunicazione di rete e 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 la creazione di una connessione prima della trasmissione dei dati. Questo processo di creazione della connessione avviene tramite un handshake a tre vie.

 Stretta di mano TCP a tre vie

Diamo un'occhiata più da vicino ai pacchetti TCP inviati in ogni connessione.

Inizialmente, sia il client che il server sono chiusi. Innanzitutto, il server è in ascolto attivo su una porta ed è nello stato LISTEN, il che significa che deve essere avviato. Successivamente, il client è pronto per accedere alla pagina web. Deve stabilire una connessione con il server. Il formato del primo pacchetto di connessione è il seguente:

 Pacchetto SYN

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. Allo stesso tempo, il client imposta la posizione del flag SYN a 1 per indicare che il pacchetto in uscita è un pacchetto SYN. ​​Il client indica che desidera stabilire una connessione con il server inviandogli il primo pacchetto SYN. ​​Questo pacchetto non contiene dati a livello applicativo (ovvero dati inviati). A questo punto, lo stato del client è contrassegnato come SYN-SENT.

Pacchetto SYN+ACK

Quando un server riceve un pacchetto SYN da un client, inizializza casualmente il proprio numero seriale (server_isn) e lo inserisce nel campo "Numero seriale" dell'intestazione TCP. Successivamente, il server inserisce client_isn + 1 nel campo "Numero di conferma" e imposta entrambi i bit SYN e ACK a 1. Infine, il server invia il pacchetto al client, che non contiene dati a livello di applicazione (e nessun dato da inviare al server). In questo momento, il server si trova nello stato SYN-RCVD.

Pacchetto ACK

Una volta ricevuto il pacchetto dal server, il client deve eseguire le seguenti ottimizzazioni per rispondere al pacchetto di risposta finale: innanzitutto, il client imposta il bit ACK dell'intestazione TCP del pacchetto di risposta a 1; in secondo luogo, il client inserisce il valore server_isn + 1 nel campo "Conferma numero di risposta"; infine, il client invia il pacchetto al server. Questo pacchetto può trasportare dati dal client al server. Al termine di queste operazioni, il client entrerà nello stato ESTABLISHED.

Una volta ricevuto il pacchetto di risposta dal client, il server passa anche allo stato ESTABLISHED.

Come si può vedere dal processo sopra descritto, quando si esegue un three-way handshake, il terzo handshake può trasportare dati, ma i primi due no. Questa è una domanda che viene spesso posta durante le interviste. Una volta completato il three-way handshake, entrambe le parti entrano nello stato ESTABLISHED, a indicare che la connessione è stata stabilita correttamente, a quel punto il client e il server possono iniziare a scambiarsi dati.

Perché tre strette di mano? Non due, quattro?
La risposta comune è: "Perché la stretta di mano a tre vie garantisce la possibilità di ricevere e inviare". Questa risposta è corretta, ma rappresenta solo la ragione superficiale e non quella principale. Di seguito, analizzerò le ragioni della tripla stretta di mano da tre punti di vista per approfondire la nostra comprensione di questo argomento.

L'handshake a tre vie può efficacemente evitare l'inizializzazione di connessioni ripetute storicamente (il motivo principale)
La stretta di mano a tre vie garantisce che entrambe le parti abbiano ricevuto un numero di sequenza iniziale affidabile.
La stretta di mano a tre vie evita lo spreco di risorse.

Motivo 1: evitare unioni duplicate storiche
In breve, la ragione principale dell'handshake a tre vie è evitare la confusione causata dalla vecchia inizializzazione della connessione duplicata. In un ambiente di rete complesso, la trasmissione dei pacchetti di dati non viene sempre inviata all'host di destinazione entro i tempi specificati, e i vecchi pacchetti di dati potrebbero arrivare prima all'host di destinazione a causa della congestione della rete e di altri motivi. Per evitare ciò, TCP utilizza un handshake a tre vie per stabilire la connessione.

l'handshake a tre vie evita connessioni duplicate storiche

Quando un client invia più pacchetti di stabilimento di connessione SYN in successione, in situazioni come la congestione della rete, può verificarsi quanto segue:

1- I vecchi pacchetti SYN arrivano al server prima dei pacchetti SYN più recenti.
2- Il server risponderà al client con un pacchetto SYN + ACK dopo aver ricevuto il vecchio pacchetto SYN.
3- Quando il client riceve il pacchetto SYN + ACK, determina che la connessione è una connessione storica (numero di sequenza scaduto o timeout) in base al proprio contesto, quindi invia il pacchetto RST al server per interrompere la connessione.

Con una connessione a due handshake, non è possibile determinare se la connessione corrente sia una connessione storica. L'handshake a tre vie consente al client di determinare se la connessione corrente sia una connessione storica in base al contesto in cui è 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 con successo la connessione.

Pertanto, il motivo principale per cui TCP utilizza l'handshake a tre vie è che inizializza la connessione per impedire connessioni storiche.

Motivo 2: Per sincronizzare i numeri di sequenza iniziali di entrambe le parti
Entrambe le parti del protocollo TCP devono mantenere un numero di sequenza, fattore chiave per garantire una trasmissione affidabile. I numeri di sequenza svolgono un ruolo importante nelle connessioni TCP. Esse 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 dati ricevuto dall'altra parte, consentendo una trasmissione affidabile dei dati.

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 indica l'avvenuta ricezione del pacchetto SYN del client. Successivamente, il server invia il pacchetto SYN con il numero di sequenza iniziale al client e attende la risposta del client, una volta per tutte, per garantire che i numeri di sequenza iniziali siano sincronizzati in modo affidabile.

Sincronizzare i numeri di serie iniziali di entrambe le parti

Sebbene sia possibile anche un handshake a quattro vie per sincronizzare in modo affidabile i numeri di sequenza iniziali di entrambe le parti, il secondo e il terzo passaggio possono essere combinati in un unico passaggio, dando origine a un handshake a tre vie. Tuttavia, i due handshake possono garantire solo che il numero di sequenza iniziale di una parte venga ricevuto correttamente dall'altra, ma non vi è alcuna garanzia che il numero di sequenza iniziale di entrambe le parti possa essere confermato. Pertanto, l'handshake a tre vie è la scelta migliore per garantire la stabilità e l'affidabilità delle connessioni TCP.

Motivo 3: evitare di sprecare risorse
In caso di un solo "two-handshake", quando la richiesta SYN del client è bloccata nella rete, il client non può ricevere il pacchetto ACK inviato dal server, quindi il SYN verrà reinviato. Tuttavia, poiché non esiste un terzo handshake, il server non può determinare se il client ha ricevuto un riscontro ACK per stabilire la connessione. Pertanto, il server può stabilire una connessione in modo proattivo solo dopo aver ricevuto ogni richiesta SYN. ​​Questo porta a 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 ridondanti non valide dopo aver ricevuto la richiesta. Ciò comporta un inutile spreco di risorse del server.

Conservazione dei messaggi: a causa dell'assenza di un terzo handshake, il server non ha modo di sapere se il client ha ricevuto correttamente l'ACK per stabilire la connessione. Di conseguenza, se i messaggi rimangono bloccati nella rete, il client continuerà a inviare richieste SYN ripetutamente, costringendo il server a stabilire costantemente nuove connessioni. Ciò aumenterà la congestione e i ritardi della rete, influendo negativamente sulle prestazioni complessive della rete.

Evitare di sprecare risorse

Pertanto, per garantire la stabilità e l'affidabilità della connessione di rete, TCP utilizza l'handshake a tre vie per stabilire la connessione ed evitare il verificarsi di questi problemi.

Riepilogo
ILBroker di pacchetti di reteLa connessione TCP viene stabilita tramite un handshake a tre vie. Durante l'handshake a tre vie, il client invia innanzitutto un pacchetto con il flag SYN al server, indicando che desidera stabilire una connessione. Dopo aver ricevuto la richiesta dal client, il server risponde al client con un pacchetto con i flag SYN e ACK, indicando che la richiesta di connessione è stata accettata, e invia il proprio numero di sequenza iniziale. Infine, il client risponde con un flag ACK al server per indicare che la connessione è stata stabilita correttamente. Pertanto, le due parti si trovano nello stato ESTABLISHED e possono iniziare a scambiarsi dati.

In generale, il processo di handshake a tre vie per stabilire una connessione TCP è progettato per garantire stabilità e affidabilità della connessione, evitare confusione e spreco di risorse sulle connessioni storiche e garantire che entrambe le parti siano in grado di ricevere e inviare dati.


Data di pubblicazione: 08-01-2025