인스펙터
인스펙터는 모든 도구를 위한 하나의 타임라인입니다: 모든 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) | 모두 동일한 폭주 패킷 | 1초에 하나, 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개 중 보관 중인 프레임)를 셉니다.
프레임이 목록이 받아들일 수 있는 것보다 빠르게 도착하면 — 약 8분의 1초에 250개를 넘으면 — 목록은 그중 가장 오래된 것을 건너뜁니다. 그러면 노란 칩이 표시되지 않은 프레임을 세고, 목록의 한 행이 그것들이 빠진 자리를 표시합니다. 그 프레임들은 아직 캡처에 있습니다 — 그 사이 새 프레임이 밀어내지 않았다면: 그것들을 보려면 내보내십시오.
프레임의 상세
행을 클릭하면 오른쪽에 프레임이 보입니다.
| 필드 | 내용 |
|---|---|
| 순번 | 프레임의 번호입니다. 번호는 캡처 순서대로 올라가며 다시 쓰이지 않습니다. |
| 시간 | 캡처된 시각. |
| 방향 | 보냄 또는 받음. |
| 프로토콜 | 목록과 같습니다. |
| 소스 | 그것을 캡처한 도구(osc-send, osc-monitor, netsim, emulator, experiment-wait, …)와, 작업에 속할 때 그 작업 번호입니다. |
| 로컬 | 이쪽의 주소, 있을 때만. 중계된 프레임에서는 릴레이가 수신하는 주소입니다. |
| 피어 | 상대편. 중계된 프레임에서는 가고 있던 곳입니다: 대상, 또는 답이 돌아간 클라이언트. |
| 크기 | 바이트 단위의 크기입니다. |
| 판정 | 목록과 같습니다. |
디코딩 결과 아래에는 그 프로토콜로 읽은 프레임이 있습니다: OSC 번들의 모든 메시지와 그 인수, HTTP 응답의 헤더와 본문의 시작, 에뮬레이터의 요청과 회신입니다.
바이트 아래에는 hex 덤프가 있습니다: 오프셋, hex로 된 16바이트, 그리고 같은 바이트의 텍스트입니다. 목록에는 각 프레임의 처음 1 KiB가 실립니다. 프레임이 더 길면 덤프 아래의 버튼이 전부 불러옵니다.
프레임이 보관하는 것
| 한도 | 값 | 한도에 도달하면 |
|---|---|---|
| 프레임 하나가 보관하는 바이트 | 256 KiB | 더 긴 프레임은 처음 256 KiB를 보관하고, 전체 중 얼마를 보관했는지 알려 줍니다. |
| 캡처의 프레임 | 8192 | 가장 오래된 프레임이 자리를 비켜 줍니다. |
| 캡처가 모두 보관하는 바이트 | 64 MiB | 가장 오래된 프레임들이 자리를 비켜 줍니다. |
일부 프레임은 바이트를 보관하지 않습니다: HTTP 교환(크기는 기록되고, 응답 헤더와 본문의 시작은 대신 디코딩된 텍스트에 있습니다)과 스캐너의 열린 포트입니다.
MQTT 프레임은 메시지의 페이로드를 보관하며, 그것을 둘러싼 프로토콜 패킷은 보관하지 않습니다. 토픽, QoS, retain 플래그는 요약에 있습니다.
시크릿
실험 실행이나 지금 보내기가 시크릿을 사용하는 동안, 그 값은 프레임이 캡처되기 전에 모든 프레임에서 마스킹됩니다: 요약, 디코딩된 텍스트, 주소, 판정에서는 ••••, 페이로드에서는 바이트마다 *이며, 그래서 덤프의 오프셋은 그대로입니다. HTTP 화면의 자격 증명도 절대 나타나지 않습니다: HTTP 프레임은 응답을 보관하고, 보낸 Authorization 헤더는 보관하지 않습니다.
프레임을 신호로 저장하기
잡은 패킷을 보관해 두었다가 나중에 — 그것을 보낸 장치가 더는 없을 때 — 다시 보내려면:
- 프레임을 선택합니다.
- 신호로 저장를 누릅니다.
신호는 신호 라이브러리의 캡처됨 폴더에, 디코딩된 텍스트가 아니라 캡처가 보관한 것에서 가져온 프레임의 모든 바이트와 함께 들어갑니다. 프레임의 요약을 따서 이름이 붙고, 메모는 어느 프레임에서 왔는지 말합니다.
무엇을 얻는지는 프레임에 따라 다릅니다:
| 프레임 | 신호 |
|---|---|
| OSC 또는 UDP 데이터그램 | 프레임의 바이트를 담은 원시 UDP 신호, hex. |
| MQTT 발행 — 보냈거나, 받았거나, 에뮬레이터의 것 | 프레임의 브로커, 토픽, QoS, retain 플래그와, 그대로의 페이로드를 텍스트로 담은 MQTT 신호. 빈 페이로드도 보관되므로 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 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, 그리고 보관한 바이트를 base64로 담은data..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="}다른 곳에서 오기
다른 화면이 프레임을 가리킵니다: 실험의 타임라인에 있는 대기는 일치시킨 프레임을 연결하고, 에뮬레이터의 받은 목록에는 교환마다 ⌕ 버튼(인스펙터에서 열기)이 있습니다. 하나를 따라가면 그 프레임이 선택되고 필터가 지워지고 보기가 재개된 상태로 인스펙터가 열립니다.