Отправка фрейма ping / pong websocket из браузера

130

Я продолжаю читать о сообщениях ping / pong в веб-сокетах, чтобы поддерживать соединение, но я не уверен, что это такое. Это особый тип кадра? (Я не вижу никаких методов в объекте javascript WebSocket в Chrome, связанных с пинг-понгом). Или это просто шаблон проектирования (например, я буквально отправляю на сервер команду ping или любую другую строку, и он отвечает). Связан ли пинг-понг с фреймами продолжения?

Причина, по которой я спрашиваю, заключается в том, что я использую платформу python, которая работает за Mongrel2, поэтому мне интересно, есть ли способ отправить Mongrel2 конкретное сообщение ping / pong, которое сообщило бы ему, чтобы оно поддерживало соединение без необходимости моего приложения python беспокоиться об этом. Полагаю, это аналогично тому, что для этого есть отдельный HTTP-метод. И я предполагаю, что выделенный фрейм сообщения ping / pong может быть проще (меньше нагрузки на сервер и сеть), чем строка «ping», хотя это, вероятно, не будет иметь большого значения.

РЕДАКТИРОВАТЬ: Я только что посмотрел на RFC 6455, и похоже, что Ping и Pong определенно являются типами управляющих кадров со своими собственными кодами операций. Итак, как мне отправить фрейм Ping из javascript в Chrome?

Danny
источник
Просто пинг с сервера. Все знают о сетевых проблемах с нестандартными портами, поэтому они начинают пинговать через регулярные короткие промежутки времени. Я предполагаю, что вы могли бы пинговать плохо написанный сервер, но, возможно, было бы не слишком разумно делать с ними что-то важное.
github.com/websockets/ws/issues/977
firstpostcommenter 01
@ user1382306 ping с сервера сначала будет расходовать заряд батареи мобильного устройства очень быстро. Пинг от клиента может сэкономить аккумулятор устройства.
бронзовый мужчина
@ user1382306 Не совсем все! В чем проблема с сетью на нестандартных портах?
HappyDog

Ответы:

121

Не существует Javascript API для отправки фреймов ping или получения фреймов pong. Это либо поддерживается вашим браузером, либо нет. Также нет API для включения, настройки или определения того, поддерживает ли браузер и использует ли кадры ping / pong. Была дискуссия о создании для этого Javascript ping / pong API . Существует вероятность того, что в будущем ping-запросы можно будет настраивать / обнаруживать, но маловероятно, что Javascript сможет напрямую отправлять и получать кадры ping / pong.

Однако, если вы контролируете и клиентский, и серверный код, вы можете легко добавить поддержку ping / pong на более высоком уровне. Вам понадобится какой-то заголовок / метаданные типа сообщения в вашем сообщении, если у вас их еще нет, но это довольно просто. Если вы не планируете отправлять эхо-запросы сотни раз в секунду или не имеете тысяч одновременных клиентов, накладные расходы будут минимальными, если вы сделаете это самостоятельно.

канак
источник
1
@bigmugcup Ссылка мертва
г-н Джо
19

Ping предназначен для отправки только от сервера к клиенту, и браузер должен ответить как можно скорее с помощью Pong OpCode, автоматически. Так что вам не нужно беспокоиться об этом на более высоком уровне.

Хотя не все браузеры поддерживают стандарт, как они предполагают, у них могут быть некоторые отличия в реализации такого механизма, и это может даже означать, что функция ответа Pong отсутствует. Но лично я использую Ping / Pong и никогда не видел клиента, который не реализует этот тип OpCode и автоматический ответ на низкоуровневой реализации на стороне клиента.

мокко
источник
73
Где вы читали, что пинг идет только от сервера к клиенту? RFC гласит: «Конечная точка МОЖЕТ отправить фрейм Ping в любое время после установления соединения и до его закрытия».
xryl669
7
Если вы хотите, чтобы клиент автоматически обнаруживал отключенное состояние (когда не было получено никаких пакетов RST / FIN, но сеть была отключена), вам также необходимо, чтобы клиент инициировал пакеты ping.
pschwamb
13
TCP не уведомляет об отключении, если пакеты RST / FIN не были получены. TCP обнаруживает разорванные соединения только тогда, когда отправитель пытается отправить сообщение по отключенному соединению. Пинги используются в качестве контрольных сигналов во многих приложениях, и это допустимое использование. Мертвое соединение просто останется мертвым навсегда, пока клиент не попытается отправить. Таким образом, с WebSockets в браузере необходимо использовать настраиваемое сообщение ping (или heartbeat) для обнаружения отключения клиента на стороне клиента. Сервер может пытаться выполнить эхо-запрос и обнаружить отключение клиента, но клиент не проинформирован. Пинги клиентов тоже в порядке.
DDS
15
В RFC 6455, Протокол WebSocket, он явно заявляет: «ПРИМЕЧАНИЕ. Фрейм Ping может служить либо как подтверждение активности, либо как средство для проверки того, что удаленная конечная точка по-прежнему отвечает».
DDS
4
Возможно, что проверка связи только с сервером была рекомендованной практикой, когда пользовательские агенты часто обновлялись. Но сейчас многие сайты созданы как SPA. В этой среде для клиентского приложения может быть очень важно регулярно проверять связь с сервером, чтобы гарантировать, что соединение не было потеряно.
Ноэль Абрахамс