Надсилання кадру для пінг / понг вебсокета з браузера


130

Я постійно читаю про повідомлення пінг / понг у веб-розетках, щоб підтримувати зв’язок живим, але я не впевнений, що вони є. Це виразний тип кадру? (Я не бачу жодних методів для об’єкта javascript WebSocket у хромі, пов’язаних із пінг-понгом). Або це просто схема дизайну (наприклад, я буквально надсилаю "ping" або будь-яку іншу рядок на сервер і даю йому відповісти). Чи взагалі пов’язаний пінг-понг із рамками продовження?

Причина, про яку я запитую, - це те, що я використовую структуру python, яка працює за Mongrel2, тому мені цікаво, чи є спосіб надіслати Mongrel2 конкретне повідомлення для ping / pong, яке б підказало йому підтримувати зв’язок живим, не потребуючи додатку python турбуйся про це. Я думаю, аналогічно тому, що для нього є окремий метод HTTP. І я думаю, що виділений кадр повідомлень для пінг / понг може бути простішим (менше навантаження на сервер та мережу), ніж рядок "ping", хоча це, мабуть, мало би мало значення.

EDIT: Я щойно подивився на RFC 6455 і, схоже, Ping і Pong - це безумовно типи кадрів управління з власними опкодами. Тож як я можу надіслати кадр Ping з JavaScript у Chrome?


Просто пінг із сервера. Усі знають про проблему з мережею на нестандартних портах, тому вони починають пінг через регулярні короткі проміжки часу. Я думаю, ви могли б пінг-сервер, який погано написаний, але це може бути не надто розумним, щоб зробити з ними щось чутливе.


@ user1382306 пінг-сервер спочатку буде використовувати акумулятор мобільного пристрою дуже швидко. Пінг від клієнта може заощадити акумулятор пристрою.
бронзовий чоловік

@ user1382306 Не зовсім всі! У чому полягає проблема з мережею на нестандартних портах?
HappyDog

Відповіді:


121

Немає API Javascript для надсилання кадрів пінг або отримання кадрів понг. Це або підтримується вашим браузером, або ні. Також немає API, який би вмикав, налаштовував або визначав, чи підтримує веб-переглядач та використовує кадри ping / pong. Була дискусія щодо створення API для ping / pong Javascript для цього. Існує ймовірність, що пінг може бути налаштований / виявлений у майбутньому, але навряд чи Javascript зможе безпосередньо надсилати та отримувати кадри пінг / понг.

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


1
@bigmugcup Посилання мертве
містер Джо

19

Ping призначений для надсилання лише з сервера на клієнта, а браузер повинен відповісти якомога швидше за допомогою Pong OpCode. Тож вам не доведеться турбуватися про це на вищому рівні.

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


73
Де ви читали, що ping є лише від сервера до клієнта? RFC говорить: "Кінцева точка МОЖЕ надіслати кадр Ping будь-коли після встановлення з'єднання і до того, як з'єднання буде закрите."
xryl669

7
Якщо ви хочете, щоб клієнт автоматично виявляв відключений стан (коли не було отримано пакетів RST / FIN, але мережа була відключена), тоді вам також потрібно мати клієнт ініціювати пінг-пакети.
pschwamb

13
TCP не повідомляє про відключення, коли пакети RST / FIN не були отримані. TCP виявляє відключені з'єднання лише тоді, коли відправник намагається надіслати відключене з'єднання. У багатьох додатках пінг використовується як серцебиття, і це дійсне використання. Мертве з'єднання просто залишиться мертвим назавжди, поки клієнт не спробує надіслати. Отже, за допомогою WebSockets у веб-переглядачі, для виявлення відключення клієнта на стороні клієнта необхідно використовувати спеціальне повідомлення (або серцебиття). Сервер, можливо, намагається пінг і виявити відключення клієнта, але клієнт не повідомляється про це. Клієнтський пінг також добре.
DDS

15
У RFC 6455, протокол WebSocket, прямо вказано: "ПРИМІТКА. Кадр Ping може служити або як збереження, або як засіб перевірити, чи віддалена кінцева точка все ще відповідає".
DDS

4
Можливо, що серверний пінг був рекомендованою практикою, коли користувацькі агенти часто оновлювалися. Але зараз багато веб-сайтів розроблені як СПА. У цьому середовищі для клієнтської програми може бути дуже важливо регулярно здійснювати пінг-сервер, щоб переконатися, що з'єднання не було втрачено.
Ноель Абрахамс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.