Помехи
Экран Помехи запускает реле, которое стоит между клиентом и целью, с которой тот разговаривает, и ухудшает всё, что через него проходит, в обе стороны — как плохой Wi-Fi, мобильный канал, спутниковый хоп или канал, который пропадает. С его помощью можно увидеть, как ведут себя ваш клиент и ваше устройство в сети, которой под рукой нет.
Вы направляете клиента на реле вместо настоящей цели; реле передаёт всё цели, а ответы — обратно клиенту, предварительно сделав с каждой датаграммой или потоком то, что сказано в его профиле. Профиль можно менять на ходу, не закрывая порт.
Запуск реле
- Выберите значение в поле Протокол: UDP для датаграмм (OSC, большая часть шоу-контроля и трафика датчиков), TCP для потоков (HTTP, MQTT, TCP-устройство).
- Задайте Слушать:
IP:port, на котором слушает реле.0.0.0.0:9010принимает трафик из сети;127.0.0.1:9010— только с этого компьютера. - Задайте Цель:
IP:portнастоящего адресата или имя хоста и порт, напримерdevice.local:9000. - Выберите пресет или задайте значения профиля.
- Нажмите Запустить релей.
- Направьте клиента на порт реле вместо цели — например,
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; имя, которое не найдено, отклоняется, и реле не запускается. Поля Протокол, Слушать и Цель зафиксированы, пока реле работает; чтобы их изменить, остановите его.
client ──► relay (0.0.0.0:9010) ──► target (127.0.0.1:9000)
client ◄── relay ◄───────────────── targetUDP
Реле отправляет каждую датаграмму цели со своего порта, а то, что ответит цель, — обратно клиенту. У каждой датаграммы своя судьба, решаемая в момент её прихода.
Ответы уходят клиенту, приславшему последнюю датаграмму: реле обслуживает одного клиента за раз.
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 |
|---|---|---|
| LAN | 1 мс ±1 | 1 мс ±1 |
| Загруженный Wi-Fi | 20 мс ±30, потери 1 %, пачки 1 % × 3, 0,5 % дублируется, 2 % переставляется | 20 мс ±30 |
| 4G | 60 мс ±25, потери 0,5 %, 0,5 % переставляется, 20 000 кбит/с | 60 мс ±25, 20 000 кбит/с |
| Спутник | 300 мс ±30, потери 1 %, 2000 кбит/с | 300 мс ±30, 2000 кбит/с |
| С перебоями | 30 мс ±20, пачки 3 % × 15 | 30 мс ±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 параметр Пропустить через помехи ставит перед ним узел Сетевые помехи и направляет узел на реле. См. Сбои.