Я работал только с клиентскими (в частности, мобильными) приложениями, использующими Android, где все сети обрабатываются на уровне HTTP с использованием компонентов, предоставляемых инфраструктурой, таких как HttpUrlConnection.
Но системы push-сообщений, такие как Websockets / XMPP и т. Д., Поддерживают постоянное соединение с сервером. Даже GCM от Google, встроенный в устройства с поддержкой Google Play, поддерживает постоянное соединение с серверами.
Мой вопрос, как это работает без разряда батареи? Если мы выполняем непрерывные HTTP-запросы последовательно, это приводит к значительному расходу батареи. Как эти постоянные соединения поддерживаются, не сталкиваясь с той же проблемой?
networking
sockets
Виная С Шеной
источник
источник
Ответы:
Открытое TCP-соединение является логическим состоянием. Это не означает, что эти данные всегда отправляются туда и обратно. После первоначального трехстороннего рукопожатия вы вошли в «подключенное» состояние. Вы находитесь в этом состоянии до тех пор, пока не произойдет 3-стороннее разъединение или сбой поддержки активности.
В течение времени жизни соединения могут быть установлены ресурсы из базовой «физической» среды для передачи данных для этого соединения. В случае проводного соединения, это вопрос передачи кадров Ethernet вокруг. В случае беспроводного соединения 3G / 4G это делается путем установления соединений с протоколами более низкого уровня по мере необходимости.
Таким образом, для жизни соединения не существует физического физического соединения для передачи данных. Вместо этого он бездействует, ожидая, что любой узел в соединении TCP должен будет отправить данные.
Другая проблема заключается в том, что TCP основан на подтверждении . Протоколы TCP могут довольно эффективно информировать друг друга о том, что было определенно получено. В случае сбоя TCP выполнит повторную передачу. Это прекрасно работает для довольно надежных физических каналов, но имеет тенденцию разваливаться на очень шумных / неработающих каналах, таких как ваши беспроводные соединения. Как вы можете себе представить, в этих средах очень часто бывают подтверждения / повторные передачи.
Поэтому, как правило, базовый беспроводной протокол делает все возможное, чтобы уменьшить необходимость повторных передач TCP. Например, в беспроводной уровень встроено множество проверок ошибок. Узлы в беспроводной области (базовая станция / телефон) также используют протокол на основе nak , чтобы сообщить другой стороне, когда они не получили что-то. Будучи нак на основе снижает накладные расходы при проверке на наличие ошибок (мы предполагаем , всё нормально , если другая сторона не утверждает , что ее нет). Это также помогает устранить ошибки доони поднимаются до уровня TCP - таким образом, избегая большого количества перебора TCP, пытаясь повторить передачу. Более того, это уменьшает объем любых повторных передач беспроводным узлам - телефон не должен снова запрашивать у сервера где-нибудь в Интернете пакет, только базовая станция по беспроводной линии связи.
источник