todo/Zapret2/out-range.md
loop-uh 0ad0bcc8dd
Some checks failed
Published content check / validate (push) Failing after 5s
seo+зеркало: [!mirror]-плашка со ссылкой на вики и description во frontmatter всех заметок
Каждая публикуемая заметка получила callout-шапку со ссылкой на свою страницу
wiki.zapret.moe (на самой вики она вырезается транформером RemoveMirrorCallout,
видна только на зеркале Obsidian Publish и в Forgejo) и SEO-поле description —
1–2 предложения для meta description обоих сайтов.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 22:05:57 +03:00

92 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tags:
link:
aliases:
img:
description: "Формат --out-range и --in-range в zapret2: префиксы n/d/s/b, разделители, что такое data packet и почему --wf-tcp-empty=0 сбивает счёт n."
---
> [!mirror] Резервное зеркало
> Актуальная версия этой страницы — на основной вики: [wiki.zapret.moe/Zapret2/out-range](https://wiki.zapret.moe/Zapret2/out-range)
## Формат `--out-range` / `--in-range`:
```
--out-range=[(n|a|d|s|b|x)<int>](-|<)[(n|a|d|s|b|x)<int>]
───────────────────────────────────────────
FROM SEPARATOR TO
```
### Префиксы (режимы счёта):
| Префикс | Значение | Что считает |
|---------|----------|-------------|
| `n` | packet **n**umber | Порядковый номер перехваченного пакета (в выбранном направлении) |
| `d` | **d**ata packet | Только пакеты с payload (данными) |
| `s` | **s**equence | Относительный TCP sequence number |
| `b` | **b**yte count | Количество переданных байт |
| `a` | **a**lways | Всегда (без числа) |
| `x` | ne**x**t/never | Никогда (без числа) |
> Важно: все счётчики (`n/d/b/s/p`) считаются **только по тем пакетам, которые реально попали в движок** (перехвачены NFQUEUE/WinDivert и не отфильтрованы раньше).
> Если какой-то пакет “мимо” (не перехвачен или отсеян, например пустые ACK в winws2), он **не увеличит `n`**, и “номер пакета” для `--out-range` сместится.
### Разделители:
| Разделитель | Значение |
|-------------|----------|
| `-` | **Включает** конечную позицию |
| `<` | **Не включает** конечную позицию |
---
## Примеры с `d`:
| Значение | Расшифровка |
|----------|-------------|
| `d1-d10` | С 1-го по 10-й data-пакет **включительно** |
| `d1<d10` | С 1-го по 9-й data-пакет (10-й **не** включён) |
| `-d10` | С начала (always) по 10-й data-пакет включительно |
| `d5-` | С 5-го data-пакета и до конца (бесконечно) |
### Что такое "data packet"?
**Data packet** (`d`) — это пакет, содержащий **payload** (данные L7). Пустые ACK, FIN, RST без данных **не считаются**.
```bash
out (клиент → сервер):
1) SYN → n=1, d=0
2) ACK (пустой)n=2, d=0 (если этот ACK перехвачен)
3) ClientHello/HTTP → n=3, d=1
in (сервер → клиент):
1) SYN-ACK → n=1, d=0 (для --in-range, т.к. это входящее направление)
```
> Частая ловушка: пытаться считать `n` “глобально по соединению” и включать туда SYN-ACK.
> На самом деле `--out-range` считает только **outgoing**, а `--in-range` — только **incoming**.
## Важно про Windows / winws2: `--wf-tcp-empty=0` ломает ожидания по `n`
В winws2 по умолчанию обычно включено `--wf-tcp-empty=0` — это **не перехватывает пустые ACK** ради экономии CPU.
Следствие: второй исходящий пакет TCP (handshake ACK) часто **не попадает в движок**, `n` “перескакивает”, и `n2<n3` может сработать на ClientHello.
Что делать:
- если тебе нужен именно пустой ACK — включай `--wf-tcp-empty=1`
- если тебе нужно целиться в “первый пакет с данными”, используй `d` (он стабильнее при отсеивании пустых ACK)
---
## Практический пример:
```bash
--out-range=d1-d3 --lua-desync=my_func
```
`my_func` будет вызываться только для **1-го, 2-го и 3-го исходящих пакетов с данными** в соединении.
```bash
--out-range=d10-d10 # ровно 10-й data packet
--out-range=d10- # с 10-го и до бесконечности
--out-range=-d10 # с начала до 10-го включительно
--out-range=d10<d11 # только 10-й (11-й исключён)
```