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

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

Номера последовательности и состояние соединения

Суть Как рандомизация ISN защищает TCP от атак инъекций, и полный автомат состояний от CLOSED до TIME-WAIT.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Вы знаете три шага рукопожатия. Теперь посмотрите, что именно обменивается в этих шагах: случайные 32-битные счётчики, конкретные значения которых — не произвол, а одновременно механизм безопасности, таймерный механизм и контрольная точка автомата состояний.

Трёхшаговый танец в деталях

Антон отправляет SYN seq=X. Он переходит в состояние SYN-SENT. Светлана получает пакет, выделяет буфер для входящего направления, переходит в состояние SYN-RECV и отвечает SYN-ACK seq=Y ack=X+1. ack=X+1 означает: «Я видела твой номер X; следующий байт, который жду от тебя, — X+1.» (Флаг SYN сам по себе потребляет один порядковый номер, даже если данных не передаётся.) Антон отправляет ACK seq=X+1 ack=Y+1 и переходит в состояние ESTABLISHED. Светлана получает ACK, переходит в ESTABLISHED — соединение установлено.

Согласование номеров последовательности

1/3

Начальные порядковые номера (ISN) — почему случайные?

RFC 6528 требует вычислять ISN как:

ISN = M + F(saddr, sport, daddr, dport, secret_key)

где M увеличивается раз в ~4 мкс (трудно угадать извне), а F — хеш четырёхкортежа соединения и секретного ключа. Старые реализации использовали простой счётчик: злоумышленник мог предсказать следующий ISN, подделать пакет с правильным порядковым номером и внедрить команды в установленное соединение. Современные ISN криптографически случайны для каждого соединения, что делает слепую инъекцию невозможной без перехвата трафика.

Стоимость: один RTT

Антон отправляет SYN, ждёт SYN-ACK (1 RTT), отправляет ACK, и только тогда может отправить HTTP-запрос. При RTT 100 мс (через континент) 100 мс задержки заложены в соединении до первого байта данных приложения. Этот RTT важен — он задаёт ритм всего приложения.

Стоимость RTT при рукопожатии
RTT в локальной сети (холодный)
0,1–1 мс
Региональный RTT
20–40 мс
Межконтинентальный RTT
100–300 мс
TFO — первое соединение
1 RTT + данные
TFO — повторное соединение
0 RTT (данные в SYN)
Преимущество HTTP/2
1 соединение, много потоков

Закрытие соединения: FIN и TIME-WAIT

Закрытие — зеркало открытия: каждая сторона независимо отправляет FIN, сигнализируя «у меня больше нет данных», а другая сторона подтверждает ACK. Соединения остаются в состоянии TIME-WAIT в течение 2×MSL (~120 с типично), чтобы запоздавшие повторные передачи могли прийти безвредно, а не быть приняты за данные нового соединения. Инициатор закрытия платит цену TIME-WAIT; на занятых серверах это может стать проблемой — подробнее в уроке о SYN cookies и TFO.

Автомат состояний

Состояния, которые вы увидите в выводе ss -tan:

СостояниеЗначение
LISTENСервер ожидает SYN
SYN-SENTКлиент отправил SYN
SYN-RECVСервер отправил SYN-ACK
ESTABLISHEDРукопожатие завершено, нормальный трафик
FIN-WAIT-1Инициатор закрытия отправил FIN
FIN-WAIT-2Получен ACK на собственный FIN
CLOSE-WAITПолучен FIN от пира, приложение должно вызвать close()
LAST-ACKОтправлен FIN, ожидается финальный ACK
TIME-WAITОстывание после закрытия (2×MSL)
CLOSEDСоединения нет

Накопление CLOSE-WAIT на сервере обычно означает, что приложение не вызывает close() на принятых сокетах — утечка ресурсов.

Проследи
1/5

Проследите успешное трёхстороннее рукопожатие TCP и первый байт данных.

1
Step 1 of 5
Клиент отправляет SYN. В каком состоянии клиент?
2
Locked
Сервер получает SYN. Что он выделяет и что отвечает?
3
Locked
Клиент получает SYN-ACK. Что сообщает клиенту номер ACK?
4
Locked
Клиент отправляет ACK. Что делает сервер?
5
Locked
Первый байт данных клиента. Какой номер последовательности он несёт?
Расставь шаги по порядку

Упорядочьте переходы состояний TCP для клиента, открывающего и закрывающего соединение:

  1. 1 CLOSED
  2. 2 SYN-SENT (после send(SYN))
  3. 3 ESTABLISHED (после receive(SYN-ACK) и send(ACK))
  4. 4 FIN-WAIT-1 (после send(FIN))
  5. 5 FIN-WAIT-2 (после receive(ACK of FIN))
  6. 6 TIME-WAIT (после receive(FIN) и send(ACK))
  7. 7 CLOSED (после истечения 2×MSL)
Викторина

Почему флаг SYN считается потребляющим один порядковый номер, хотя байт данных не передаётся?

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

Почему старые реализации ISN были опасны. До RFC 6528 многие TCP-стеки увеличивали ISN на фиксированное значение в секунду (~250 000 в секунду в BSD-подобных системах). Злоумышленник, видевший время одного соединения, мог с достаточной точностью предсказать следующий ISN и подделать ACK или сегмент данных — классическая атака предсказания порядкового номера TCP. Рандомизированные ISN с криптографическим смешением четырёхкортежа делают эту атаку вычислительно нецелесообразной без возможности перехватить реальный SYN-ACK.

Вспомните перед уходом
  1. 01
    Почему начальные порядковые номера (ISN) рандомизируются, а не начинаются с нуля или глобально инкрементируются?
  2. 02
    Что означает TIME-WAIT, как долго длится и зачем нужен?
  3. 03
    На что почти всегда указывает большое количество сокетов в состоянии CLOSE-WAIT на сервере?
Итог

Трёхстороннее рукопожатие обменивается начальными порядковыми номерами (ISN) в обоих направлениях. ISN вычисляются как счётчик времени плюс криптографический хеш четырёхкортежа соединения (RFC 6528), что делает атаки инъекций нецелесообразными. Флаг SYN потребляет один порядковый номер, чтобы обмен был индивидуально подтверждаем. После установки ESTABLISHED обе стороны отслеживают соединение через 11-состоятельный автомат: LISTEN, SYN-SENT, SYN-RECV, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT, CLOSED. TIME-WAIT сохраняется 2×MSL (~120 с) для поглощения запоздавших повторных передач. Накопление CLOSE-WAIT — самый распространённый симптом утечки сокетов: приложение не вызывает close() на принятых соединениях.

Связанные уроки
встречается в258
Продолжить восхождение ↑Управление потоком и перегрузкой
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.