Перейти к содержимому

Помехи ​

Экран Помехи запускает реле, которое стоит между клиентом и целью, с которой тот разговаривает, и ухудшает всё, что через него проходит, в обе стороны — как плохой Wi-Fi, мобильный канал, спутниковый хоп или канал, который пропадает. С его помощью можно увидеть, как ведут себя ваш клиент и ваше устройство в сети, которой под рукой нет.

Вы направляете клиента на реле вместо настоящей цели; реле передаёт всё цели, а ответы — обратно клиенту, предварительно сделав с каждой датаграммой или потоком то, что сказано в его профиле. Профиль можно менять на ходу, не закрывая порт.

Запуск реле ​

  1. Выберите значение в поле Протокол: UDP для датаграмм (OSC, большая часть шоу-контроля и трафика датчиков), TCP для потоков (HTTP, MQTT, TCP-устройство).
  2. Задайте Слушать: IP:port, на котором слушает реле. 0.0.0.0:9010 принимает трафик из сети; 127.0.0.1:9010 — только с этого компьютера.
  3. Задайте Цель: IP:port настоящего адресата или имя хоста и порт, например device.local:9000.
  4. Выберите пресет или задайте значения профиля.
  5. Нажмите Запустить релей.
  6. Направьте клиента на порт реле вместо цели — например, 127.0.0.1:9010 вместо 127.0.0.1:9000.

Кнопка Остановить релей закрывает реле; всё, что оно ещё удерживало, после этого не уходит.

По умолчанию: UDP, слушать 0.0.0.0:9010, цель 127.0.0.1:9000, задержка 40 мс, джиттер 15 мс и потери 2 %.

Поле Слушать — это адрес прослушивания, всегда IP:port. Имя хоста в поле Цель разрешается один раз, при нажатии Запустить релей, как и цель OSC; имя, которое не найдено, отклоняется, и реле не запускается. Поля Протокол, Слушать и Цель зафиксированы, пока реле работает; чтобы их изменить, остановите его.

text
client ──► relay (0.0.0.0:9010) ──► target (127.0.0.1:9000)
client ◄── relay ◄───────────────── target

UDP ​

Реле отправляет каждую датаграмму цели со своего порта, а то, что ответит цель, — обратно клиенту. У каждой датаграммы своя судьба, решаемая в момент её прихода.

Ответы уходят клиенту, приславшему последнюю датаграмму: реле обслуживает одного клиента за раз.

TCP ​

Каждое соединение, которое клиент устанавливает с реле, связывается с новым собственным соединением реле с целью. Оба потока каждого соединения — от клиента к цели и от цели к клиенту — ухудшаются фрагмент за фрагментом, по мере того как реле их читает (до 16 КиБ за раз). Поток всегда приходит по порядку, каким бы ни был джиттер.

Если цель отказывает в соединении, соединение клиента сбрасывается.

Профиль ​

Значения, которые применяет реле, в обе стороны. Реле UDP читает значения для датаграмм, реле TCP — для потоков; остальные скрыты.

По UDP ​

ЗначениеЧто делаетДиапазон
Нет связи — ничего не проходитКаждая датаграмма теряется, в обе стороны, пока вы не снимете флажок.вкл. / выкл.
ЗадержкаДобавляется к каждой датаграмме.0–1000 мс
ДжиттерСлучайная дополнительная задержка от 0 до этого значения для каждой датаграммы — поэтому датаграммы могут приходить не по порядку.0–500 мс
Потери пакетовДоля датаграмм, которые не приходят вовсе, каждая сама по себе.0–100 %
Пачки потерьВероятность того, что датаграмма начнёт пачку потерь: канал, который на мгновение пропадает, в отличие от разрозненных потерь.0–20 %
Длина пачки, датаграммСколько датаграмм в среднем теряет пачка. Показывается, когда Пачки потерь больше 0; 5, когда вы впервые его повышаете.1–1000
ДублированиеДоля датаграмм, доставляемых дважды.0–100 %
ИскаженияДоля датаграмм, у которых перевёрнут один бит одного байта.0–100 %
ПерестановкаДоля датаграмм, придерживаемых — на задержку и не менее 20 мс, — так что идущие за ними приходят первыми.0–100 %
Полоса, кбит/сОграничение полосы в килобитах в секунду; 0 — без ограничения. Датаграммы встают в очередь к каналу с этой скоростью; та, которой пришлось бы ждать больше секунды, отбрасывается по ограничению полосы.0 или 8–10 000 000

Пачка устроена так: датаграмма, не входящая в пачку, начинает её с вероятностью Пачки потерь; каждая датаграмма в пачке теряется и каждая заканчивает её с шансом 1 из значения Длина пачки, датаграмм, так что пачка длится в среднем столько датаграмм.

Судьба датаграммы решается в таком порядке: нет связи, пачка, потеря, полоса, затем для каждой копии — дублирование, искажение, задержка и перестановка.

По TCP ​

ЗначениеЧто делаетДиапазон
Нет связи — ничего не проходитНичего не течёт ни в одну сторону, а новые соединения ждут цель, пока вы не снимете флажок, — тогда всё продолжается.вкл. / выкл.
ЗадержкаДобавляется к каждому фрагменту потока, в обе стороны.0–1000 мс
ДжиттерСлучайная дополнительная задержка от 0 до этого значения для каждого фрагмента — никогда не опережая предыдущий.0–500 мс
Сброс соединенияДоля фрагментов, которые вместо прохождения сбрасывают своё соединение: и клиент, и цель получают сброс.0–100 %
ПолуоткрытоеДоля фрагментов, которые оставляют своё соединение полуоткрытым: больше ничего не проходит ни в одну сторону, и ни одной стороне об этом не сообщают. Реле держит обе стороны открытыми, нетронутыми, пока не остановится.0–100 %
Полоса, кбит/сОграничение полосы для каждого потока каждого соединения, в килобитах в секунду; 0 — без ограничения. После секунды очереди реле перестаёт читать, поэтому отправитель замедляется, как на медленном канале. Ничего не отбрасывается.0 или 8–10 000 000

Потери, пачки, дублирование, искажение и перестановка к TCP не применяются: настоящий поток TCP пересылает потерянное и сам выстраивается по порядку, поэтому на плохом канале клиент сталкивается с задержкой, медленным отправителем, сбросами и соединениями, которые перестают отвечать.

TIP

Ползунки останавливаются на 1000 мс задержки и 500 мс джиттера. Само реле принимает до 60 000 мс для каждого значения, например из файла эксперимента.

Пресеты ​

Пресет задаёт все значения одним щелчком. Его плашка остаётся подсвеченной, пока значения остаются значениями пресета; измените любое значение — и она гаснет.

ПресетПо UDPПо TCP
LAN1 мс ±11 мс ±1
Загруженный Wi-Fi20 мс ±30, потери 1 %, пачки 1 % × 3, 0,5 % дублируется, 2 % переставляется20 мс ±30
4G60 мс ±25, потери 0,5 %, 0,5 % переставляется, 20 000 кбит/с60 мс ±25, 20 000 кбит/с
Спутник300 мс ±30, потери 1 %, 2000 кбит/с300 мс ±30, 2000 кбит/с
С перебоями30 мс ±20, пачки 3 % × 1530 мс ±20, 0,2 % фрагментов оставляют соединение полуоткрытым
Нет связиНичего не проходитНичего не течёт

Изменение на ходу ​

Меняйте любое значение или выбирайте другой пресет, пока реле работает: изменение применяется через четверть секунды после вашего последнего действия, не закрывая порт и соединения. Консоль отмечает каждый новый профиль, а строка под заголовком В реальном времени сообщает, что реле делает сейчас, — название пресета или значения вкратце, например 60 ms ±25 · loss 2% · 20000 kbps.

Судьбу датаграммы или фрагмента решает профиль, действующий в момент прихода; уже отправленные в путь сохраняют свою задержку.

Счётчики ​

Блок В реальном времени показывает, что реле сделало с момента запуска, в обе стороны вместе; он обновляется четыре раза в секунду.

Для UDP:

СчётчикЧто это
ПринятоДатаграммы, дошедшие до реле.
ПереданоДатаграммы, отправленные дальше; продублированная считается дважды.
ПотеряноПотеряно намеренно: нет связи, пачка или потеря.
Не пропущеноОтброшено по ограничению полосы или потому, что 10 000 уже были в пути.
ДубликатыДатаграммы, отправленные дважды.
ИскаженоКопии с перевёрнутым битом.
ПереставленоКопии, придержанные так, чтобы более поздние их обогнали.
ОбъёмБайты, отправленные дальше.

Для TCP:

СчётчикЧто это
СоединенияСоединения, которые клиенты установили с реле.
ПринятоФрагменты, прочитанные реле, в обе стороны.
ПереданоФрагменты, записанные дальше.
СброшеноСброшенные соединения.
ПолуоткрытоСоединения, оставленные полуоткрытыми.
ПридержаноСколько раз поток ждал из-за ограничения полосы: отправителя замедлили, ничего не отбросили.
ОбъёмЗаписанные дальше байты.

Когда захват включён, Инспектор показывает датаграммы и фрагменты, прошедшие через реле, — не чаще одного за 25 мс, для обоих направлений вместе, — каждый со своей судьбой: forwarded +43ms, · corrupted, · reordered, · copy 2/2, dropped (loss), dropped (burst), dropped (offline), throttled, а по TCP — reset и half-open. → означает от клиента к цели, ← — от цели к клиенту.

Кадр, прошедший через реле, называет настоящие сокеты: поле локальный — адрес, на котором слушает реле, а поле Пир — куда шла эта датаграмма или фрагмент: цель или клиент, которому ушёл ответ. Направление завершает вердикт: forwarded +43ms · client→target, dropped (loss) · target→client. Поэтому прошедшую через реле датаграмму можно сохранить кнопкой Сохранить как сигнал, и она нацелена на адрес, куда шла; фрагмент TCP — часть потока, и его сохранить нельзя (см. Инспектор).

Тот же трафик, та же судьба ​

Каждое решение — какая датаграмма потеряется, на сколько будет задержана, где будет искажена — берётся из seed реле, отдельно для каждого направления и, по TCP, для каждого соединения. При том же seed и том же трафике реле теряет те же датаграммы и задерживает их так же.

Экран Помехи берёт новый seed при каждом запуске реле. Чтобы повторить запуск в точности, используйте в эксперименте узел Сетевые помехи: он берёт seed запуска, который можно зафиксировать (см. Повтор запуска со сбоями).

В экспериментах ​

Два узла вносят то же реле в эксперимент:

  • Узел Сетевые помехи открывает реле до первого шага и закрывает его, когда запуск заканчивается, как бы он ни закончился. Его адреса прослушивания и цели принимают только параметры; цель может быть именем хоста, разрешаемым при старте запуска. См. Узлы.
  • Узел Сменить помехи переключает реле запуска на другой профиль начиная с этого шага — чистый, с потерями, без связи, снова чистый, — а отчёт о запуске считает, что сделала каждая фаза. См. Узлы.

В узле OSC или UDP параметр Пропустить через помехи ставит перед ним узел Сетевые помехи и направляет узел на реле. См. Сбои.