检查器
检查器是所有工具共用的同一条时间线:每条 OSC 消息、每个数据报、每次 HTTP 交换、每次 MQTT 发布、每条 WebSocket 消息、每个中继的数据包和模拟器的交互都会落入其中,附带其构成的字节,并已解码。用它来查看实际上线上传了什么、以什么顺序,以及它遭遇了什么。
它位于底部面板中,是控制台旁边的 检查器 标签页,因此在每个界面上都能找到。点击该标签页即可打开;面板打开时的高度足以容纳几行和一帧的详情。⤢ 按钮(与窗口同高)会让面板高至整个窗口。关闭面板或切换界面时,检查器会保留其列表和选择。
捕获
Signal Lab 启动时捕获是关闭的,关闭期间没有任何开销:工具甚至不会构建帧。
- 打开 检查器 标签页。
- 按 启用捕获。标签页上的圆点会变红并跳动。
- 使用任意工具。帧会出现在列表顶部,最新的在最前。
- 得到所需内容后,按 停用捕获。
无论您在哪个界面,标签页都会显示已捕获了多少帧。
帧从您开启捕获的那一刻起被捕获,绝不追溯之前:先开启,再发送。
在服务器上,捕获属于服务器:登录到它的每个页面看到的都是相同的帧,在一个页面上开启或清除捕获,会对所有页面生效。
捕获的内容
| 工具 | 帧 | 数量 |
|---|---|---|
| OSC:发送 | 发送的每条消息 | 每一条 |
| OSC:监视器 | 收到的每个数据包;无法解码的会标出解码错误 | 每一个 |
| OSC:信号生成器 | 发送的消息 | 每 100 ms 最多一条,标为 sampled |
| 广播:发送一次 | 每个数据报,每个目标一个;发送失败时附带其错误 | 每一个 |
| 广播:信标 | 发送的数据报 | 每 50 ms 最多一个 |
| 广播:发现监听器 | 收到的探测 | 每 40 ms 最多一个 |
| 广播:发现监听器 | 它的应答(auto-reply) | 每一个 |
| HTTP:发送、信号、实验请求 | 每次交换:请求行、状态和时间、响应标头和正文开头 | 每一次 |
| HTTP:负载突发,以及负载下的请求 | 交换 | 每 100 ms 最多一次 |
| MQTT:连接 | 发送的发布 | 每一次 |
| MQTT:连接 | 收到的消息 | 每 200 ms 最多一条 |
| MQTT:当界面未连接到其代理时发送的 MQTT 信号 | 该次发布 | 每一次 |
| WebSocket | 发送和接收的消息 | 流量较小时每一条;每秒最多 200 条 |
| 模拟器 | 到达的内容和回复,合在一起 | 每 10 ms 最多一次交换 |
| 网络损伤 | 每个中继的数据报或数据块,两个方向,附带其命运 | 两个方向合计每 25 ms 最多一个 |
| 风暴(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 | 一次空的保留发布。 |
+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 响应的标头和正文开头、模拟器的请求及其回复。
字节 下是十六进制转储:偏移量、16 个十六进制字节,以及相同字节的文本形式。列表携带每帧的前 1 KiB;当帧更长时,转储下方的一个按钮会加载全部内容。
一帧保留什么
| 限制 | 值 | 达到限制时 |
|---|---|---|
| 一帧保留的字节 | 256 KiB | 更长的帧保留其前 256 KiB,并说明它保留了总量的多少。 |
| 捕获中的帧 | 8192 | 最旧的帧让出空间。 |
| 捕获总共保留的字节 | 64 MiB | 最旧的帧让出空间。 |
有些帧不保留字节:HTTP 交换(会记录其大小,响应标头和正文开头则在解码文本中)以及扫描器发现的开放端口。
MQTT 帧保留消息的载荷,而不是其外围的协议数据包;主题、QoS 和保留标志在其摘要中。
机密
当一次实验运行或 立即发送 使用机密时,它们的值会在每一帧被捕获之前被遮蔽:摘要、解码文本、地址和判定中为 ••••,载荷中的每个字节为 *,因此转储中的偏移量保持正确。HTTP 界面的凭据也从不出现:HTTP 帧保存的是响应,而不是已发送的 Authorization 标头。
把一帧保存为信号
要保留您捕获的一个数据包并在以后再次发送它——当发送它的设备已不在了:
- 选择该帧。
- 按 保存为信号。
该信号会进入信号库的 已捕获 文件夹,带有该帧的每一个字节,取自捕获所保留的内容,而不是解码文本。它以该帧的摘要命名,其备注说明它来自哪一帧。
得到的内容取决于该帧:
| 帧 | 信号 |
|---|---|
| 一个 OSC 或 UDP 数据报 | 一个带有该帧字节的原始 UDP 信号,十六进制。 |
| 一次 MQTT 发布——发送的、接收的,或模拟器的 | 一个 MQTT 信号,带有该帧的代理、主题、QoS 和保留标志,其载荷按原样作为文本。空载荷会被保留,因此清除保留值也可以保存。 |
| 其他任何内容:TCP 流(包括中继承载的,或 TCP 节点的)、一次 HTTP 交换、一条 WebSocket 消息、一个不是发布的 MQTT 数据包(客户端在模拟器处的订阅) | 什么都没有:按钮不可用,其提示会说明原因。一个信号发送一个数据报或一次发布;这些内容无法按原样再次发送。 |
数据报会发送到:
- 已接收的帧——接收它的地址(本地 一侧),因此该信号代替发送方;
- 已发送的帧——它被发送到的对端;
- 中继的帧,无论哪个方向——它的去向:从客户端发出的帧发往目标,应答则发往客户端。
当该地址是本机的所有地址时——例如监听 0.0.0.0:9000 或 [::]:9000 的监视器——信号会改为指向本机:127.0.0.1:9000 或 [::1]:9000。如果您指的是另一个地址,请打开该信号并更改其目标。
MQTT 信号会发往帧中所述的那个代理。监听所有地址的代理同样通过 127.0.0.1 访问。
按钮在以下情况下也不可用:
- 未被完整保留的帧:大于 256 KiB 的帧,或没有保留任何字节的帧;
- 载荷不是文本的 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(前 1 KiB 的转储)、verdict,以及data,即它保留的字节以 base64 表示。.txt——供阅读:每个帧一行,包含其编号、时间、方向、协议、对端、大小和判定,然后是它的摘要、解码文本以及它保留的每个字节的十六进制转储。
{"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="}来自别处
其他界面会指向帧:实验时间线中的等待节点会链接到它匹配到的帧,模拟器的接收列表在每个交互上都有一个 ⌕ 按钮(在检查器中打开)。跟随其中之一会打开检查器,选中该帧,清除筛选器并恢复视图。