#node.js #connection #websocket #ping
#node.js #подключение #websocket #ping
Вопрос:
небольшой вопрос. Как я могу вычислить ping соединения WebSocket? Сервер настроен с использованием Node.js и узел-websocket-сервер, если это вообще имеет значение.
Комментарии:
1. Что должно означать «вычислить ping»?
2. Чтобы вычислить задержку, которую имеет соединение.
Ответ №1:
Существует несколько способов. Тот, который предлагает Raynos — неверен. Потому что время клиента и время сервера различны, и вы не можете их сравнивать.
Решение с отправкой метки времени хорошее, но у него есть одна проблема. Если логика сервера принимает некоторые решения и вычисления на основе ping, то отправка метки времени создает риск того, что клиентское программное обеспечение или MITM изменят метку времени, таким образом, это выдаст серверу другие результаты.
Гораздо лучшим способом является отправка пакета клиенту с уникальным идентификатором, который не является числом приращения, а рандомизирован. И тогда сервер будет ожидать от клиента сообщение «PONG» с этим идентификатором. Размер идентификатора должен быть одинаковым, я рекомендую 32 бита (int). Таким образом, сервер отправляет «PING» с уникальным идентификатором и сохраняет временную метку момента отправки сообщения, а затем ожидает, пока не получит ответ «PONG» с тем же идентификатором от клиента, и вычислит задержку обратного перехода на основе сохраненной временной метки и новой на момент получения сообщения PONG. Не забудьте реализовать case с таймаутом, чтобы предотвратить потерю пакета PING / PONG, остановив процесс проверки задержки.
Кроме того, в WebSockets есть специальный код пакетной операции, называемый PING, но в примере из поста выше эта функция не используется. Прочитайте этот официальный документ, который описывает этот конкретный код операции, это может быть полезно, если вы реализуете свой собственный протокол WebSockets на стороне сервера: https://www.rfc-editor.org/rfc/rfc6455#page-37
Ответ №2:
Чтобы вычислить задержку, вам действительно следует выполнить обратный переход. У вас должно появиться сообщение ping, в котором есть временная метка. Когда та или иная сторона получает ping, она должна изменить его на pong (или gnip или что-то еще), но сохранить исходную временную метку и отправить ее обратно отправителю. Затем исходный отправитель может сравнить временную метку с текущим временем, чтобы увидеть, какова задержка в обратном направлении. Если вам нужна задержка в одну сторону, разделите на 2. Причина, по которой вам нужно сделать это таким образом, заключается в том, что без некоторых очень сложных алгоритмов перекоса времени время на одном хосте по сравнению с другим не будет сопоставимым при таких малых временных интервалах, как этот.
Ответ №3:
Веб-сокеты имеют сообщение типа ping, на которое сервер может ответить сообщением типа pong. Смотрите Это для получения дополнительной информации о websockets.
Ответ №4:
Вы можете отправить запрос через веб-сокет с Date.now()
данными as и сравнить его с Date.now()
данными на сервере.
Это дает вам разницу во времени между отправкой пакета и его получением плюс любое время обработки на обоих концах.
Комментарии:
1. Есть ли какой-либо эффективный способ сделать это, чтобы оно автоматически обновлялось?
2. @Alexander непрерывный опрос или прикрепление временных меток к каждому запросу веб-сокета. Вам нужна задержка для чего-либо, кроме информации? Его следует использовать только для ведения журнала, а не для изменения способа работы вашего приложения
3. Это просто для ведения журнала, чтобы увидеть, как изменяются задержки, которые имеют подключенные клиенты, и для отображения на самой странице.
4. Вы не можете сравнить дату на другом конце связи. Его необходимо сравнить с источником сообщения. Сервер и клиент могут не совпадать по времени.