Определить точный объём трафика (байт/мин), генерируемый WebSocket ping/pong-фреймами в состоянии простоя.
Причины
- Размер самого маленького ping-фрейма по RFC 6455:
- `0x89 0x00` → 2 байта (сервер → клиент, без маски).
- Клиент обязан отправлять маскированные фреймы: `0x89 0x80` + 4 байта маски + 0 байт payload → 6 байт.
- Pong-фрейм: те же 2 (сервер) или 6 (клиент) байт, но обычно pong не маскируется (отправляется в ответ без маски).
- 1 цикл ping+pong в простое:
Клиент отправил ping (6 байт), получил pong (2 байта) → 8 байт трафика (уровень приложения).
- Частота настраивается (по умолчанию 30–60 с).
Решение
1. Расчёт при default 30 с (2 цикла/мин): 8 × 2 = 16 байт/мин (полезные данные).
2. Расчёт с учётом TCP/IP (20 IP + 20 TCP = 40 байт на пакет):
- 2 пакета (ping, pong) → 80 байт заголовков + 8 байт данных = 88 байт/мин.
3. Оптимизация:
- Увеличить интервал до 60 с → 8 байт/мин приложения, 48 байт/мин с заголовками.
- Использовать пустой payload (0 байт) — уже учтено.
- Отключить ping/pong и полагаться на TCP keepalive? (Не всегда надёжно для WebSocket).
Команды/настройка (пример для Node.js ws-модуля):
javascript
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
pingInterval: 60000, // 60 секунд между pings
pingTimeout: 5000 // таймаут ожидания pong
});Или для клиента: `ws.ping('', false)` – пустой маскированный ping.
Вывод:
В режиме простоя минимальный трафик ping/pong — 8 байт/мин (приложение) или ~48–88 байт/мин (L4).