awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

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

Суть TCP превращает двух незнакомцев в сети в надёжный двусторонний разговор — рукопожатие — трёхшаговый ритуал начала этого разговора.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 10 min

Вы открыли эту страницу, и незнакомец на другом континенте согласился с вами поговорить. До любого HTTP-запроса, до TLS, до DNS — TCP сделал три вещи: поздоровался, согласовал номера последовательности и подтвердил соглашение. Это рукопожатие.

Что делает TCP одним предложением

TCP превращает двух незнакомцев в сети в надёжный двусторонний разговор: каждый байт приходит по порядку, каждый байт подтверждается, отсутствующие байты пересылаются. Рукопожатие — это начало разговора.

Уровень IP переносил пакеты через сети, но ему было всё равно, приходят ли они, приходят ли по порядку или приходят вообще. TCP добавляет контракт: каждый байт пронумерован, каждый байт подтверждается, а если один отсутствует — он пересылается заново. Этот контракт согласовывается при рукопожатии. До него обе стороны — незнакомцы. После — у обеих есть состояние: буферы, окна и соглашение разговаривать до тех пор, пока кто-то из них не скажет «до свидания».

Зачем это нужно

Без TCP каждый веб-запрос должен был бы управлять своими повторными передачами и упорядочиванием. TCP даёт каждому протоколу выше (HTTP, IMAP, SSH) чистый надёжный канал бесплатно.

Метафора: телефонный звонок

Представьте двух людей на телефонном звонке. Перед тем как сказать что-то важное, они обмениваются: «Алло, слышишь меня? — Да, слышу, а ты меня? — Да.» Этот трёхшаговый ритуал и есть TCP-рукопожатие.

  • SYN — «Привет, вот мой счётчик»
  • SYN-ACK — «Слышу тебя, вот мой счётчик, и подтверждаю твой»
  • ACK — «Подтверждаю твой счётчик, начинаем»

Теперь обе стороны уверены, что говорят по одной линии, и могут начать настоящий разговор.

Рукопожатие в диалоге

Антон набирает Светлану и говорит: «Привет, мой счётчик начинается с 42 000 000.» Светлана отвечает: «Понял, твой следующий байт — 42 000 001; мой счётчик — 99 000 000.» Антон: «Понял, твой следующий байт — 99 000 001, поехали.» С этого момента каждое слово обоих пронумеровано — никто не потеряет след.

Трёхстороннее рукопожатие: кратко
Шаг 1 (клиент→сервер)
SYN seq=X
Шаг 2 (сервер→клиент)
SYN-ACK seq=Y ack=X+1
Шаг 3 (клиент→сервер)
ACK seq=X+1 ack=Y+1
Состояние после шага 3
ESTABLISHED у обеих сторон
Стоимость
1 полный round-trip (RTT)
RTT в локальной сети
0,1–1 мс

Почему три шага, а не два

TCP — двунаправленный протокол, и обе стороны должны согласовать начальные номера последовательности друг друга. При двухшаговом рукопожатии (SYN → данные) номер последовательности сервера остался бы неподтверждённым. Третий шаг (ACK) доказывает, что клиент жив и прочитал SYN-ACK сервера. Он также ограничивает количество «полуоткрытых» соединений: если SYN пришёл, но ACK не последовал, сервер истекает по таймеру и освобождает память.

Один сценарий от начала до конца

Вы кликаете ссылку в браузере. Под капотом браузер уже завершил IP-маршрутизацию (знает адрес сервера) и DNS (разрешил имя). Теперь он выполняет TCP-рукопожатие. После — слой TLS для шифрования, и только затем летит реальный HTTP-запрос.

Викторина

Почему TCP нужно три сообщения, а не два?

Викторина

Какую гарантию даёт TCP после завершения рукопожатия?

Расставь шаги по порядку

Упорядочьте три шага TCP-рукопожатия:

  1. 1 Клиент отправляет SYN со своим начальным номером последовательности
  2. 2 Сервер отвечает SYN-ACK: свой номер последовательности плюс подтверждение клиентского
  3. 3 Клиент отправляет ACK, подтверждая номер последовательности сервера
  4. 4 Обе стороны переходят в ESTABLISHED и могут обмениваться данными
Закончи аналогию

Заполните пропуск: TCP-рукопожатие похоже на _______, где обе стороны убеждаются, что слышат друг друга, прежде чем сказать что-то важное.

Почему это работает

Почему TCP добавляет состояние. IP не хранит состояние: каждый пакет маршрутизируется независимо, и сеть не помнит предыдущих пакетов. TCP добавляет состояние на обоих концах — буферы, размеры окон, счётчики последовательностей. Именно это состояние обеспечивает надёжность. Рукопожатие — момент, когда это состояние создаётся и согласовывается. После него обе стороны больше не незнакомцы.

Вспомните перед уходом
  1. 01
    Одним предложением: почему каждое новое TCP-соединение занимает минимум один round-trip до передачи данных?
  2. 02
    Что пошло бы не так при двухшаговом рукопожатии (SYN → данные) вместо трёх шагов?
  3. 03
    В чём разница между TCP и IP с точки зрения гарантий доставки?
Итог

TCP строит надёжный упорядоченный поток байт поверх ненадёжной пакетной доставки IP. Трёхстороннее рукопожатие — это начало соединения: клиент отправляет SYN со своим начальным номером последовательности, сервер отвечает SYN-ACK со своим номером, подтверждая клиентский, затем клиент отправляет ACK, подтверждая серверный. Все три шага необходимы, поскольку TCP двунаправленный — оба направления должны независимо подтвердить начальный счётчик друг друга. Стоимость — один полный round-trip: 80–300 мс на межконтинентальных линках. Более высокие протоколы (TLS, HTTP) строятся на этом фундаменте, поэтому понимание рукопожатия необходимо для диагностики задержек.

Связанные уроки
встречается в152
Продолжить восхождение ↑Номера последовательности и состояние соединения
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.