В команде Cloudflare нашли и исправили баг в контроллере перегрузки CUBIC, который парализовал трафик в их реализации протокола QUIC. Контроллер управляет окном перегрузки (cwnd), определяя объем данных, отправленных без подтверждения. В тестовой среде, имитирующей работу на localhost, после остановки случайных потерь пакетов CUBIC переставал восстанавливать скорость передачи и застревал на минимальном уровне. За два секунды работы алгоритм совершил почти тысячу ложных переходов между состояниями восстановления и избегания перегрузки каждые 14 миллисекунд. Это совпадало со временем往返 (RTT) соединения: при полном заполнении окна двумя пакетами каждый ответ (ACK) приводил к тому, что счетчик незавершенных передач падал до нуля. Система ошибочно считала это паузой, хотя передача лишь временно прекратилась из-за ограничений канала. Из-за этого контроллер сдвигал время начала восстановления вперед, не давая окну расти. Ранее похожая проблема была в Linux ядре, где при простое приложения время эпохи сбрасывалось. Решение было предложено Эриком Дюмазэ и другими, который сдвигал время эпохи вперед, сохраняя форму кривой. Когда этот патч перенесли в 2020 году в библиотеку quiche, разработчики упустили важный нюанс: в QUIC нет ядрового обратного вызова, поэтому проверку делают внутри функции обработки пакета. Старый код проверял разницу между текущим моментом и последним отправленным пакетом, что при малом окне создавало задержку, равную RTT. Новый исправленный код добавил запись времени обработки последнего ACK. Теперь idle_start вычисляется как максимум между временем последнего ACK и последнего отправки. Это устраняет ложное измерение паузы на целой RTT и позволяет окну начать расти. Исправление вернуло тестам 100% пропускную способность. Ранее проблема была видима только при тяжелых потерях, а при высокой скорости не проявлялась. Решение заняло несколько строк кода, но потребовало тщательного анализа логики алгоритма. Команда также продолжает экспериментировать с модельным контроллером BBRv3, который теперь доступен для части их развертываний. Код изменений внесен в репозиторий quiche, а инженерные вакансии ждут отклик специалистов, интересующихся сетевыми протоколами.
Патч Cloudflare исправил баг контроллера CUBIC в QUIC
12.05.2026 23:46 · hackernews