Что такое трехстороннее рукопожатие TCP

Ответ

TCP использует трехстороннее рукопожатие (SYN, SYN-ACK, ACK) для установки надежного соединения:

  1. SYN: Клиент отправляет SYN (synchronize) пакет с начальным номером последовательности (ISN) серверу.
  2. SYN-ACK: Сервер отвечает SYN-ACK (synchronize-acknowledge), подтверждая получение SYN и отправляя свой ISN.
  3. ACK: Клиент отправляет ACK (acknowledge), подтверждая получение SYN-ACK.

Пример кода (псевдо):

// Клиент
client.send(SYN, seq=x);
// Сервер
server.send(SYN-ACK, seq=y, ack=x+1);
// Клиент
client.send(ACK, ack=y+1);

После этого соединение считается установленным. Это гарантирует, что обе стороны готовы к передаче данных и синхронизированы.

Ответ 18+ 🔞

Да ты посмотри, какая хитрая жопа у этих сетей! Чтобы два компьютера начали болтать, им надо не просто "привет" кинуть, а целый ритуал, трёхэтапное рукопожатие, ёпта!

Представь, один чувак (клиент) такой: "Эй, сервак, давай общаться? Мой начальный номер — X". Это он SYN-пакет шлёт, типа синхронизируемся.

Сервер получает, думает: "Э, бошка, думай... окей". И шлёт ответ: "Давай, брат, я тебя услышал (твой X+1), а вот мой номер — Y". Это уже SYN-ACK, и синхронизация, и подтверждение в одном флаконе.

Ну а клиент, получив это, такой: "Ясен хуй, получил твой Y, вот тебе подтверждение (Y+1)". И шлёт финальный ACK.

Вот и всё, после этого они уже могут вовсю данные гонять, соединение установлено. Без этого — ни хуя, просто пакеты в пустоту летели бы, как мартышлюшки.

// Клиент
client.send(SYN, seq=x);
// Сервер
server.send(SYN-ACK, seq=y, ack=x+1);
// Клиент
client.send(ACK, ack=y+1);

Вот так вот, в рот меня чих-пых, и работают все эти ваши интернеты. Не просто так, а с гарантией, что никто никого не проигнорил.