Ответ
TCP использует трехстороннее рукопожатие (SYN, SYN-ACK, ACK) для установки надежного соединения:
- SYN: Клиент отправляет SYN (synchronize) пакет с начальным номером последовательности (ISN) серверу.
- SYN-ACK: Сервер отвечает SYN-ACK (synchronize-acknowledge), подтверждая получение SYN и отправляя свой ISN.
- 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);
Вот так вот, в рот меня чих-пых, и работают все эти ваши интернеты. Не просто так, а с гарантией, что никто никого не проигнорил.