Browse Source

Record clean NAT startup and monotonic restart contract in stream specification

master
evgeny 19 hours ago
parent
commit
89c6482a96
  1. 3
      doc/stream.txt
  2. 4
      tests/stream_netns/README.md

3
doc/stream.txt

@ -683,6 +683,7 @@ OVERLOAD_SELECT: request_id:8, selected_count:1, handles:8*selected_count; не
общая полоса межстрановых каналов 50/30/20Мбит/с. Внутри страны RTT около 2мс.
Задержки/потери — receiver ingress IFB/netem, полоса — WAN TBF; очереди ограничены, offload veth отключён.
Cone (EIM/EIF), restricted (EIM/APDF) и строгий NAT (ADM по IP назначения/APDF) проверяются реальными UDP-пробами до старта ядра.
После проб сеть создаётся заново: рабочий запуск начинает с пустыми NAT mappings/conntrack и исходными netem seeds.
Главный namespace не настраивается: новые user/mount/PID/network namespace, без uplink наружу и без именованных ip netns;
снимки адресов/маршрутов/rules/qdisc до и после сравниваются, естественный ход DHCP/cache timers исключается.
@ -699,4 +700,6 @@ Baseline по умолчанию 120с реального времени; наб
END, принятый от первого поставщика, сообщает границу источника, но не завершение локального потребителя.
Оптимизатор продолжает выбор/восстановление до consumer cursor > last_seq (либо подписанного пустого END).
Это проверяет регрессия test_stream_service: ранний END при неполной FEC-пачке не блокирует последующую DATA и END приложения.
Restart в той же source_epoch сохраняет consumer cursor: bootstrap от отстающего поставщика не повторяет уже выданные DATA.
Повтор restart до отложенного GAP сохраняет предыдущую, ещё не сообщённую приложению границу; пропуск сообщается одним GAP.
Инструкция и параметры стенда: tests/stream_netns/README.md.

4
tests/stream_netns/README.md

@ -74,6 +74,8 @@ UDP NAT-профили:
Cone/restricted mapping разрешается только после исходящего пакета, время активности 60 секунд обновляется на каждом исходящем пакете. TCP использует обычный stateful NAT без проброса входящих портов. Проверка перед uTun измеряет реальный внешний адрес/порт на двух публичных получателях и отдельно пробует вход от третьего, включая отсутствие mapping до исходящего трафика. Для проб до/после открытия используются разные внешние tuples, чтобы не переиспользовать отрицательный conntrack.
После калибровки ее namespace уничтожаются, затем создается новая сеть с теми же параметрами и пустыми NAT mappings/conntrack. Результаты проб не облегчают подключения реальных процессов. Снимки `network-calibration-initial.json` / `network-calibrated.json` относятся к пробам, `network-initial.json` / `network-final.json` — к uTun; команды содержат inode соответствующего namespace. PID в `namespaces.json` записаны относительно PID namespace контроллера.
## Что проверяется
Для каждого приложения DATA содержит sequence, ID источника, monotonic timestamp, seed и SHA256. Одна запись равна одной входной пачке 6+2; штатная кодограмма около 1300 байт. Получатели проверяют checksum, порядок, явные GAP, итоговый cursor и подписанный END. Начальный пропущенный префикс допустим: подписка начинает с последнего доступного блока. Дальнейшие пропуски должны быть полностью объяснены GAP; поврежденные или повторно доставленные записи приводят к FAIL.
@ -99,3 +101,5 @@ One-way latency измеряется по общему CLOCK_MONOTONIC ядра
Ctrl+C и нормальное завершение закрывают процессы и namespace. PID namespace с `--kill-child` также ограничивает время жизни процессов при аварии launcher; namespace не закрепляются mount-именами на хосте. Файлы результатов сохраняются для анализа.
Короткий TCP-only прогон выявил остановку оптимизатора при END первого поставщика, до дочитывания потребителем FEC-пачки. Для этого случая добавлена регрессия в `test_stream_service`: END устанавливает подписанную границу, автоматические пробы и восстановление продолжаются до прохождения consumer cursor за эту границу. Стенд проверяет завершение у всех подписчиков, а не наличие END в одном сетевом handle.
Прогон NAT-источника с ухудшением WAN выявил повтор DATA после restart через отстающего поставщика. Restart той же эпохи теперь сохраняет границу уже выданных DATA/GAP: старый подписанный bootstrap может установить общий старт, но не перематывает consumer cursor. Регрессии проверяют повтор bootstrap, перегрузку и два restart до доставки отложенного GAP.

Loading…
Cancel
Save