Представьте, что вы — компания с большим количеством сотрудников, работающих на «удалёнке» и все они ненавидят местных поставщиков интернет-услуг. Видеоконференции для таких случаев — вообще худшее из зол: люди не слышат друг друга, либо они внезапно начинают звучать, как Дарт Вейдер, а иногда просто исчезают из разговора.
Или вы небольшой интернет-провайдер, и ваши клиенты говорят, что ненавидят вас. Но не стоит унывать. Теперь это решаемая проблема, благодаря группе людей, которые вычислили её, устранили, а затем доказали своё решение даже на домашних маршрутизаторах.
Давайте теперь разберём проблему более глубоко. Когда вы говорите со своим поставщиком интернет-связи о проблемах со скоростью/надёжностью соединения, то они обычно отвечают, что проблема решается переходом на более дорогой тариф с большей пропускной способностью. Но когда вы сами измеряете, сколько заявленной существующей пропускной способности вы используете в самое загруженное время дня, то оказывается, что этот показатель составляет всего от 30% до 50%. И вы не можете понять, почему же тогда возникают проблемы с интернет-соединением?
Устройства в домашней сети подключаются к маршрутизатору (роутеру), который подключается к поставщику интернет-услуг для доступа в Интернет. Сам поставщик может подключиться к более крупному поставщику, прежде чем подключиться к оптоволоконной «магистрали» в дата-центре. А сам дата-центр может быть ещё подключён к узлу, обслуживающему целую страну или регион. Чтобы получить доступ к нужному веб-серверу — например, чтобы прочитать новостную статью на сайте — данные будут передаваться с устройства в домашней сети через множество других устройств. В итоге сигнал должен достичь своего пункта назначения — нужного сервера в каком-нибудь далёком дата-центре.
Несколько устройств в домашней сети могут отправлять и получать данные, пока наше устройство обращается к нужному серверу, на котором располагается сайт. Эти независимые потоки трафика данных пересекаются на домашнем широкополосном маршрутизаторе. Маршрутизатор имеет несколько входных портов, которые позволяют нескольким устройствам отправлять данные за пределы домашней сети в Интернет. Пакеты данных передаются с выходных портов маршрутизатора. Обычно домашний широкополосный маршрутизатор имеет один выходной порт, который подключается в линию к интернет-провайдеру.
Протокол управления передачей (TCP) и протокол транспортного уровня (UDP — User Datagram Protocol), часть набора протоколов Интернета (IP), которые и отправляют данные через Интернет. TCP обеспечивает доставку пакетов данных, но работает медленнее, чем UDP, который, казалось бы, является «наилучшим решением». Получатель подтверждает получение пакетов данных по протоколу TCP. Если отправитель не получает подтверждения для пакета отправленной информации, то отправитель повторно передаёт его. Наше устройство, получающее доступ к веб-серверу, не «знает» о возможностях соединения. При повторном запросе он понижает скорость (использует TCP slow, чтобы избежать перегрузки), медленно увеличивая количество отправляемых пакетов до тех пор, пока не будет обнаружена максимальная ёмкость. Этот протокол использует управление потоком, чтобы гарантировать, что веб-сервер (получатель) не будет перегружен пакетами данных нашего устройства (отправителя). Это достигается за счёт того, что получатель «объявляет» размер своего «окна приёма корреспонденции». Хотя отправитель отправляет свои пакеты данных с такой же скоростью, как объявлено в окне приёма, перегрузка все равно может возникнуть в любом узле/устройстве на пути.
Пакеты данных, проходящие по пути, могут быть поставлены в очередь или отброшены из-за перегрузки, которая возникает, когда нагрузка (количество пакетов данных) превышает пропускную способность линии. Механизм управления перегрузкой TCP направлен на предотвращение перегрузки путём использования подтверждений для определения скорости отправки. Если отправитель обнаруживает небольшую или нулевую перегрузку на пути между ним и получателем, он увеличивает скорость передачи. Если отправитель отправляет слишком много пакетов, это приводит к тому, что получатель отбрасывает их. Отброшенная информация не подтверждается. Аналогично, если подтверждение не происходит достаточно быстро, предполагается, что пакет был отброшен. Отброшенные пакеты данных сигнализируют отправителю, что скорость передачи выше пропускной способности, и скорость передачи снижается. Таким образом, управление перегрузкой TCP является «управлением с обратной связью».
В каком-то смысле поставщики правы: пропускная способность действительно сводится к «диаметру трубы» между вами и вашими сотрудниками или клиентами. Если она слишком мала, ваши данные, соединения и многое другое действительно будут тормозиться.
Однако, если вы не заполняете «трубу», и занимаете её сечение только на 50%, вам нужно посмотреть на программное обеспечение и выяснить, что мешает вашим пакетам прибывать в разумные сроки. Например, если измерить время отправки («ping») в центр города из домашнего офиса в пригороде, то чтобы «добраться» до центра и обратно, может потребоваться несколько секунд. Но это не будет нормальным временем соединения (столько сигнал, при идеальных условиях, должен идти из Москвы до Нью-Йорка, путь примерно в 18000 км). Это чисто программная проблема, и она называется высокой задержкой.
Если представить себе Интернет как ряд труб, то пропускная способность показывает, сколько данных вы можете отправить по каждой трубе. Если вы купите узкую, маленькую трубу, у вас определённо будет плохая производительность уже на выходе: вы не сможете пропустить через неё всю свою информацию за разумное время. Если вы купите трубу достаточно большую, чтобы вместить ваши данные, все в порядке. Все данные будут течь прямо по трубе, вместо того, чтобы сидеть и ждать, пока предыдущие байты протиснутся. Однако покупка трубы большего диаметра, чем вам нужно, не поможет. Ваши данные все равно будут поступать в неё без задержки, но только до самого узкого места на выбранном пути. То есть, они не будут двигаться быстрее, так как программно будет ограничиваться скорость отправки.
Почему медленно?
Задержка (это то, как быстро или медленно появляются данные) – есть совокупное объединение всех задержек передачи, обработки и ожидания в очереди. Она также зависит от размера очереди. Таким образом, чрезмерно большой буфер может привести к критическому раздуванию буферизации на всех участках. Маршрутизаторы используют буферы для временного хранения пакетов данных, ожидающих передачи, когда возникает перегрузка. Наименьшая возможная задержка равна длине «трубы», поделённой на скорость света. Рассмотрим исходящий звонок в мессенджере, состоящий из набора коротких фрагментов изображения и звука, хорошо сжатых, с промежутком времени между каждым. Каждый небольшой кусочек аудио и видео проходит через трубу сам по себе, оставляя место для других кусочков. Чтобы звонок не удался, вам нужно одновременно заполнить её достаточным количеством другого трафика. Если вы работаете из дома, это может означать, что кто-то из вашей семьи транслирует себе на устройство фильм или загружает фотографии с мобильного телефона. Если у вас плохое программное обеспечение маршрутизатора, то более мелкие фрагменты будут стоять в очереди (буферизация), пока фотографии для родственника не закончатся загружаться. Поскольку фрагменты видеосигнала задерживаются, другие участники звонка могут видеть, как вы зависаете или заикаетесь. Иногда вы будете звучать так, будто кричите со дна колодца. В действительно плохом варианте вы просто выпадете из конференции.
В домашних условиях проблема заключается в программном обеспечении домашнего маршрутизатора, который подключается к более широкому Интернету. Ошибка называется «bufferbloat». В этой ошибке отправитель буферизует фотографии и, как только сеть становится доступной, отправляет их все. При этом он не может отправлять фрагменты видеоконференции, поэтому он задерживает их и отправляет только после завершения отправки фотографий.
Это может быть приемлемо для компьютеров, но людям, обсуждающим что-то важное в формате видеоконференции, нужно, чтобы их слова шли в правильном порядке, без задержек и прерываний. Фотографии должны делить сеть справедливо с видеоконференцией и не воровать всю полосу пропускания.
В лучшем из возможных миров каждый маршрутизатор в Интернете будет работать на том ПО, которое имеет последние изменения для минимизации задержки. К сожалению, не все устройства могут автоматически обновляться так часто, как хотелось бы, и производители маршрутизаторов часто отстают на годы в переписывании своих фирменных операционных систем для включения новейших исправлений. Некоторые даже вернулись к PIE, гораздо более старому предшественнику CAKE.
Домашние модемы/роутеры/Wi-Fi-боксы в этом отношении ещё хуже. Их приобретают, используют и выбрасывают, когда они «умирают». Они почти никогда не обновляются. В результате в Интернете много старого, глючного программного обеспечения и много пакетов, стоящих в очередях и бездельничающих в ожидании возможности быть отправленными.
Но энтузиасты попытались взять проблему под контроль, добавив более умный маршрутизатор между своим домом и маршрутизатором своего интернет-провайдера. Умный маршрутизатор поддерживает передачу данных с такой скоростью, с какой позволяет полоса пропускания, отправляя сигнал «У меня конфликт», который старое программное обеспечение может распознать, когда какое-либо из устройств в вашей домашней сети отправляет слишком много информации.
Но добавление такого умного устройства в домашнюю сеть не масштабируется. Если вы средняя компания, то вы не можете позволить себе купить новый умный маршрутизатор для каждого из ваших сотрудников. Если вы интернет-провайдер, вы не можете просто безболезненно вырвать дорогие основные маршрутизаторы, чтобы установить новые.
Решение заключается в том, чтобы адаптировать методы, используемые в домашних сетях. Если ваши клиенты вас ненавидят, поставьте устройство с современным программным обеспечением на пути к вашим клиентам, ниже по потоку от ваших маршрутизаторов. Такое устройство предназначено только для работы с раздуванием буферизации. Этот подход также снижает цену для клиента, поскольку старый односокетный Xeon с восемью ядрами может обрабатывать до 10 Гбит/с трафика.
Название программного обеспечения для устройства ISP — LibreQoS, где QoS означает качество обслуживания. Оно было разработано той же командой, которая разработала программное обеспечение fq_codel и CAKE, которое решало проблему на домашнем маршрутизаторе.
Они рассмотрели проблему с точки зрения Интернета, решив помочь провайдерам и другим компаниям, которые не могли просто купить больше пропускной способности, а вместо этого были вынуждены эффективнее использовать то, что у них было.
Их решение заключается в применении полного комплекса мер по исправлению проблем с IP-сетями, который включает:
• Справедливую очерёдность передачи пакетов;
• Формирование стабильной полосы пропускания для всех задач;
• Активное управление очередью;
• Обработку сигналов управления трафиком (diffserv — Differential Services);
• Фильтрацию подтверждённых данных;
• Осведомлённость о топологии сети;
• Параллельную обработку;
• Обход накладных расходов моста Linux (Bypassing Linux bridge overheads);
• Встроенное измерение времени прохождения сигнала туда и обратно для демонстрации улучшения;
Все эти исправления работают вместе, чтобы найти самую высокую скорость, которая не перегружает самую медленную часть системы. Это означает, что пакеты не должны сидеть в очереди у провайдера, ожидая возможности быть отправленными.
Первыми отрабатывают исправления по установке справедливой очереди и контролю задержек из fq_codel. Затем CAKE добавляет Active Queue Management (AQM), который выполняет тот же тип зондирования полосы пропускания, что и обычный TCP, но добавляет внутриполосную сигнализацию перегрузки для её обнаружения, как можно скорее. Скорость передачи медленно увеличивается до тех пор, пока не будет получен сигнал перегрузки, затем уменьшается. После уменьшения она снова начинает увеличиваться, непрерывно находясь в мониторинге самой высокой доступной скорости, которую она может использовать, не вызывая накопления очереди. Используемый алгоритм является расширением fq_codel.
Компонент справедливости предотвращает нехватку ресурсов у отдельных потоков из-за других потоков, как в нашем примере с фотографиями, или из-за того, что хосты запускают большое количество потоков, пытаясь украсть как можно большую часть пропускной способности сети.
Diffserv — это механизм маркировки пакетов как интерактивных (с высоким приоритетом), так и пакетных (с низким приоритетом), что позволяет распознавать пакетную передачу файлов и не допускать задержек видеоконференций. С этим связан алгоритм обнаружения и правильной расстановки приоритетов для разреженных потоков, который не будет испытывать нехватку ресурсов, но не является его частью.
Фильтрация подтверждений полностью удаляет пакеты, которые просто несут подтверждение получения данных, при условии, что в том же направлении поступает достаточно непустых пакетов, чтобы взять на себя эту задачу.
Далее мы переходим к самому LibreQoS, который добавляет компоненты, специфичные для работы на стороне ISP сети. Первый компонент — это дерево топологии сети, поскольку у ISP будет много возможных маршрутов к своим клиентам, каждый со своей максимальной скоростью, которая должна быть обнаружена и обработана его собственным экземпляром кода формирования потока.
Поверх этого находится иерархический классификатор токенов, который сортирует входящие пакеты по правильному ядру ЦП и правилу механизма ограничения трафика до заданного значения («shaper»). Стандартный шейпер Linux, который использует CAKE, является однопоточным и имеет тенденцию исчерпывать ёмкость выше 6 Гбит/с. А шейпер LibreQoS ограничен только количеством и скоростью ядер центрального процессора и Ethernet.
LibreQoS в версии 1.4 представил новый быстрый мост Ethernet, основанный на eXpress Data Path (XDP) и расширенном фильтре пакетов Berkeley (eBPF), чтобы избежать узких мест в потоке загрузки ядра процессора (ksoftirqd). Кроме производительности было добавлено ПО для измерения и управления улучшением: новый датчик времени кругового обхода с низкими издержками, систему захвата пакетов и набор программ реального времени для измерения и визуализации производительности большого количества маршрутов и клиентов.
Это уже достаточно зрелая технология, работающая на стандартном оборудовании, которое установлено у многих провайдеров. В качестве конкретного примера, интернет-провайдеру, предоставляющему своим клиентам тарифные планы на 1 Гбит/с и имеющему общую пропускную способность до 10 Гбит/с, понадобится сервер с восьмиядерным процессором, таким, как Intel Xeon E-2388G, 16 ГБ оперативной памяти и с двухпортовой картой Ethernet 10G — самая обычная одноюнитовая машина из 2021 года. То есть, теперь провайдер может исправить ситуацию с жалобой на производительность, он может решить проблему, проактивно внедрив LibreQoS. Те, кто уже решил эти проблемы, могут наблюдать, как исправление происходит в реальном времени. Его также можно измерить из домашнего офиса, если вы один из тех счастливых людей, у которых есть дома достаточно продвинутый маршрутизатор. Пропускная способность, вероятно, уже не будет являться проблемой ужасно медленной скорости Интернета, если у них будет подключено соединение в диапазоне от 50 до 100 Мбит/с, так как все прежние проблемы заключались в задержке – то есть, во времени, которое требуется маршрутизаторам провайдера для обработки их трафика