Сетевые вызовы macOS для гик-аудитории: раскрыта проблема с tcp_now при длинных аптаймах. Источник: AI
Большинство пользователей Mac привыкли, что их компьютеры могут неделями находиться в спящем режиме, не требуя полного отключения или перезагрузки. Однако оказалось, что операционная система имеет достаточно жесткий, хотя и непреднамеренный «срок годности» одного сеанса работы. Если ваш аптайм приближается к отметке в 50 дней, готовьтесь к тому, что сетевые возможности системы превратятся в тыкву.
Математическая ловушка 32 бит
Проблему обнаружили специалисты компании Photon, занимающиеся мониторингом сервисов iMessage. При анализе парка компьютеров они заметили странное поведение: машины, работавшие без перерыва длительное время, внезапно теряли способность принимать новые сетевые соединения. Подробное исследование Photon показало, что корень зла кроется во внутреннем счетчике. tcp_now.
Этот счетчик отвечает за отслеживание времени с момента загрузки системы для стека TCP. Проблема в том, что он представлен как 32-битное беззнаковое целое число. Максимальное значение такого числа составляет 4294967295. Поскольку tcp_now считает время в миллисекундах, он неизбежно переполняется и обнуляется ровно через 49 дней, 17 часов, 2 минуты и 47 секунд. В этот момент логика обработки пакетов ломается, поскольку система ожидает последовательного роста значений, а получает «ноль».
Симптомы сетевого паралича
Самое интересное в этой ситуации то, как именно обнаруживается сбой. Компьютер не отключается и не вызывает критических ошибок. Он продолжает отвечать на запросы pingпоскольку протокол ICMP работает на более низком уровне и не зависит от этого счетчика. Более того, уже установленные соединения могут продолжать стабильно работать. Однако ни один новый запрос через TCP/IP не будет обработан.
Для наружного наблюдателя система смотрится живой, но практически она изолирована от мира. Для обычного владельца MacBook, закрывающего крышку ноутбука несколько раз в день, это вряд ли станет катастрофой. Однако для серверных решений на базе macOS или систем мониторинга, где аптайм измеряется месяцами, это критический недостаток. В настоящее время единственным способом решения проблемы является превентивная перезагрузка до наступления роковой отметки.
Ожидание патча
На момент обнаружения бага официальных комментариев на ресурсах Apple не появлялось, однако технически исправить это несложно. Переход на 64-битный счетчик или корректная обработка переполнения – стандартные практики в индустрии. Удивляет лишь то, что такой фундаментальный просчет в сетевом стеке оставался незамеченным столько лет. Возможно, инженеры компании просто не верили, что кто-то не будет перезагружать компьютер больше полутора месяцев.
Если ваш рабочий компьютер внезапно устал от сети, возможно, стоит присмотреться к компактным решениям. К примеру, Minisforum Elite M1 Lite предлагает неплохую производительность для тех, кому нужен процессор Meteor Lake за адекватные деньги.
