2014-07-07 19 views
6

Rozglądałem się, aby wdrożyć niezawodny mechanizm odzyskiwania połączenia z WebSocket.Niezawodne wykrywanie stanu połączenia z siecią WebSocket

Po pewnym dochodzeniu odkryłem, że jednym ze sposobów jest wysyłanie sygnałów dźwiękowych do serwera (ping/pong) i sprawdzanie, czy otrzymam cały pong w ograniczonym czasie.

Zatem albo jeśli połączenie jest rzeczywiście w dół lub jest to bardzo powolny byłoby uznać odłączony jeśli pong limity czasu oczekiwania, a kod powinien zadzwonić WebSocket.close().

Pod koniec tego dnia zadaję to pytanie, aby zweryfikować przepływ pracy połączenia i ponownego połączenia za pomocą WebSockets i sprawdzić, czy czegoś brakuje.

To znaczy, moje pytanie brzmi: jest to właściwy i niezawodny przepływ pracy w celu wdrożenia mechanizmu ponownego łączenia WebSockets?

Odpowiedz

3

Protokół websocket określa specjalne ramki kontrolne dla ping i ponga, ale nie są one dostępne za pośrednictwem JavaScript API. Ale jeśli serwer wyśle ​​te ramki, przeglądarka odpowie.

Jeśli jednak połączenie zostanie nagle przerwane i stanie się half-open connection, mimo że serwer je wykryje, przeglądarka nie będzie. Sądzę więc, że wysyłanie własnych pingów na poziomie aplikacji nie jest złym pomysłem.

Odpowiadając na pytanie tak, to jest dobry pomysł, ponieważ jeśli połączenie zostanie w połowie otwarte, klient nie będzie otrzymywać aktualizacji, ponieważ sądzi, że jest podłączony. W websocket, klient musi zainicjować połączenie, więc nawet jeśli przeglądarka zrealizuje rozłączenie, nic nie może zrobić, aby połączyć się ponownie.

+0

Tak, masz rację (i dzięki za twoje "potwierdzenie"). BTW, istnieje mobilny przypadek użycia, gdzie wysyłanie pingów co 20 sekund (na przykład) ma wpływ na baterię. W moim przypadku, ponieważ nie używam WebSockets do wprowadzania danych przez użytkownika, ale dla wypychania serwera, chcę zauważyć użytkownika, że ​​połączenie ma problemy tak szybko, jak to możliwe. –

+1

Możesz wykryć opóźnienie sieci wysyłając polecenie ping ze znacznikiem czasu i wykonując echo serwera w pongu. Ale jeśli komunikacja zostanie przerwana (tj. Bez właściwego zakończenia TCP), trudno powiedzieć, że jest ona odcięta, dopóki nie spróbujesz wysłać czegoś: http://blog.stephencleary.com/2009/05/detection-of-half-open -dropped.html – vtortola

+0

@vtrola Jest to bardzo ciekawy artykuł (dlaczego nie dodasz go do swojej odpowiedzi jako referencji?). BTW, nie jestem pewien, czy rozumiem pierwsze rozwiązanie * Prawidłowych metod wykrywania zerwanych połączeń *. Rozumiem, że chodzi o wysłanie pustej wiadomości (komunikat "keepalive") i czekanie na określony czas, a jeśli nie otrzymasz odpowiedzi w pewnym momencie, połączenie zostanie uznane za utracone. –

Powiązane problemy