Configurazione della connessione TCP
Quando navighiamo sul Web, inviamo un'e-mail o giochiamo a un gioco online, spesso non pensiamo alla complessa connessione di rete che sta dietro. Tuttavia, sono questi passi apparentemente piccoli che garantiscono una comunicazione stabile tra noi e il server. Uno dei passaggi più importanti è l'impostazione della connessione TCP e il nucleo di questo è l'handshake a tre vie.
Questo articolo discuterà in dettaglio il principio, il processo e l'importanza della stretta di mano a tre. Passo dopo passo spiegheremo perché è necessario l'handshake a tre vie, come garantisce stabilità e affidabilità della connessione e quanto è importante per il trasferimento dei dati. Con una comprensione più approfondita dell'handshake a tre vie, acquisiremo una migliore comprensione dei meccanismi sottostanti 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 della connessione prima della trasmissione dei dati. Questo processo di creazione della connessione viene eseguito tramite un handshake a tre vie.
Diamo uno sguardo più da vicino ai pacchetti TCP inviati in ciascuna 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 il server deve essere avviato. Successivamente, il client è pronto per iniziare ad accedere alla pagina Web. È necessario 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. Allo stesso tempo, il client imposta la posizione del flag SYN su 1 per indicare che il pacchetto in uscita è un pacchetto SYN. Il client indica che desidera stabilire una connessione con il server inviando il primo pacchetto SYN al server. Questo pacchetto non contiene dati a livello di applicazione (ovvero dati inviati). A questo punto lo stato del client è contrassegnato come SYN-SENT.
Quando un server riceve un pacchetto SYN da un client, inizializza in modo casuale il proprio numero di serie (server_isn) e quindi inserisce quel numero nel campo "Numero di serie" dell'intestazione TCP. Successivamente, il server inserisce client_isn + 1 nel campo "Numero di riconoscimento" e imposta entrambi i bit SYN e ACK su 1. Infine, il server invia il pacchetto al client, che non contiene dati a livello di applicazione (e nessun dato per il server inviare). In questo momento, il server è nello stato SYN-RCVD.
Una volta che il client riceve il pacchetto dal server, deve eseguire le seguenti ottimizzazioni per rispondere al pacchetto di risposta finale: innanzitutto, il client imposta su 1 il bit ACK dell'intestazione TCP del pacchetto di risposta; 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 che il server riceve il pacchetto di risposta dal client, passa anche allo stato ESTABLISHED.
Come puoi vedere dal processo sopra, quando si esegue un handshake a tre, il terzo può trasportare dati, ma i primi due no. Questa è una domanda che viene posta spesso nelle interviste. Una volta completato l'handshake a tre, entrambe le parti entrano nello stato ESTABLISHED, indicando che la connessione è stata stabilita con successo, a quel punto il client e il server possono iniziare a scambiarsi dati.
Perché tre strette di mano? Non due, quattro volte?
La risposta comune è: "Perché l'handshake a tre vie garantisce la capacità di ricevere e inviare". Questa risposta è corretta, ma è solo la ragione superficiale, non adduce la ragione principale. Di seguito analizzerò le ragioni della tripla stretta di mano sotto tre aspetti per approfondire la nostra comprensione di questo problema.
L'handshake a tre vie può effettivamente evitare l'inizializzazione di connessioni storicamente ripetute (il motivo principale)
L'handshake 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 poche parole, il motivo principale dell'handshake a tre vie è evitare 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 in base al tempo specificato e i vecchi pacchetti di dati potrebbero arrivare prima all'host di destinazione a causa della congestione della rete e per altri motivi. Per evitare ciò, TCP utilizza un handshake a tre vie per stabilire la connessione.
Quando un client invia più pacchetti SYN per stabilire la connessione in successione, in situazioni come la congestione della rete, può verificarsi quanto segue:
1- I vecchi pacchetti SYN arrivano al server prima degli ultimi pacchetti SYN.
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 è una connessione cronologica. L'handshake a tre vie consente al client di determinare se la connessione corrente è una connessione storica in base al contesto quando è pronto per 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: 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. Eseguono le seguenti operazioni:
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 che è stato ricevuto dall'altra parte, consentendo una trasmissione affidabile dei dati.
Pertanto, dopo aver stabilito 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 la corretta ricezione del pacchetto SYN del client. Quindi, il server invia il pacchetto SYN con il numero di sequenza iniziale al client e attende che il client risponda, una volta per tutte, per garantire che i numeri di sequenza iniziali siano sincronizzati in modo affidabile.
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, risultando in un handshake a tre vie. Tuttavia, i due handshake possono solo garantire che il numero di sequenza iniziale di una delle parti venga ricevuto con successo dall'altra parte, 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 da adottare per garantire la stabilità e l’affidabilità delle connessioni TCP.
Motivo 3: evitare di sprecare risorse
Se c'è solo un "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 riconoscimento ACK per stabilire la connessione. Pertanto, il server può stabilire in modo proattivo una connessione solo dopo aver ricevuto ciascuna richiesta SYN. Ciò 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ò porta ad un inutile spreco di risorse del server.
Conservazione del messaggio: 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 richieste SYN ancora e ancora, facendo sì che il server stabilisca costantemente nuove connessioni. Ciò aumenterà la congestione e i ritardi della rete e influirà negativamente sulle prestazioni complessive della rete.
Pertanto, al fine di 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 creazione della connessione TCP viene eseguita con un handshake a tre vie. Durante l'handshake a tre vie, il client invia prima 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 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 con successo. 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 la 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.
Orario di pubblicazione: 08 gennaio 2025