Подтвердить что ты не робот

Накладные расходы на Idle WebSockets

Скажем, у меня есть веб-сайт, который может получать событие в любое время, но в основном бездействует, сколько полос пропускания будет потребляться после первоначального соединения, чтобы сохранить его?

Для чего это стоит, сервер NodeJS использует ws, а клиент использует QtWebSockets.

Спасибо!

4b9b3361

Ответ 1

После установки (это означает, что трехстороннее рукопожатие завершается), необработанное TCP-соединение использует нулевую пропускную способность, если:

  • Вы отправляете или получаете данные
  • TCP keepalives явно включены

Сервер или клиент могут включить TCP keepalives. Контрольный пакет - это пакет с нулевой длиной, отправленный с установленным флагом ACK, и только 54 байта отправлены на проводе плюс еще 54 для ответа. По умолчанию TCP keepalives отправляются каждые два часа. Другими словами, совершенно пренебрежимо мало.

У WebSockets также есть свой собственный механизм keepalive (с прокси-серверами). Сервер или клиент может отправить кадр PING, а другой конец ДОЛЖЕН ответить кадром PONG. Хотя для отправки PING s не существует JS API на стороне браузера, сервер node может отправить их, и совместимый браузер автоматически ответит. (QtWebSockets имеет API для отправки PING s.) Это не происходит по умолчанию; вы должны сделать это вручную. Кадры WebSocket PING и PONG не менее 7 байтов и не более 131 байт каждый (плюс 54 байта служебных данных TCP/IP). Таким образом, один PING/PONG стоит от 122 до 370 байт.

ws не выполняет никаких keepalives автоматически, равно как и QtWebSockets. Поэтому, чтобы ответить на ваш вопрос, в конфигурации по умолчанию используется нулевая пропускная способность для поддержки TCP-соединения.

Однако...

Хранилища важны, потому что промежуточные устройства (например, маршрутизаторы NAT) будут отключать неактивные TCP-соединения. В зависимости от сетей между вашим сервером и вашими клиентами это означает, что если у вас нет каких-либо keepalives, ваши клиенты потеряют свои соединения (возможно, не зная об этом, что плохо), и вам придется повторно использовать сеанс WebSocket, Это, вероятно, будет намного более дорогостоящим с точки зрения пропускной способности, чем использование разумных keepalives.

A PING/PONG каждые 5 минут стоит 1,5-4,4 кБ в час (на одного клиента).


Примечание: у socket.io есть свой собственный механизм keepalive (отдельно от WebSockets), который по умолчанию включен. Sio keepalive управляется библиотекой sio и происходит по каналу данных WebSocket (в отличие от WebSocket PING/PONG, которые являются управляющими кадрами). Сервер socket.io отправляет 8-байтное (+ служебное) сообщение keepalive каждые 30 секунд, что составляет около 15 кБ в час.