Как WhatsApp может получать сообщения, когда они не используются?


23

Мне интересно, как WhatsApp может получать сообщения, когда они не используются.

Я имею в виду, я понимаю, что WhatsApp работает с использованием подключения к Интернету, а не сети мобильного телефона. Представьте, что я не касался своего телефона в течение нескольких часов. В этот момент друг отправляет мне сообщение на WhatsApp. Я понял это немедленно. Означает ли это, что WhatsApp постоянно поддерживает подключение к Интернету? Значит ли это, что WhatsApp действует как сервер, открывая порты на телефоне? Или, может быть, длительный HTTP-запрос?


Также смотрите whatsapp.com/faq/en/s60/20910578
Pacerier

Ответы:


18

Сначала я подумал, что это, скорее всего, экземпляр Android-облака для обмена сообщениями между устройствами , но этого не может быть: WhatsApp не объявляет необходимые разрешения и работает в Eclair (Android 2.1), в то время как обмен сообщениями между облаками и устройствами ( и его замена Google Cloud Messaging) требует как минимум Froyo (Android 2.2).

Однако, скорее всего, это своего рода сервис push-уведомлений . Невозможно точно сказать, как это реализовано без доступа к исходному коду WhatsApp.

Однако относительно того, что он может получать сообщения, когда он не используется, относительно легко объяснить. В приложении почти наверняка есть служба, которая работает в фоновом режиме, чтобы периодически регистрироваться на сервере (или получать запрос сервера, или что-то еще). Когда вы получаете сообщение, сервис выскакивает уведомление.

Что касается вопроса о том, как сервер может сделать push, вот возможность (опять же, я не могу проверить без исходного кода):

  1. WhatsApp запускает и открывает два сокета: один для прослушивания и один для отправки сообщения на сервер.
  2. WhatsApps начинает прослушивать первый сокет.
  3. WhatsApp отправляет сообщение, содержащее ваш номер телефона и порт прослушивающего сокета, на сервер и ожидает подтверждения.
  4. Сервер записывает телефон и номера портов в сообщении и IP-адрес, с которого пришло сообщение.
  5. Сервер отправляет подтверждение приложению.
  6. Приложение получает подтверждение и закрывает сокет сообщения.
  7. Сообщение с вашим номером телефона в качестве пункта назначения поступает на сервер.
  8. Сервер использует IP-адрес и номер порта, которые он связал с вашим номером телефона, и использует эту информацию для отправки сообщения на ваш телефон.

Чтобы это работало, приложению необходимо будет отслеживать состояние сетевого подключения и сбрасывать сокет прослушивания / при необходимости повторно отправлять регистрационное сообщение (например, при изменении IP-адреса).


2
Зависит ли Whatsapp от приложения playstore? Цитирование по ссылке в Википедии: Требуются устройства под управлением Android 2.2 или выше, на которых также установлено приложение Market. Так что это может быть не совсем так, но, безусловно, основано на тех же принципах. Возможно, вы захотите включить некоторые выдержки из второго абзаца статьи, чтобы сделать ваш ответ более ценным (и получить больше голосов;)
Иззи

Вы совершенно правы, @ Иззи, мне следовало добавить больше деталей. Это было трудно сделать, пока я сидел в Subway и писал на своем SGS3. Я обновил ответ сейчас. :-)
Требор Руд

3
Nat не допустит шаг 8, даже если мобильный находится на статическом IP, что никогда не будет иметь место. Возможные варианты: Xmpp или длинный опрос http

1
У него есть необходимое разрешение. Он указан как «получать данные из Интернета» в магазине Play. См android.stackexchange.com/a/61794
nyuszika7h

2
К сожалению, входящие TCP-соединения практически невозможны на мобильных устройствах. Подавляющее большинство из них не имеют общедоступных IP-адресов, и даже если они есть (например, для операторов с поддержкой IPv6), входящие соединения обычно фильтруются. Большинство современных приложений либо используют push-сервисы Google, либо используют свой постоянный клиент для подключения к сокету сервера (особенно Facebook). По моему опыту, WhatsApp использует гибридный подход: если GCM доступен, постоянный сокет закрывается после простоя в течение нескольких минут.
lxgr

8

Я, конечно, уверен, что WhatsApp НЕ открывает порты прослушивания. большинство интернет-провайдеров блокируют входящие запросы, которые не будут работать.

У WhatsApp есть сервис. По сути это означает, что технически вы никогда не выходите из WhatsApp. Таким образом, способ получения сообщений, когда вы «не запускаете» WhatsApp, точно такой же, как вы получаете их, когда запускаете его.

Клиент, в данном случае WhatsApp, подключается к серверу. Клиент поддерживает это соединение. Когда серверу нужно сказать что-то новое, он отправляет это клиенту через это соединение, и это все.

Ваше первое предположение верно.

WhatsApp не имеет реального механизма выхода из системы, смотрите это .

WhatsApp не имеет механизма выхода из системы. Приложение предназначено для постоянного подключения, чтобы вы могли быстро получать свои сообщения, даже если вы не используете свой телефон активно. Это похоже на работу SMS и позволяет доставлять сообщения WhatsApp практически мгновенно.


2
Ваша ссылка для Nokia - я не смог найти аналогичный вопрос для Android на их сайте. Вы уверены, что то же самое относится к Android? Этот вопрос из их часто задаваемых вопросов по Android указывает на то, что он использует архитектуру PUSH (в разделе «Сообщения по-прежнему слишком долго доходят до вашего телефона?»), А не постоянно подключенный сервер / клиент.
Дилан Яга

2
@DylanYaga правильно. Смотрите, например, последний абзац этого ответа, и Треборы ответят здесь .
Иззи

Это кажется наиболее логичным. Много раз эти сервисы называются push-сервисами, но я не могу представить, что клиент откроет порт и фактически будет действовать как локальный сервер. Это, безусловно, вызовет проблемы с безопасностью.
SPRBRN

1

Их FAQ предлагают, чтобы они использовали GCM. Проверьте ответ на «Сообщения по-прежнему слишком долго доходят до вашего телефона?»


Вы правы в том, что часто задаваемые вопросы говорят об этом, но, как отмечает Требор Руд, у приложения нет необходимых разрешений, поэтому они не могут использовать сам GCM.
Дэн Халм

2
У него есть необходимое разрешение. Он указан как «получать данные из Интернета» в магазине Play. См android.stackexchange.com/a/61794
nyuszika7h

2
Из того, что я видел, они используют GCM, если он доступен. Если он недоступен по какой-либо причине (например, на устройстве без служб Play или если он отфильтрован сетью), сокет сохраняется бесконечно долго.
lxgr

0

WhatsApp, как и другие приложения, запускается как служба. (Вы всегда подключены) Отправленные вам сообщения хранятся на сервере WhatsApp до 30 дней, в течение которых ваш WhatsApp должен быть активным, чтобы получать и подтверждать получение сообщения. Индивидуальные учетные записи хранятся с номером телефона пользователя @ whatsapp.net


1
30 дней . Пожалуйста, свяжите источник для этого факта
beeshyams

0

Я думаю, что это должно быть так:

Когда WhatsApp был нов, он использовал бы решение на основе PNS, этот PNS просто разбудил бы устройство и, как только он проснулся, мог бы создать сокет-соединение с сервером WhatsApp.

После того, как WhatsApp теперь популярен, большинство устройств не будут уничтожены как родное приложение, так и собственное приложение. В моем Samsung S8 я не могу удалить WhatsApp, режим энергосбережения не может убить его

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.