128 lines
7.5 KiB
Markdown
128 lines
7.5 KiB
Markdown
# 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)`
|