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>
92 lines
4.8 KiB
Markdown
92 lines
4.8 KiB
Markdown
---
|
||
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-й исключён)
|
||
```
|