# Zapret2 для новичков — 02: TCP (seq/ack, окно, MSS) понятным языком
Эта заметка объясняет те TCP‑механизмы, на которых “держится” большая часть логики zapret2.
## 1) TCP как “поток байт”
TCP для приложения выглядит как непрерывный поток байт.
Но по сети ходят **пакеты**, каждый несёт кусок этого потока.
TCP гарантирует:
- порядок (байты “склеятся” правильно),
- надёжность (потерянное будет ретранслировано),
- контроль потока (чтобы не переполнить принимающую сторону).
## 2) Sequence number (seq): “номер первого байта”
Упрощённо:
- `seq` в TCP сегменте указывает **номер первого байта payload** в общем потоке.
Пример:
- сегмент A: `seq=1000`, payload длиной 200 байт → несёт байты `[1000..1199]`
- сегмент B: `seq=1200`, payload длиной 100 байт → несёт байты `[1200..1299]`
## 3) Acknowledgement (ack): “всё до N получил”
`ack` (обычно) означает:
- “я получил все байты до `ack-1`, пришли следующий байт `ack`”.
Это важно для понимания:
- почему “неправильный ack” может заставить ОС отбросить пакет,
- почему изменение `ack`/`seq` — это сильный рычаг в “fooling”.
## 4) Окно (window): сколько данных можно принять
TCP окно показывает, сколько данных приёмник готов принять сейчас.
Отсюда идея техник:
- “всунуть” часть сегмента **вне окна**: сервер это игнорирует, но DPI может попытаться прочитать.
В zapret2 это связано с `seqovl` (см. `[[multisplit]]` и `[[multidisorder]]`).
## 5) Retransmission (ретрансляция)
Если ACK не пришёл, TCP отправляет сегмент снова.
С точки зрения наблюдателя (и DPI) это выглядит как “ещё один похожий пакет с тем же seq”.
Многие техники пытаются сделать “картинку”, похожую на ретрансляции, чтобы DPI было сложнее понять, где оригинал.
## 6) MSS и почему у вас “вдруг стало много пакетов”
MSS — максимальный размер TCP payload в одном сегменте (примерно MTU минус заголовки).
Если payload больше MSS:
- он будет разбит на несколько сегментов.
В zapret2 есть **автосегментация по MSS** при отправке:
- даже если вы “логически” разрезали на 2 части, каждая часть может быть ещё порезана по MSS.
Это объясняет, почему в логах иногда улетает больше сегментов, чем вы ожидали.
## 7) Почему порядок важен (multisplit vs multidisorder)
- `multisplit` шлёт сегменты “с начала к концу”.
- `multidisorder` шлёт “с конца к началу”.
Так можно получить ситуации, когда:
- в буфере приёмника сначала лежит “хвост”, а потом приходит “голова”,
- и разные системы/стеки по‑разному обрабатывают перекрытия (overlap) и порядок.
## 8) Мини‑практика (без опасных действий)
Цель упражнений — **понять данные**, а не “обходить”.
- Добавь в профиль `--lua-desync=posdebug` и посмотри, как меняются `n/d/b/s/p`.
- Добавь `--lua-desync=luaexec:code="DLOG('seq '..tostring(desync.dis.tcp.th_seq)..' ack '..tostring(desync.dis.tcp.th_ack))"` — и увидишь, что это обычные числа и их можно анализировать.
## 9) Что читать дальше
- `[[Zapret2 - 03 - Перехват пакетов и вердикты (NFQUEUE/WinDivert)]]`
- `[[Zapret2 - 04 - Dissect/Reconstruct и структура desync]]`