Some checks failed
Published content check / validate (push) Failing after 5s
Каждая публикуемая заметка получила callout-шапку со ссылкой на свою страницу wiki.zapret.moe (на самой вики она вырезается транформером RemoveMirrorCallout, видна только на зеркале Obsidian Publish и в Forgejo) и SEO-поле description — 1–2 предложения для meta description обоих сайтов. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
97 lines
5.3 KiB
Markdown
97 lines
5.3 KiB
Markdown
---
|
||
date: 2026-01-21
|
||
tags:
|
||
- zapret
|
||
- zapret2
|
||
- tcp
|
||
- networking
|
||
- learning
|
||
aliases:
|
||
- Zapret2 учебник 02
|
||
description: "TCP для пользователей zapret2 простым языком: seq/ack, окно, MSS, ретрансляции и почему multisplit и multidisorder работают по-разному."
|
||
---
|
||
|
||
> [!mirror] Резервное зеркало
|
||
> Актуальная версия этой страницы — на основной вики: [wiki.zapret.moe/Zapret/manual/zapret2_02](https://wiki.zapret.moe/Zapret/manual/zapret2_02)
|
||
|
||
# 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]]`
|
||
|