Android и SO_KEEPALIVE - будет ли спящее устройство отправлять сегменты keepalive?
Когда экран выключен, устройства Android обычно выключают процессор и переходят в состояние глубокой гибернации, если какое-либо приложение не удерживает блокировку. Система выходит из этого состояния только при прерываниях устройства (например, при поступлении данных из сети) или при срабатывании запланированного сигнала тревоги. Похоже, это сильно отличается от состояния сна CPU, когда периодические прерывания таймера регулярно пробуждают процессор.
Означает ли это, что все сетевые события / таймеры также приостановлены (например, повторные передачи TCP и сообщения поддержки активности), или они зарегистрированы в качестве аварийных сигналов ядром?
Мне интересно, может ли это помешать работе keepalive уровня сокета (через опцию сокета SO_KEEPALIVE). Будет ли эта опция работать на устройстве Android или она должна обрабатываться приложением более высокого уровня?
1 ответ
Похоже, что спящие устройства Android не проснутся для передачи сегментов активности активности TCP.
Я протестировал это с небольшим тестовым приложением на Nexus 5, которое устанавливает TCP_KEEPIDLE и TCP_KEEPINTVL на 5 секунд и открывает клиентский сокет. В трассировке пакета сегменты keepalive хорошо видны при включенном экране, но останавливаются при выключенном экране.