TCP ламинарный

Что такое ламинар?

Laminar — это новая платформа для контроля перегрузки TCP, которая отделяет планирование передачи, которое точно определяет время отправки данных, от чистого контроля перегрузки, который определяет общий объем данных, отправляемых во время каждого RTT.

Алгоритм планирования передачи по умолчанию представляет собой строгую реализацию принципа сохранения пакетов Ван Якобсона [Jacobson88]. Данные, поступающие к получателю, вызывают подтверждения, которые, в свою очередь, заставляют отправителя передать эквивалентное количество данных обратно в сеть. Первичная переменная состояния неявно зависит от количества данных и подтверждений ACK, циркулирующих в сети. Это состояние наблюдается с помощью улучшенного оценщика tcp_packets_in_flight() (он же Total_pipe). Total_pipe основан на «pipe», как описано в RFC 3517, но также включает в себя количество данных, сообщаемых текущим подтверждением ACK, и ожидающие передачи, которые прошли контроль перегрузки, но ожидают других событий, таких как TSO.

Новая переменная CCwin является основной переменной состояния управления перегрузкой. Алгоритмы контроля перегрузки настраивают CCwin для регулирования общего уровня перегрузки на пути. Хотя CCwin похож на cwnd, cwnd перегружен и используется несколькими алгоритмами (например, подавлением пакетов) с разными, а иногда и противоречивыми целями.

Каждый раз, когда total_pipe отличается от CCwin, алгоритм планирования передачи немного корректирует количество сегментов, отправляемых в ответ на каждый ACK. Медленный старт и пропорциональное снижение скорости [PRR] (замена уменьшения скорости вдвое) встроены в алгоритм планирования передачи.

Основное преимущество структуры Laminar заключается в том, что за счет разделения контроля перегрузки и планирования передачи на отдельные подсистемы каждая из них подчиняется гораздо более простым конструктивным ограничениям, что упрощает разработку множества новых алгоритмов, которые были невозможны при предыдущей организации кода.

Платформа Laminar меняет базовую философию проектирования управления перегрузкой TCP и потенциально имеет широкие последствия, выходящие за рамки самого патча. Этот патч предназначен для того, чтобы позволить людям экспериментировать с кодом, комментировать и помогать обнаруживать любые необычные случаи, которые могли быть упущены из виду. Кроме того, патч является неполным в том смысле, что ряд алгоритмов все еще отсутствует, в частности: алгоритмы управления перегрузкой, отличные от CUBIC и Reno; проверка cwnd; показатели назначения; и т. д. Было бы здорово, если бы люди могли помочь в рефакторинге некоторых из этих других алгоритмов.

Структура Laminar и ее мотивация более подробно описаны в интернет-проекте Draft-mathis-tcpm-tcp-laminar .

Комментарии и предложения присылайте по адресу mattmathis@google.com .

Этот проект является частью усилий Google по повышению скорости работы Интернета за счет улучшения протоколов .

Замечания по реализации

Laminar в основном реализован в трёх функциях (tcp_input.c):

Tcp_cong_avoid() и tcp_mult_decr() выполняют контроль перегрузки AIMD, используя переменную состояния CCwin. За исключением отмены, эти две функции — единственные места, где CCwin изменяет данные. (Обе функции вызывают специальные обработчики модуля перегрузки).

Tcp_laminar_schedule() определяет, сколько данных отправлять в ответ на каждый ACK. Он реализует сохранение пакетов Ван Якобсона, слегка корректируемое вверх или вниз, чтобы tcp_packets_in_flight() сходился с CCwin.

В оценщик tcp_packets_in_flight() внесены важные изменения, которые делают его инвариантным для большинства событий протокола. Остановки приложений, корректировки в tcp_laminar_schedule() и фактические потери пакетов изменяют tcp_packets_in_flight(), как и должно быть. Обработка ACK, TSO и большинство других событий этого не делают. Обратите внимание, что при возникновении потерь фактическое количество пакетов в передаче немедленно изменяется, но не отражается в оценщике tcp_packets_in_flight() до тех пор, пока механизм повторной передачи не отметит их как потерянные и не увеличит Lost_out.

Получить патч

Этот патч направлен против net-next Дэйва Миллера и полностью применим к 3.5-rc2.
Примечание. Модули управления перегрузкой, кроме Reno и CUBIC, не обновлялись и не компилируются. Если в вашей конфигурации предусмотрены другие модули управления перегрузкой, такие как Vegas, Scalable, Highspeed и т. д., их необходимо сначала отключить.