Накладные расходы на незанятые WebSockets
Скажем, у меня есть веб-сокет, который может получать события в любое время, но в основном простаивает, какая пропускная способность будет использоваться после первоначального подключения, чтобы поддерживать его?
Для чего это стоит, сервер NodeJS использует ws
и клиент использует QtWebSockets.
Спасибо!
1 ответ
После установления (имеется в виду завершение трехстороннего рукопожатия) необработанное TCP-соединение использует нулевую пропускную способность, если только:
- Вы отправляете или получаете данные
- TCP keepalive явно включен
Сервер или клиент может включить TCP keepalive. Keepalive - это пакет нулевой длины, отправленный с ACK
флаг установлен, и только 54 байта отправлено по проводам плюс еще 54 для ответа. По умолчанию сообщения активности TCP отправляются каждые два часа. Другими словами, совершенно незначительный.
WebSockets также имеет собственный механизм поддержки активности (для работы с прокси). Сервер или клиент может отправить PING
кадр, а другой конец ДОЛЖЕН ответить PONG
Рамка. Пока нет JS API на стороне браузера для отправки PING
s, сервер узла может отправить их, и совместимый браузер автоматически ответит. (QtWebSockets действительно имеет API для отправки PING
s.) Это не происходит по умолчанию; Вы должны сделать это вручную. WebSocket PING
а также PONG
кадры имеют не менее 7 байтов и не более 131 байта каждый (плюс 54 байта служебных данных TCP/IP). Таким образом, один PING
/ PONG
стоит от 122 до 370 байт.
ws не делает никаких сообщений активности автоматически, равно как и QtWebSockets. Поэтому, чтобы ответить на ваш вопрос, конфигурация по умолчанию использует нулевую пропускную способность для поддержания TCP-соединения.
Тем не мение...
Keepalive важны, потому что промежуточные устройства (т.е. маршрутизаторы NAT) будут отбрасывать неактивные TCP-соединения. В зависимости от сетей между вашим сервером и вашими клиентами это означает, что если у вас нет никаких сообщений активности активности, ваши клиенты потеряют свои соединения (возможно, не зная об этом, что плохо), и им придется повторно упростить сеанс WebSocket., Это, вероятно, будет намного дороже с точки зрения пропускной способности, чем активная поддержка активности.
PING
/ PONG
каждые 5 минут стоит 1,5 - 4,4 кБ в час (на одного клиента).
Примечание: socket.io имеет свой собственный механизм поддержки активности (отдельный от WebSockets'), который включен по умолчанию. Keepalive sio управляется библиотекой sio и происходит через канал данных WebSocket (в отличие от WebSocket PING
/ PONG
, которые являются контрольными кадрами). Сервер socket.io отправляет 8-байтовое (+ служебное) сообщение поддержки активности каждые 30 секунд, что составляет около 15 КБ в час.