Files
utun2/tools/etcpmon/etcpmon_doc.md
T

128 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# etcpmon
## 1. Назначение
Windows GUI монитор для ETCP соединений uTun в реальном времени (100ms refresh). Подключается по TCP к control_server внутри uTun и отображает метрики соединений, линков, TUN-интерфейса, роутера и дебаг-уровней. Позволяет менять debug levels на лету через GUI.
Connections и локальные сокеты опрашиваются раз в секунду, даже при пустом списке соединений.
Выбор сохраняется по ID узла при изменении порядка и имён. При удалении выбранного соединения
выбирается первое доступное; пустой список или отключение очищает метрики и график.
Одновременно ожидается не более одного ответа на автоматический запрос метрик. Таймаут ответа
на запрос с seq_id — 5 секунд; причина отключения записывается в `etcpmon.log`.
## 2. Как пользоваться
### Типовой сценарий
1. В конфиге uTun (`utun.conf`): `control_ip=127.0.0.1`, `control_port=9090`
2. Запустить uTun → он поднимает TCP control server на указанном порту
3. Запустить `etcpmon.exe` (Windows, MinGW/MSYS2 сборка)
4. Ввести IP:порт сервера (по умолчанию `192.168.40.1:9091`), нажать Connect
5. Выбрать соединение из списка Connections — начнут поступать метрики
### Что отображает
**ETCP Connection:**
- RTT (last / avg10 / avg100, в 0.1ms), jitter, bytes sent, retransmissions, ACKs, unacked bytes, optimal inflight, links count
- RX/TX дубликаты, таймеры (retrans/ack_resp), WaitAck состояние (suspended/cb/timer)
- ID Sequence: next_tx_id, last_rx_id, last_delivered_id, rx_ack_till
- Счётчики ошибок: reinit, reset, pkt_format_errors
**TUN / Routing:**
- Bytes/packets read/written, ошибки чтения/записи
- Routed/dropped пакеты, TUN очереди (InQ/OutQ packets/bytes)
- Таблица маршрутов: total, local, learned, BGP senders, BGP nodes
**Links:**
- Статус (UP/DOWN), encrypt/decrypt/send/recv ошибки
- Total encrypted/decrypted bytes, bandwidth (Kbps), NAT changes
- RTT (last/avg10), transmit time, keepalive counters (sent/recv)
- Inflight bytes/packets/limit, таймеры (init/keepalive/shaper)
**BBR per link:**
- mode (STARTUP/DRAIN/PROBE_BW/PROBE_RTT), cycle idx, full_bw/loss_in_round флаги
- pacing_rate (bytes/sec), min_rtt (us), bw_hi/bw_lo (bytes/sec), inflight_hi/lo, pacing_gain
**Router Congestion (агрегированные):**
- total_conns, total_inflight, total_send_q, total_recv_q
- pkts sent/recv, send err, ACK sent/recv, dup_dropped, oob_dropped, stale_ack, sign_fail
- RTT max/avg, jitter max, minRTT min
**Графики BBR (scrolling canvas, 860 сэмплов, 1px=1sample):**
- Inflight Bytes, Cwnd (inflight_lim), minRTT, bwHi, Pacing Rate, bwLo, inflight Hi, BBR Mode
- 8 каналов с индивидуальными галочками включения
- Вертикальная линия курсора с показом значений в блоках под графиком
**Очереди (Queues & Errors):**
- InQ, InSend, WaitAck, AckQ, RecvQ, OutQ — bytes/packets
- Нормализатор: input/output pkts/bytes, alloc/logic errors, frag_size, data_ptr/size, cumulative totals
- ACK Debug: hit_inf, hit_sndq, miss, link_wait
- Системные ресурсы: active_timeouts, busy_memory_blocks
**Debug Levels (правая колонка):**
- Глобальный уровень: NONE/ERROR/WARN/INFO/DEBUG/TRACE (радиокнопки)
- Per-category уровни с метками категорий
- Radio-кнопки отправляют CMD_SET_DEBUG_CONFIG на сервер при клике
**Action:**
- Текстовое поле + кнопка Send — отправка произвольной команды (CMD_ACTION)
- Результат открывается в отдельном окне с моноширинным шрифтом Consolas
### Сборка
```cmd
cd tools\etcpmon
build.bat # через MSYS2 UCRT64 (рекомендуется)
```
```bash
bash build.sh # Unix/MinGW
make # MinGW Makefile
make check # WinAPI/Winsock регрессии списка, выбора и переподключения
```
Серверная часть (control_server) встроена в utun, собирается стандартным `./configure && make`.
### Горячие клавиши
- Tab в поле Server/Port — переключение между полями
- Enter в поле Server/Port — Connect/Disconnect
- Enter в поле Action — отправка команды
## 3. API / Структура
### Компоненты
| Файл | Назначение |
|------|-----------|
| `etcpmon_main.c` | WinMain: инициализация GUI, создание окна, message loop |
| `etcpmon_client.h/c` | TCP клиент (Winsock2): connect, send/recv, парсинг протокола, history, pending requests с коллбэками |
| `etcpmon_gui.h/c` | WinAPI GUI: окно 1000×1400, все контролы (~200 edit-полей, списки, кнопки, radio, graph), тултипы |
| `etcpmon_graph.h/c` | Real-time график: 8 каналов, off-screen буфер, пересчёт min/max, курсор, обновление channel values |
| `etcpmon_protocol.h` | Бинарный протокол, общие структуры, shared между клиентом и сервером |
### Протокол (бинарный, TCP)
Формат: `[size:2][type:1][seq_id:1][payload...]`
**Клиент → Сервер:**
- `0x01` CMD_LIST_CONN — запрос списка соединений (без payload)
- `0x02` CMD_SELECT_CONN — выбор соединения: `peer_node_id` (uint64_t)
- `0x03` CMD_GET_METRICS — запрос метрик для выбранного соединения
- `0x04` CMD_DISCONNECT — отключение
- `0x05` CMD_LIST_SOCKETS — запрос списка локальных сокетов
- `0x06` CMD_ACTION — текстовая команда (32 байта)
- `0x07` CMD_GET_DEBUG_CONFIG — запрос текущих debug levels
- `0x08` CMD_SET_DEBUG_CONFIG — установка debug levels: `[global_level:1][cat_count:1][levels:N]`
- `0x09` CMD_SUBSCRIBE_NODES — подписка на изменения узлов (topo)
**Сервер → Клиент:**
- `0x81` RSP_CONN_LIST: `count(1) + N × {peer_node_id(8) + name(32)}`
- `0x82` RSP_METRICS: `etcp_metrics + tun_metrics + router_metrics + N × link_metrics`
- `0x83` RSP_SOCKET_LIST: `count(1) + N × socket_info`
- `0x84` RSP_DEBUG_CONFIG: `global_level(1) + cat_count(1) + names_csv(NUL-term) + levels[N]`
- `0x85` RSP_NODE_INFO — один узел (raw BGP_NODEINFO_PACKET)
- `0x86` RSP_NODE_INFO_END — конец списка узлов
- `0x88` RSP_NODE_REMOVED — узел удалён: `node_id(8)`
- `0x89` RSP_ACTION_RESULT — результат команды: `code(1) + text(NUL-term)`
- `0xFF` RSP_ERROR: `error_code(1) + message(NUL-term)`