Prima che TCP invii i dati dell'applicazione, deve stabilire lo stato su entrambe le estremità della connessione. Questo processo di configurazione è l'handshake a tre vie TCP. Succede così rapidamente che la maggior parte degli utenti non se ne accorge, ma quando i siti Web sembrano lenti, le porte sembrano chiuse o i firewall interrompono le applicazioni in modi strani, spesso la stretta di mano è il punto in cui inizia la storia.

L'handshake a tre vie TCP

I tre pacchetti sono:

  1. SIN dal cliente
  2. SYN-ACK dal server
  3. ACK dal cliente

Successivamente viene stabilita la connessione e inizia il normale trasferimento dei dati.

Spiegazione passo passo

1. Il client invia SYN

Il client dice, in effetti, "Voglio iniziare una connessione, ed ecco il mio numero di sequenza iniziale."

2. Il server risponde con SYN-ACK

Il server riconosce il numero di sequenza del client e restituisce il proprio numero di sequenza iniziale.

3. Il client invia ACK

Il client riconosce il numero di sequenza del server. A questo punto entrambe le parti concordano sullo stato di base necessario per scambiare dati in modo affidabile.

Perché TCP ha bisogno di una stretta di mano

La stretta di mano non è solo una cerimonia. Risolve problemi reali di protocollo:

  • conferma che entrambi gli endpoint possono inviare e ricevere
  • negozia il tracciamento della sequenza iniziale
  • impedisce che i pacchetti ritardati provenienti da sessioni precedenti vengano scambiati per traffico corrente
  • stabilisce lo stato necessario per una consegna affidabile

Senza questa configurazione, TCP non potrebbe fornire il comportamento del flusso ordinato e affidabile che le applicazioni si aspettano.

Perché TCP utilizza tre passaggi anziché due

Uno scambio in due fasi non dimostrerebbe pienamente che entrambe le parti sono pronte a trasmettere e riconoscere i reciproci numeri di sequenza. Il terzo pacchetto conferma che la risposta del server è stata ricevuta e che lo stato della connessione è sincronizzato in entrambe le direzioni.

Ecco perché la stretta di mano è "a tre" e non semplicemente una coppia richiesta-risposta.

Cosa succede quando la stretta di mano fallisce

I fallimenti nella stretta di mano di solito rientrano in alcuni schemi riconoscibili.

SYN inviato, nessuna risposta

Possibili cause:

  • l'host di destinazione non è disponibile
  • il firewall rilascia silenziosamente i pacchetti
  • IP o porta errati
  • problema di instradamento nel percorso

Sintomi comuni:

  • timeout della connessione
  • il browser gira per un po', poi fallisce
  • telnet oppure l'app client si blocca prima di arrendersi

SYN inviato, RST restituito

Possibili cause:

  • il porto è chiuso
  • il servizio non è in ascolto
  • il firewall è configurato per rifiutare invece di eliminare

Sintomo comune:

  • immediato "connessione rifiutata"

Appaiono SYN e SYN-ACK, quindi la sessione termina

Possibili cause:

  • percorso asimmetrico
  • problema con il firewall con stato
  • Dispositivo NAT rotto
  • configurazione errata del bilanciatore del carico
  • Prodotto di sicurezza basato su host che interferisce dopo l'accettazione iniziale

Come appare la stretta di mano in Wireshark

Se acquisisci traffico in Wireshark, un avvio TCP sano di solito assomiglia a:

  • SYN
  • SYN, ACK
  • ACK

Se vedi solo pacchetti SYN ritrasmessi ripetutamente, la risposta del server non arriverà mai. Se vedi un RST, la destinazione ha rifiutato attivamente la connessione. Questa visibilità è il motivo per cui le acquisizioni di pacchetti sono così utili per la risoluzione dei problemi di rete.

Perché le strette di mano sono importanti per le prestazioni

Ogni connessione TCP inizia con almeno un viaggio di andata e ritorno prima che inizi il flusso di dati.

Se la latenza è 100 ms:

  • la stretta di mano costa circa un viaggio di andata e ritorno
  • Successivamente TLS aggiunge ulteriori negoziazioni
  • le connessioni di breve durata sembrano notevolmente più lente

Questo è uno dei motivi per cui la moderna ottimizzazione delle prestazioni si preoccupa del riutilizzo della connessione, del comportamento keep-alive HTTP, dei CDN e dei protocolli come HTTP/2 e HTTP/3.

TCP Handshake e TLS non sono la stessa cosa

Questa è una comune fonte di confusione.

  • Stretta di mano TCP stabilisce la connessione di trasporto.
  • Stretta di mano TLS negozia la crittografia e l'attendibilità dei certificati su tale connessione.

Quindi quando apri un sito HTTPS, il sistema solitamente esegue:

  1. Stretta di mano TCP
  2. Stretta di mano TLS
  3. Richiesta e risposta HTTP

Se un sito è lento ad "iniziare a caricarsi", il ritardo potrebbe riguardare uno dei due livelli di handshake.

Relazione con la scansione delle porte

Molti scanner si affidano al comportamento dell'handshake:

  • SYN-ACK spesso significa che la porta è aperta
  • RST solitamente significa chiuso
  • nessuna risposta spesso significa filtrato o eliminato

Ciò rende l'handshake centrale non solo per il networking, ma anche per l'enumerazione e i test di sicurezza.

SYN Attacchi Flood

Un flusso SYN abusa dell'handshake inviando un gran numero di pacchetti SYN senza completare l'ACK finale. Il server alloca risorse per molte sessioni semiaperte e può essere sopraffatto.

Attenuazioni comuni:

  • Biscotti SYN
  • limitazione della velocità
  • filtraggio a monte
  • protezioni firewall
  • Ottimizzazione del bilanciamento del carico

Lo smontaggio della connessione è diverso

L'avvio di una sessione utilizza l'handshake a tre vie. La chiusura di solito utilizza un processo diverso che coinvolge i pacchetti FIN e ACK in entrambe le direzioni.

Lo smontaggio è importante quando il debug dei socket è bloccato TIME_WAIT o CLOSE_WAIT, ma è separato dall'handshake di connessione iniziale.

Conclusione

L'handshake TCP è l'avvio in tre fasi per una comunicazione TCP affidabile:

  • SIN
  • SYN-ACK
  • ACK

È importante perché ogni richiesta web, sessione SSH, connessione al database o chiamata API costruita su TCP dipende da questo. Se una connessione scade, viene rifiutata o sembra lenta prima che i dati vengano spostati, l'handshake è uno dei primi luoghi su cui indagare.