# Zapret2 для новичков — 05: payload types, reasm/replay и маркеры Цель: понять, как zapret2 отличает `http_req` от `tls_client_hello`, зачем нужен `reasm_data` и почему “маркеры” (host/midsld/…) иногда не работают. ## 1) `l7proto` vs `l7payload` Это разные уровни классификации: - `l7proto`: “какой протокол потока” (tls/http/quic/…) - `l7payload`: “какой именно тип полезной нагрузки” (http_req, tls_client_hello, quic_initial, …) В CLI это отражается так: - `--filter-l7=tls,http,quic` — фильтр протокола потока - `--payload=tls_client_hello` — фильтр типов payload внутри профиля ## 2) Почему payload важнее для Lua стратегий Многие стратегии должны срабатывать только на “первом важном пакете”: - HTTP request (где виден Host) - TLS ClientHello (где виден SNI) - QUIC Initial (где тоже “есть hello”, но шифрованнее и сложнее) Поэтому фильтрация по payload экономит CPU и делает поведение предсказуемым. ## 3) `reasm_data`: когда один payload приходит в нескольких TCP сегментах Иногда полезная нагрузка не помещается в один TCP сегмент (например TLS ClientHello с kyber). Тогда zapret2 может собрать несколько сегментов в один “логический payload”: - `desync.reasm_data` — полный собранный блок Ключевой момент: - стратегии типа `multisplit`/`multidisorder` работают “умнее”, если видят `reasm_data`: они режут **весь reasm**, а не только текущий кусок. ## 4) `replay`: почему пакеты иногда “задерживают и переигрывают” Если нужно сначала накопить части payload (для reasm) или выполнить серию Lua‑инстансов, система может: 1) временно задержать часть пакетов 2) когда готово состояние (`reasm_data`), “переиграть” (replay) эти пакеты Отсюда поля типа: - `desync.replay`, `desync.replay_piece`, `desync.replay_piece_count` И поведение: - многие стратегии делают основную работу только на `replay_first(...)`, а дальше дропают “повторные” части, потому что уже отправили reasm в нужной форме. ## 5) Маркеры: что это и зачем Маркеры — это способ указать позицию “логически”, а не байтовым смещением. Примеры маркеров: - `method` (HTTP метод) - `host`, `endhost`, `midsld` (позиции внутри Host/SNI домена) - `sniext`, `extlen` (TLS структуры) Можно писать: - `midsld+1`, `endhost-2`, `-10`, `100` И использовать в: - `multisplit:pos=...` - `multidisorder:pos=...:seqovl=...` Почему маркер может “не сработать”: - payload не распознан (l7payload = unknown) - в payload нет нужной структуры (например нет SNI) - маркер невалиден для данного payload типа ## 6) Мини‑практика: “проверить, распознан ли payload” Добавь: ```bash --lua-desync=luaexec:code="DLOG('l7payload '..tostring(desync.l7payload)..' l7proto '..tostring(desync.l7proto))" ``` И сравни с ожиданиями. ## 7) Что читать дальше - `[[Zapret2 - 06 - Lua pipeline: инстансы, args, дебаг]]` - `[[multisplit]]` и `[[multidisorder]]` (там маркеры используются в реальной технике)