W jaki sposób WhatsApp może odbierać wiadomości, gdy nie są używane?

23

Jestem ciekawy, jak WhatsApp może odbierać wiadomości, gdy nie są używane.

Rozumiem, że WhatsApp działa przy użyciu połączenia internetowego, a nie sieci komórkowej. Wyobraź sobie, że nie dotknąłem telefonu od kilku godzin. W tym momencie znajomy wysyła mi wiadomość na WhatsApp. Rozumiem to natychmiast. Czy to oznacza, że ​​WhatsApp utrzymuje połączenie z Internetem przez cały czas? Czy to oznacza, że ​​WhatsApp działa jak serwer, otwierając porty w telefonie? A może długo działające żądanie HTTP?

Ram Rachum
źródło
Patrz także whatsapp.com/faq/en/s60/20910578
Pacerier
Zobacz także highscalability.com/blog/2014/2/26/…
Ivan Chau

Odpowiedzi:

18

Na początku myślałem, że jest to najprawdopodobniej przypadek przesyłania wiadomości z chmury na urządzenie z Androidem , ale tak nie może być: WhatsApp nie deklaruje niezbędnych uprawnień i działa w Eclair (Android 2.1), podczas gdy przesyłanie z chmury do urządzenia ( i jego wymiana, Google Cloud Messaging) wymaga przynajmniej Froyo (Android 2.2).

Jednak najprawdopodobniej jest to rodzaj usługi powiadomień wypychanych . Nie można dokładnie określić, w jaki sposób jest realizowany bez dostępu do kodu źródłowego WhatsApp.

Jednak część tego, że jest w stanie odbierać wiadomości, gdy nie są używane, jest stosunkowo łatwa do wyjaśnienia. Aplikacja prawie na pewno ma usługę działającą w tle, aby okresowo logować się na serwerze (lub odbierać wypychanie serwera lub cokolwiek robi). Po otrzymaniu wiadomości usługa wyświetla powiadomienie.

Jeśli chodzi o pytanie, w jaki sposób serwer może wykonać wypychanie, oto możliwość (ponownie nie mogę zweryfikować bez kodu źródłowego):

  1. WhatsApp uruchamia się i otwiera dwa gniazda: jedno do nasłuchiwania, a drugie do wysyłania wiadomości do serwera.
  2. WhatsApps zaczyna nasłuchiwać na pierwszym gnieździe.
  3. WhatsApp wysyła wiadomość zawierającą Twój numer telefonu i port gniazda nasłuchującego do serwera i czeka na potwierdzenie.
  4. Serwer zapisuje w wiadomości numery telefonu i portu oraz adres IP, z którego wiadomość pochodzi.
  5. Serwer wysyła potwierdzenie do aplikacji.
  6. Aplikacja odbiera potwierdzenie i zamyka gniazdo wiadomości.
  7. Wiadomość z twoim numerem telefonu jako miejscem docelowym trafia na serwer.
  8. Serwer używa adresu IP i numeru portu skojarzonego z twoim numerem telefonu i wykorzystuje te informacje do przekazania wiadomości do telefonu.

Aby to zadziałało, aplikacja musiałaby monitorować stan połączenia sieciowego i resetować gniazdo nasłuchiwania / w razie potrzeby ponownie wysyłać komunikat rejestracyjny (na przykład, jeśli zmieni się adres IP).

Trebor Rude
źródło
2
Czy Whatsapp zależy od aplikacji playstore? Cytowanie z linku z Wikipedii: Wymaga urządzeń z Androidem 2.2 lub nowszym, które mają również zainstalowaną aplikację Market. Być może nie jest dokładnie tak, ale z pewnością opiera się na tych samych zasadach. Możesz jednak dodać fragment drugiego akapitu artykułu, aby twoja odpowiedź była bardziej wartościowa (i otrzymywała więcej pochwał;)
Izzy
Masz całkowitą rację, Izzy, powinienem był dodać więcej szczegółów. Było to jednak trudne, kiedy siedziałem w Subway, pisząc na moim SGS3. Zaktualizowałem odpowiedź teraz. :-)
Trebor Rude
3
Nat nie zezwoli na krok 8, nawet jeśli telefon komórkowy jest w stałym IP, co nigdy nie będzie miało miejsca. możliwe sposoby to albo Xmpp, albo długie odpytywanie http
1
Ma wymagane pozwolenie. Jest on wymieniony jako „odbieraj dane z Internetu” w Sklepie Play. Zobacz android.stackexchange.com/a/61794
nyuszika7h
2
Niestety przychodzące połączenia TCP są prawie niemożliwe na urządzeniach mobilnych. Przytłaczająca większość z nich nie ma publicznych adresów IP, a nawet jeśli tak (np. Dla operatorów obsługujących IPv6), połączenia przychodzące są zwykle filtrowane. Większość dzisiejszych aplikacji albo korzysta z usług push Google, albo zrzuca własnego trwałego połączenia klienta z gniazdem serwera (przede wszystkim Facebook). Z mojego doświadczenia wynika, że ​​WhatsApp stosuje podejście hybrydowe: jeśli GCM jest dostępny, trwałe gniazdo jest zamykane po kilku minutach bezczynności.
lxgr
8

Jestem pewien, że WhatsApp NIE otwiera żadnych portów nasłuchujących. większość dostawców usług internetowych blokuje przychodzące żądania, które nie działałyby.

WhatsApp ma usługę. Zasadniczo oznacza to, że technicznie nigdy nie rezygnujesz z WhatsApp. Tak więc sposób odbierania wiadomości podczas „nieużywania” WhatsApp jest dokładnie taki sam, jak sposób odbierania ich podczas uruchamiania.

Klient, w tym przypadku WhatsApp, łączy się z serwerem. Klient utrzymuje to połączenie. Gdy serwer ma coś nowego do powiedzenia, wysyła go do klienta za pośrednictwem tego połączenia, i to wszystko.

Twoje pierwsze przypuszczenie jest prawidłowe.

WhatsApp nie ma prawdziwego mechanizmu wylogowania, zobacz to .

WhatsApp nie ma mechanizmu wylogowania. Aplikacja została zaprojektowana w taki sposób, aby zawsze była połączona, dzięki czemu możesz szybko odbierać wiadomości, nawet jeśli nie aktywnie korzystasz z telefonu. Jest to podobne do działania SMS-ów i umożliwia niemal natychmiastowe dostarczanie wiadomości WhatsApp.

Bezmyślny152
źródło
2
Twój link jest do Nokii - nie mogłem znaleźć podobnego pytania dla Androida na ich stronie. Czy na pewno to samo dotyczy Androida? To pytanie z ich najczęściej zadawanych pytań na temat Androida wskazuje, że wykorzystuje architekturę PUSH (w sekcji „Czy wiadomości wciąż trwają zbyt długo, aby dotrzeć do twojego telefonu?”) - a nie stale podłączony serwer / klient.
Dylan Yaga,
2
@DylanYaga jest poprawna. Zobacz np. Ostatni akapit tej odpowiedzi i odpowiedź Trebors tutaj .
Izzy
To wydaje się najbardziej logiczne. Wiele razy te usługi nazywane są usługami push, ale nie wyobrażam sobie, aby klient otworzył port i faktycznie działał jako serwer lokalny. To z pewnością spowodowałoby problemy z bezpieczeństwem.
SPRBRN
1

Ich FAQ sugeruje używają GCM. Sprawdź odpowiedź na pytanie „Czy wiadomości wciąż docierają do telefonu?”

czarny
źródło
Masz rację, że FAQ to sugeruje, ale jak zauważa Trebor Rude, aplikacja nie ma niezbędnego pozwolenia, więc nie mogą korzystać z samej GCM.
Dan Hulme
2
Ma wymagane pozwolenie. Jest on wymieniony jako „odbieraj dane z Internetu” w Sklepie Play. Zobacz android.stackexchange.com/a/61794
nyuszika7h
2
Z tego, co widziałem, używają GCM, jeśli jest dostępny. Jeśli z jakiegoś powodu jest niedostępny (np. Na urządzeniu bez usług Play lub jeśli jest filtrowane przez sieć), gniazdo jest utrzymywane przez czas nieokreślony.
lxgr 23.01.16
0

Whatsapp, podobnie jak inne aplikacje, działa jako usługa. (Zawsze jesteś podłączony) Wiadomości wysyłane do Ciebie są przechowywane na serwerze WhatsApp do 30 dni, w tym czasie WhatsApp powinien być aktywny, aby odbierać i potwierdzać otrzymanie wiadomości. Poszczególne konta są przechowywane z numerem telefonu użytkownika @ whatsapp.net

Dickson
źródło
1
30 dni . Link do źródła tego faktu
beeshyams,
0

Myślę, że powinno tak być:

Gdy WhatsApp był nowy, używałby rozwiązania opartego na PNS, ten PNS po prostu budziłby urządzenie, a gdy się obudzi, może utworzyć połączenie gniazdowe z serwerem WhatsApp.

Po tym, jak WhatsApp jest teraz popularny, większość jego urządzeń nie będzie zabijana jako aplikacja natywna i natywna. W moim samsung s8 nie mogę odinstalować WhatsApp, tryb oszczędzania energii nie może go zabić

Nasir
źródło