49 дней, 17 часов и 2 минуты. Ровно столько ваш Mac может проработать без сетевых сбоев
NewsMakerНеприятный сюрприз ожидает тех, кто привык неделями не закрывать крышку ноутбука.
В macOS обнаружили сбой, который долго не выдаёт себя, а затем почти мгновенно ломает работу сети. Если не перезагружать Mac 49 дней, 17 часов, 2 минуты и 47 секунд, система может перестать открывать новые TCP-соединения. Снаружи проблема выглядит странно: пинг проходит, старые соединения ещё живут, а всё, что требует нового подключения, постепенно замирает.
О находке рассказала команда Photon, которая использует парк компьютеров Mac для мониторинга сервиса iMessage. В конце марта этого года несколько машин после указанного выше времени непрерывной работы перестали устанавливать новые TCP-соединения. Перезагрузка вернула связь, но одновременно стало ясно, что сбой связан не с отдельным приложением, а с самой системой.
Специалисты проверили гипотезу на двух компьютерах, которые приближались к критической отметке. До наступления порога закрытые TCP-сессии в состоянии TIME_WAIT исчезали примерно через 30 секунд, как и положено в macOS. После переполнения внутреннего счётчика ситуация резко менялась: записи TIME_WAIT переставали очищаться и только накапливались. Через несколько часов число таких соединений доходило до тысяч, свободные временные порты заканчивались, а новые подключения застревали на этапе SYN_SENT.
Причину авторы отчёта связали с 32-битным переполнением в ядре XNU. Внутренний TCP-счётчик ведёт отсчёт в миллисекундах с момента загрузки системы. Когда значение достигает предела, происходит сброс к нулю, но проверка в коде не даёт таймеру продолжить отсчёт. В результате внутренние TCP-таймеры фактически останавливаются, а механизм очистки старых соединений перестаёт работать.
В macOS обнаружили сбой, который долго не выдаёт себя, а затем почти мгновенно ломает работу сети. Если не перезагружать Mac 49 дней, 17 часов, 2 минуты и 47 секунд, система может перестать открывать новые TCP-соединения. Снаружи проблема выглядит странно: пинг проходит, старые соединения ещё живут, а всё, что требует нового подключения, постепенно замирает.
О находке рассказала команда Photon, которая использует парк компьютеров Mac для мониторинга сервиса iMessage. В конце марта этого года несколько машин после указанного выше времени непрерывной работы перестали устанавливать новые TCP-соединения. Перезагрузка вернула связь, но одновременно стало ясно, что сбой связан не с отдельным приложением, а с самой системой.
Специалисты проверили гипотезу на двух компьютерах, которые приближались к критической отметке. До наступления порога закрытые TCP-сессии в состоянии TIME_WAIT исчезали примерно через 30 секунд, как и положено в macOS. После переполнения внутреннего счётчика ситуация резко менялась: записи TIME_WAIT переставали очищаться и только накапливались. Через несколько часов число таких соединений доходило до тысяч, свободные временные порты заканчивались, а новые подключения застревали на этапе SYN_SENT.
Причину авторы отчёта связали с 32-битным переполнением в ядре XNU. Внутренний TCP-счётчик ведёт отсчёт в миллисекундах с момента загрузки системы. Когда значение достигает предела, происходит сброс к нулю, но проверка в коде не даёт таймеру продолжить отсчёт. В результате внутренние TCP-таймеры фактически останавливаются, а механизм очистки старых соединений перестаёт работать.