Wysyłanie ramki ping / pong websocket z przeglądarki

130

Ciągle czytam o wiadomościach ping / pong w gniazdach internetowych, aby utrzymać połączenie, ale nie jestem pewien, jakie one są. Czy jest to inny typ ramki? (Nie widzę żadnych metod w javascriptowym obiekcie WebSocket w chrome związanych z ping-pongiem). Czy jest to tylko wzorzec projektowy (np. Dosłownie wysyłam „ping” lub inny ciąg znaków do serwera i każę mu odpowiedzieć). Czy ping-pong jest w ogóle powiązany z ramkami kontynuacji?

Powodem, dla którego pytam, jest to, że używam frameworka Pythona, który działa za Mongrel2, więc zastanawiam się, czy istnieje sposób na wysłanie Mongrel2 określonej wiadomości ping / pong, która powie mu, aby utrzymywał połączenie bez konieczności mojej aplikacji w języku Python. martw się o to. Wydaje mi się, że analogicznie do posiadania oddzielnej metody HTTP. I wyobrażam sobie, że dedykowana ramka wiadomości ping / pong może być prostsza (mniejsze obciążenie serwera i sieci) niż ciąg „ping”, chociaż prawdopodobnie nie miałoby to większego znaczenia.

EDYCJA: Właśnie spojrzałem na RFC 6455 i wygląda na to, że Ping i Pong są zdecydowanie typami ramek kontrolnych z własnymi opkodami. Jak więc wysłać ramkę Ping z javascript w Chrome?

Danny
źródło
Po prostu ping z serwera. Wszyscy wiedzą o problemach z siecią na niestandardowych portach, więc zaczynają pingować w regularnych krótkich odstępach czasu. Wydaje mi się, że można pingować słabo napisany serwer, ale robienie z nimi czegokolwiek wrażliwego może nie być zbyt sprytne.
@ user1382306 ping z serwera jako pierwszy spowoduje bardzo szybkie zużycie baterii urządzenia mobilnego. Ping z klienta może oszczędzać baterię urządzenia.
człowiek z brązu
@ user1382306 Nie całkiem wszyscy! Jaki jest problem z siecią w przypadku niestandardowych portów?
HappyDog,

Odpowiedzi:

121

Nie ma interfejsu API JavaScript do wysyłania ramek ping lub odbierania ramek pong. Jest to obsługiwane przez Twoją przeglądarkę lub nie. Nie ma również API do włączania, konfigurowania lub wykrywania, czy przeglądarka obsługuje i używa ramek ping / pong. Odbyła się dyskusja na temat stworzenia w tym celu interfejsu API ping / pong w Javascript . Istnieje możliwość, że pingi będą konfigurowalne / wykrywalne w przyszłości, ale jest mało prawdopodobne, aby Javascript mógł bezpośrednio wysyłać i odbierać ramki ping / pong.

Jeśli jednak kontrolujesz zarówno kod klienta, jak i serwera, możesz łatwo dodać obsługę ping / pong na wyższym poziomie. Będziesz potrzebował jakiegoś nagłówka / metadanych typu wiadomości w swojej wiadomości, jeśli jeszcze ich nie masz, ale to całkiem proste. O ile nie planujesz wysyłania pingów setki razy na sekundę lub nie masz tysięcy jednoczesnych klientów, koszty ogólne będą minimalne, aby zrobić to samodzielnie.

kanaka
źródło
1
@bigmugcup Link nie działa
pan Jo
19

Ping ma być wysyłany tylko z serwera do klienta, a przeglądarka powinna odpowiedzieć jak najszybciej za pomocą Pong OpCode, automatycznie. Więc nie musisz się tym martwić na wyższym poziomie.

Chociaż nie wszystkie przeglądarki obsługują standard, tak jak przypuszczają, mogą mieć pewne różnice w implementacji takiego mechanizmu, a może nawet oznaczać, że nie ma funkcji odpowiedzi Pong. Ale osobiście używam Ping / Pong i nigdy nie widziałem klienta, który nie implementuje tego typu OpCode i automatycznej odpowiedzi na implementację niskiego poziomu po stronie klienta.

moka
źródło
73
Gdzie przeczytałeś, że ping jest tylko z serwera do klienta? Dokument RFC mówi: „Punkt końcowy MOŻE wysłać ramkę Ping w dowolnym momencie po ustanowieniu połączenia i przed jego zamknięciem”.
xryl669
7
Jeśli chcesz, aby klient automatycznie wykrywał stan rozłączenia (gdy nie otrzymano żadnych pakietów RST / FIN, ale sieć została rozłączona), musisz również poprosić klienta o zainicjowanie pakietów ping.
pschwamb
13
TCP nie powiadamia o rozłączeniach, gdy pakiety RST / FIN nie zostały odebrane. Protokół TCP wykrywa zerwane połączenia tylko wtedy, gdy nadawca próbuje wysłać je przy rozłączonym połączeniu. Pingi są używane jako bicie serca w wielu aplikacjach i jest to ważne użycie. Utracone połączenie pozostanie martwe na zawsze, dopóki klient nie spróbuje wysłać. Dlatego w przypadku korzystania z usług WebSockets w przeglądarce do wykrywania rozłączenia klienta po stronie klienta należy użyć niestandardowego komunikatu ping (lub pulsu). Serwer może próbować wysłać polecenie ping i wykryć rozłączenie klienta, ale klient nie jest informowany. Pingi klientów również są w porządku.
DDS
15
W RFC 6455, The WebSocket Protocol, wyraźnie stwierdza się: „UWAGA: Ramka Ping może służyć jako utrzymywanie aktywności lub jako środek do sprawdzenia, czy zdalny punkt końcowy nadal odpowiada”.
DDS
4
Możliwe, że polecenie ping tylko na serwerze było zalecaną praktyką, gdy programy klienckie były często odświeżane. Ale obecnie wiele witryn internetowych jest zaprojektowanych jako SPA. W tym środowisku może być bardzo istotne, aby aplikacja kliencka regularnie pingowała serwer, aby upewnić się, że połączenie nie zostało utracone.
Noel Abrahams