Инспектор
Инспектор — это единая лента для всех инструментов: каждое OSC-сообщение, датаграмма, HTTP-обмен, публикация MQTT, сообщение WebSocket, пакет, прошедший через реле, и обмен с эмулятором попадают сюда в расшифрованном виде вместе с байтами, из которых состоят. С его помощью можно увидеть, что на самом деле прошло по сети, в каком порядке и что с этим случилось.
Он живёт в нижней панели, на вкладке Инспектор рядом с консолью, поэтому доступен на любом экране. Щёлкните вкладку, чтобы открыть его; панель открывается достаточно высокой для нескольких строк и подробностей кадра. Кнопка ⤢ (На всю высоту окна) делает панель во всю высоту окна. Инспектор сохраняет свой список и выбор, пока вы закрываете панель или переключаете экраны.
Захват
При запуске Signal Lab захват выключен, а пока он выключен, он ничего не стоит: инструменты даже не собирают кадры.
- Откройте вкладку Инспектор.
- Нажмите Включить захват. Точка на вкладке станет красной и начнёт пульсировать.
- Пользуйтесь любым инструментом. Кадры появляются вверху списка, новые первыми.
- Нажмите Выключить захват, когда получили всё, что нужно.
Вкладка показывает, сколько кадров захвачено, с любого экрана.
Кадры захватываются с момента включения захвата и никогда раньше: сначала включите его, потом отправляйте.
На сервере захват принадлежит серверу: каждая вошедшая на него страница видит одни и те же кадры, а включение или очистка на одной странице действуют для всех.
Что захватывается
| Инструмент | Кадры | Сколько |
|---|---|---|
| OSC: отправка | Каждое отправленное сообщение | Каждое |
| OSC: монитор | Каждый принятый пакет; пакет, который не декодируется, помечен ошибкой декодирования | Каждый |
| OSC: генератор сигнала | Отправленные сообщения | Не более одного за 100 мс, с пометкой sampled |
| Броадкаст: отправить один раз | Каждая датаграмма, по одной на адресата; неудавшаяся отправка — с ошибкой | Каждая |
| Броадкаст: маяк | Отправленные датаграммы | Не более одной за 50 мс |
| Броадкаст: приёмник обнаружения | Принятые пробы | Не более одной за 40 мс |
| Броадкаст: приёмник обнаружения | Его ответы (auto-reply) | Каждый |
| HTTP: отправка, сигналы, запросы эксперимента | Каждый обмен: строка запроса, статус и время, заголовки ответа и начало тела | Каждый |
| HTTP: нагрузочный поток и запросы под нагрузкой | Обмены | Не более одного за 100 мс |
| MQTT: соединение | Отправленные публикации | Каждая |
| MQTT: соединение | Принятые сообщения | Не более одного за 200 мс |
| MQTT: MQTT-сигнал, отправленный, пока экран не подключён к его брокеру | Публикация | Каждая |
| WebSocket | Отправленные и принятые сообщения | Каждое, пока трафик небольшой; не более 200 в секунду |
| Эмуляторы | То, что пришло, и ответ — вместе | Не более одного обмена за 10 мс |
| Помехи | Каждая датаграмма или фрагмент, прошедшие через реле, в обе стороны, с их судьбой | Не более одного за 25 мс для обоих направлений вместе |
| Шторм (UDP) | Пакеты потока, все одинаковые | Один в секунду, с пометкой sampled 1/s; TCP-шторм ничего не захватывает |
| Сканер | Каждый открытый порт с баннером | Каждый |
| Эксперименты | То, что отправляют узлы запуска (TCP-сообщение: записанное содержимое и прочитанный ответ), и то, что получают его ожидания | Как у используемого инструмента |
Инструмент, который берёт выборки, нарочно пропускает остальное и считает пропущенное: следующий нарисованный им кадр сообщает, сколько он удержал, в своём вердикте как +n not shown (sampled · +5 not shown). Это число того, что инструмент нарисовал бы, а не собственного сброса захвата (см. Счётчики и пропуски).
Список кадров
| Столбец | Что в нём |
|---|---|
| Время | Когда кадр захвачен, с точностью до миллисекунды. |
| Напр. | → отправлен (tx), ← получен (rx). Для реле → означает от клиента к цели, а ← — от цели к клиенту. |
| Прот. | osc, udp, tcp, http, mqtt или ws. |
| Пир | Другая сторона: IP:port, URL, брокер. |
| Байты | Размер кадра. |
| Кратко | Одна строка в собственной нотации протокола, например /fader/1 0.75 или GET http://127.0.0.1:8080/ → 200 in 3ms. |
| Вердикт | Что с ним случилось, если есть что сказать. |
Вердикт бывает зелёным, жёлтым или красным. Красный — потеря или ошибка (dropped (loss), failed, error: …); жёлтый — кадр изменён или это лишь выборка из многих (corrupted, copy 2/2, sampled, +n not shown); зелёный — всё остальное. Вот некоторые вердикты, которые вам встретятся:
| Вердикт | Откуда | Что значит |
|---|---|---|
forwarded +42ms | Помехи | Передан дальше после такой задержки; могут следовать · corrupted, · reordered или · copy 1/2. |
dropped (loss), dropped (burst), dropped (offline) | Помехи | Потерян намеренно, и по какой причине. |
throttled | Помехи | Отброшен из-за ограничения полосы. |
· client→target, · target→client | Помехи | Завершает вердикт каждого кадра, прошедшего через реле, перед любым +n not shown: в какую сторону он шёл. |
#2 → 200 OK · 37 B, — → 404 … | Эмуляторы | Какое правило ответило (—: никакое) и сам ответ. |
down, down → 503 | Эмуляторы | Пришёл, пока эмулятор был отключён. |
200 OK, failed | HTTP | Статус ответа или отсутствие ответа вообще. |
open | Сканер | Открытый порт. |
auto-reply | Обнаружение | Ответ, который приёмник отправил на пробу. |
clears retained | MQTT | Пустая retained-публикация. |
+n not shown | Любой инструмент, берущий выборки | Столько кадров с предыдущего были пропущены; он следует за остальным вердиктом кадра после ·. |
Список хранит новейшие 4000 кадров и рисует новейшие 300, подходящие под фильтры; под фильтрами написано, сколько показано из скольких подходящих.
Фильтрация
- Введите текст в поле (фильтр по адресу, пиру, источнику…), чтобы оставить кадры, у которых краткое описание, пир, источник, протокол или вердикт содержат этот текст.
- Щёлкайте плашки протоколов (
osc,udp,tcp,http,mqtt,ws), чтобы показать только эти протоколы. Если ни одна плашка не включена, показываются все протоколы. - Щёлкните
txилиrx, чтобы показать только отправленные или только полученные кадры. - Кнопка сбросить сбрасывает все три.
Фильтры меняют только то, что показывает список. Захват, счётчики и экспорт всегда охватывают всё.
Пауза и очистка
Кнопка Пауза замораживает список, чтобы вы могли читать его, пока трафик идёт; захват продолжается. Кнопка Продолжить снова впускает новые кадры. Кадры, пришедшие, пока вид был на паузе, в список не добавляются, но они есть в захвате и в экспорте.
Кнопка Очистить очищает список и захват и обнуляет счётчики.
Счётчики и пропуски
Полоса вверху считает захваченные кадры и их байты и показывает, насколько заполнен захват (хранимые кадры из 8192).
Когда кадры приходят быстрее, чем список успевает их принять, — больше 250 примерно за одну восьмую секунды, — список пропускает самые старые из них. Тогда жёлтая плашка считает не показанные кадры, а строка в списке отмечает, где они отсутствуют. Эти кадры всё ещё в захвате, если их с тех пор не вытеснили более новые: экспортируйте захват, чтобы их увидеть.
Подробности кадра
Щёлкните строку, чтобы увидеть кадр справа.
| Поле | Что это |
|---|---|
| номер | Номер кадра. Номера растут в порядке захвата и никогда не используются повторно. |
| Время | Когда кадр захвачен. |
| направление | Отправлен или получен. |
| Протокол | Как в списке. |
| источник | Инструмент, который его захватил (osc-send, osc-monitor, netsim, emulator, experiment-wait, …), и номер его задачи, если он относится к задаче. |
| локальный | Адрес с этой стороны, если он есть. Для кадра через реле — адрес, на котором слушает реле. |
| Пир | Другая сторона. Для кадра через реле — куда он шёл: цель или клиент, которому ушёл ответ. |
| размер | Размер в байтах. |
| Вердикт | Как в списке. |
В разделе Декодировано кадр прочитан в своём протоколе: каждое сообщение OSC-бандла с аргументами, заголовки HTTP-ответа и начало его тела, запрос эмулятора и его ответ.
В разделе Байты — hex-дамп: смещение, 16 байт в hex и те же байты как текст. Список несёт первый КиБ каждого кадра; если кадр длиннее, кнопка под дампом загружает его целиком.
Что хранит кадр
| Предел | Значение | При достижении предела |
|---|---|---|
| Байты, которые хранит один кадр | 256 КиБ | Более длинный кадр хранит первые 256 КиБ и сообщает, какую часть от общего размера сохранил. |
| Кадры в захвате | 8192 | Самый старый кадр уступает место. |
| Байты, которые хранит весь захват | 64 МиБ | Самые старые кадры уступают место. |
Некоторые кадры не хранят байтов: HTTP-обмены (их размер записывается, а заголовки ответа и начало тела вместо этого лежат в расшифрованном тексте) и открытые порты из Сканера.
Кадр MQTT хранит содержимое сообщения, а не пакет протокола вокруг него; топик, QoS и флаг retain — в его кратком описании.
Секреты
Пока запуск эксперимента или действие Отправить сейчас использует секреты, их значения маскируются в каждом кадре до захвата: •••• в кратком описании, расшифрованном тексте, адресах и вердикте и * для каждого байта содержимого, чтобы смещения в дампе оставались верными. Учётные данные экрана HTTP тоже никогда не появляются: HTTP-кадр хранит ответ, а не отправленный заголовок Authorization.
Сохранение кадра как сигнала
Чтобы сохранить пойманный пакет и отправить его снова позже — когда устройства, которое его отправило, уже нет рядом:
- Выберите кадр.
- Нажмите Сохранить как сигнал.
Сигнал попадает в папку Захвачено библиотеки сигналов со всеми байтами кадра, взятыми из того, что сохранил захват, а не из расшифрованного текста. Он назван по краткому описанию кадра, а его заметка говорит, из какого кадра он получен.
Что получится, зависит от кадра:
| Кадр | Сигнал |
|---|---|
| Датаграмма OSC или UDP | Сырой UDP-сигнал с байтами кадра в hex. |
| Публикация MQTT — отправленная, полученная или эмулятора | MQTT-сигнал с брокером, топиком, QoS и флагом retain кадра и его содержимым как текстом — в точности как было. Пустое содержимое сохраняется, поэтому снятие retained-значения можно сохранить. |
| Любое другое: поток TCP (в том числе прошедший через реле или от TCP-узла), HTTP-обмен, сообщение WebSocket, пакет MQTT, не являющийся публикацией (подписка клиента на эмуляторе) | Ничего: кнопка отключена, и её подсказка объясняет почему. Сигнал отправляет одну датаграмму или одну публикацию; эти кадры нельзя отправить снова такими, какими они были. |
Куда уходит датаграмма:
- для принятого кадра — на адрес, который его принял (сторона локальный), так что сигнал заменяет отправителя;
- для отправленного кадра — на пир, которому он был отправлен;
- для кадра через реле, в любую сторону, — на адрес, куда он шёл: на цель для кадра от клиента, на клиента для ответа.
Если этот адрес — все адреса этого компьютера (монитор, слушающий на 0.0.0.0:9000 или [::]:9000), сигнал нацеливается вместо этого на сам компьютер: 127.0.0.1:9000 или [::1]:9000. Откройте сигнал и измените его адресат, если имеете в виду другой адрес.
MQTT-сигнал уходит на брокер, указанный в кадре. Брокер, слушающий на всех адресах, достигается на 127.0.0.1 так же.
Кнопка отключена также для:
- кадра, сохранённого не целиком: больше 256 КиБ или не сохранившего байтов;
- сообщения MQTT, содержимое которого не текст, — содержимое сигнала является текстом, поэтому его байты нельзя было бы отправить снова такими, какими они были;
- принятого кадра, у которого с этой стороны не назван сокет, — отправлять некуда.
Кадр, который захват уже отпустил, тоже нельзя сохранить; консоль сообщает об этом. Пока файл библиотеки нельзя прочитать, кнопка Сохранить как сигнал тоже отключена, а её подсказка показывает ошибку файла (см. Сигналы).
Экспорт
Кнопки Экспорт .jsonl и Экспорт .txt записывают весь захват — до 8192 кадров, каждый байт, который каждый из них сохранил, независимо от того, что показывают фильтры, — в файл capture-<time>.jsonl или capture-<time>.txt в папке данных (см. Файлы и папки). Консоль сообщает, куда. В браузере, подключённом к серверу, файл записывается на сервере, а браузер его скачивает.
Пустой захват не записывается; консоль сообщает, что сохранять нечего.
.jsonl— один объект JSON на строку, одна строка на кадр:seq,ts(миллисекунды с 1970 года),proto,dir,source,job_id,local,remote,bytes,kept,summary,detail,hex(дамп первого КиБ),verdictиdata— сохранённые байты в base64..txt— для чтения: строка на кадр с номером, временем, направлением, протоколом, пиром, размером и вердиктом, затем его краткое описание, расшифрованный текст и hex-дамп каждого сохранённого байта.
{"seq":12,"ts":1767225600123,"proto":"osc","dir":"rx","source":"osc-monitor","job_id":3,"local":"0.0.0.0:9000","remote":"127.0.0.1:53211","bytes":20,"summary":"/fader/1 0.75","detail":"/fader/1 0.75","hex":"0000 2f 66 61 64 65 72 2f 31 00 00 00 00 2c 66 00 00 |/fader/1....,f..|\n0010 3f 40 00 00 |?@..|\n","verdict":null,"kept":20,"data":"L2ZhZGVyLzEAAAAALGYAAD9AAAA="}Переходы из других мест
Другие экраны указывают на кадры: ожидание на ленте запуска эксперимента ссылается на кадр, который оно приняло, а в списке принятого у эмулятора на каждом обмене есть кнопка ⌕ (Открыть в Инспекторе). Переход по такой ссылке открывает Инспектор с выбранным кадром, сброшенными фильтрами и возобновлённым видом.