Вы рассчитываете пинг соединения WebSocket? - PullRequest
6 голосов
/ 01 мая 2011

маленький вопрос. Как я могу рассчитать пинг подключения WebSocket? Сервер настроен с использованием Node.js и node-websocket-server, если это вообще имеет значение.

Ответы [ 4 ]

7 голосов
/ 04 апреля 2012

Есть несколько способов. Тот, который предлагает Рейнос, - это неправильно. Потому что время клиента и время сервера разные, и вы не можете их сравнивать.

Решение с отправкой метки времени - это хорошо, но есть одна проблема. Если логика сервера выполняет некоторые решения и вычисления, основанные на ping, то отправка метки времени создает риск того, что клиентское программное обеспечение или MITM изменят метку времени, и это даст серверу другие результаты.

Гораздо лучшим способом является отправка пакета клиенту с уникальным идентификатором, который не является номером приращения, а рандомизирован. И тогда сервер будет ожидать от клиента сообщения «PONG» с этим идентификатором. Размер идентификатора должен быть таким же, я рекомендую 32 бита (int). Таким образом, сервер отправляет «PING» с уникальным идентификатором и хранит метку времени отправленного сообщения, а затем ждет, пока не получит ответ «PONG» с тем же идентификатором от клиента, и рассчитает задержку прохождения сигнала в обоих направлениях на основе сохраненной метки времени и нового один на момент получения сообщения PONG. Не забудьте реализовать случай с тайм-аутом, чтобы предотвратить потерю пакета PING / PONG и остановить процесс проверки задержки.

Также WebSockets имеет специальный код операции пакета, называемый PING, но пример из поста выше не использует эту функцию. Прочтите этот официальный документ, который описывает этот конкретный код операции, это может быть полезно, если вы реализуете свой собственный протокол WebSockets на стороне сервера: http://tools.ietf.org/html/rfc6455#page-37

5 голосов
/ 02 мая 2011

Чтобы рассчитать задержку, вам действительно нужно совершить круговое путешествие. У вас должно быть сообщение ping с отметкой времени. Когда одна или другая сторона получает пинг, она должна изменить его на понг (или gnip или что-то еще), но сохранить первоначальную метку времени и отправить ее обратно отправителю. Затем исходный отправитель может сравнить временную метку с текущим временем, чтобы увидеть, какова задержка при передаче туда и обратно. Если вам нужно однонаправленное деление задержки на 2. Причина, по которой вам нужно сделать это таким образом, заключается в том, что без каких-либо очень сложных алгоритмов асимметрии времени время на одном хосте против другого не будет сопоставимым при таких небольших дельтах времени, как этот.

1 голос
/ 28 января 2012

У веб-сокетов есть сообщение типа ping, на которое сервер может ответить сообщением типа pong. См. this для получения дополнительной информации о websockets.

0 голосов
/ 01 мая 2011

Вы можете отправить запрос через веб-сокет с Date.now() в качестве данных и сравнить его с Date.now() на сервере.

Это дает вам разницу во времени между отправкой пакета и его получением плюс время обработки на любом конце.

...