trójstronne uzgadnianie

Trzyetapowy proces (SYN, SYN-ACK, ACK), w którym dwa urządzenia nawiązują połączenie TCP przed wymianą danych.

Trójstronne uzgadnianie (ang. TCP three-way handshake) to trzyetapowa wymiana komunikatów, dzięki której dwa urządzenia nawiązują połączenie TCP, zanim wyślą sobie choćby bajt właściwych danych. Trzy etapy to SYN, SYN-ACK i ACK — stąd „trójstronne”. Celem jest, żeby obie strony potwierdziły, że nadają i odbierają, oraz uzgodniły początkowe numery sekwencyjne (ISN), na których oprą całą dalszą rozmowę.

Jak to działa

Wyobraź sobie, że klient chce się połączyć z serwerem. Najpierw wysyła pakiet z ustawioną flagą SYN i swoim losowym numerem sekwencyjnym (powiedzmy x). Serwer odpowiada pakietem SYN-ACK: potwierdza odbiór (ACK = x+1) i dorzuca własny numer sekwencyjny (y). Na koniec klient odsyła ACK (= y+1). Po tych trzech krokach połączenie jest established i można przesyłać dane.

Numery sekwencyjne nie są dekoracją — pozwalają TCP wykrywać zgubione, zduplikowane i pomieszane pakiety oraz układać je z powrotem w odpowiedniej kolejności. Bez uzgodnienia ISN na starcie obie strony nie wiedziałyby, od czego liczyć. To właśnie odróżnia TCP (połączeniowe, niezawodne) od UDP, które żadnego handshake’u nie robi i strzela pakietami „w ciemno”.

Przykład z praktyki

Najszybciej zobaczysz handshake w Wireshark albo przez tcpdump. Odpal nasłuch i otwórz dowolną stronę:

sudo tcpdump -i any -n 'tcp port 443 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'

Zobaczysz trzy linijki: Flags [S], potem Flags [S.] (SYN-ACK) i na końcu Flags [.] (czyste ACK). Jeśli chcesz tylko sprawdzić, czy port w ogóle przyjmuje połączenia, użyj nc -vz host 443 albo nmap — narzędzia te po cichu robią handshake za ciebie.

Częste błędy i mity

  • „SYN i ACK to to samo” — nie. To flagi w nagłówku TCP; w drugim kroku serwer ustawia obie naraz, dlatego są trzy pakiety, a nie cztery.
  • Mylenie z TLS handshake — TCP handshake nawiązuje połączenie, TLS dopiero potem szyfruje. To dwa różne etapy, jeden na drugim.
  • SYN flood — atak DoS, w którym napastnik zalewa serwer pakietami SYN i nigdy nie odsyła ACK, zapełniając kolejkę półotwartych połączeń. Obroną są SYN cookies.
  • Połączenie zamyka się osobnym mechanizmem (FIN/ACK, czasem zwany four-way handshake) — to nie to samo co otwieranie.

Pojęcia powiązane

TCP, UDP, model OSI, numery sekwencyjne (ISN), flagi TCP (SYN, ACK, FIN, RST), TLS handshake, SYN flood, port, gniazdo (socket), tcpdump, Wireshark.