Введение

Протокол передачи данных на основе UDP (UDT) — это высокопроизводительный протокол передачи данных, разработанный для передачи больших объемов данных по высокоскоростным магистральным сетям. Такие условия, как правило, неблагоприятны для более распространенного протокола TCP. Первые версии были разработаны и протестированы в сетях очень высокой скорости (1 Гбит/с, 10 Гбит/с и т.д.), однако в последних версиях протокола добавлена поддержка обычного Интернета. Например, протокол теперь поддерживает установку соединения типа rendezvous, что является полезной функцией для обхода NAT-брандмауэров при использовании UDP. UDT имеет реализацию с открытым исходным кодом, доступную на SourceForge. Это одно из наиболее популярных решений для обеспечения высокоскоростной передачи данных и используется во многих исследовательских и коммерческих проектах.

Предыстория

UDT был разработан Юнхоном Гу во время его обучения в аспирантуре в Национальном центре по добыче данных (NCDM) Университета Иллинойса в Чикаго в лаборатории доктора Роберта Гроссмана. Доктор Гу продолжает поддерживать и совершенствовать протокол после окончания учебы. Проект UDT начался в 2001 году, когда недорогие оптические сети стали популярными и вызвали повышенное внимание к проблемам эффективности TCP в высокоскоростных глобальных сетях. Первая версия UDT, также известная как SABUL (Simple Available Bandwidth Utility Library), была разработана для поддержки передачи больших объемов данных при перемещении научных данных по частным сетям. SABUL использовал UDP для передачи данных и отдельное TCP-соединение для управления. В октябре 2003 года NCDM достиг скорости передачи 6,8 гигабит в секунду из Чикаго (США) в Амстердам (Нидерланды). В ходе 30-минутного теста было передано около 1,4 терабайта данных. Позже SABUL был переименован в UDT, начиная с версии 2.0, выпущенной в 2004 году. UDT2 отказался от TCP-соединения управления, использовавшегося в SABUL, и стал использовать UDP как для данных, так и для управляющей информации. UDT2 также представил новый алгоритм управления перегрузкой, который позволил протоколу работать "честно и корректно" совместно с потоками UDT и TCP. UDT3 (2006) расширил область применения протокола до общедоступного Интернета. Управление перегрузкой было настроено для поддержки относительно низкой пропускной способности. UDT3 также значительно снизил потребление системных ресурсов (CPU и памяти). Кроме того, UDT3 позволяет пользователям легко определять и устанавливать собственные алгоритмы управления перегрузкой. UDT4 (2007) представил несколько новых функций для лучшей поддержки высокой степени параллелизма и обхода межсетевых экранов. UDT4 позволял нескольким UDT-соединениям привязываться к одному UDP-порту, а также поддерживал настройку соединения типа rendezvous для упрощения пробивания UDP-портов. В настоящее время ведется планирование пятой версии протокола. Возможные функции включают поддержку нескольких независимых сессий по одному соединению. Более того, поскольку отсутствие функции безопасности в UDT было проблемой при его первоначальной реализации в коммерческой среде, Бернардо (2011) разработал архитектуру безопасности для UDT в рамках своей диссертационной работы. Однако эта архитектура дорабатывается для поддержки UDT в различных сетевых средах (например, оптических сетях).

Архитектура протокола

UDT построен на основе протокола пользовательских дейтаграмм (UDP), добавляя механизмы управления перегрузкой и обеспечения надежности. UDT – это протокол прикладного уровня, ориентированный на установление соединения, двунаправленный, поддерживающий как надежную потоковую передачу данных, так и частично надежную передачу сообщений.

Признание

UDT использует периодические подтверждения (ACK) для подтверждения доставки пакетов, а отрицательные подтверждения (NACK, отчеты о потерях) – для сообщения о потере пакетов. Периодические ACK помогают снизить объем управляющего трафика в обратном направлении при высокой скорости передачи данных, поскольку в таких ситуациях количество ACK пропорционально времени, а не числу пакетов данных.

AIMD с уменьшающимся увеличением

UDT использует алгоритм управления перегрузкой типа AIMD (аддитивное увеличение, мультипликативное уменьшение). Параметр увеличения обратно пропорционален доступной пропускной способности (оценивается с помощью метода пар пакетов), таким образом, UDT может быстро исследовать высокую пропускную способность и замедляется для повышения стабильности при приближении к максимальной пропускной способности. Коэффициент уменьшения – случайное число в диапазоне от 1/8 до 1/2. Это помогает снизить негативное влияние синхронизации потерь. В UDT передача пакетов ограничена как управлением скоростью, так и управлением окном. Скорость отправки обновляется алгоритмом AIMD, описанным выше. Окно перегрузки, как вторичный механизм управления, устанавливается в соответствии со скоростью поступления данных на стороне получателя.

Конфигурируемый контроль загруженности

Реализация UDT предоставляет набор переменных, связанных с управлением перегрузкой, в классе C++ и позволяет пользователям определять набор функций обратного вызова для изменения этих переменных. Таким образом, пользователи могут переопределить алгоритм управления, переопределив некоторые или все эти функции обратного вызова. Большинство алгоритмов управления TCP можно реализовать, используя эту возможность, менее чем в 100 строках кода.

Настройка соединения на встречу

Помимо традиционной схемы соединения "клиент/сервер" (также известной как "вызывающий/принимающий", где принимающий ожидает соединения и потенциально принимает несколько входящих вызовов), UDT также поддерживает новый режим установки соединения "рандеву". В этом режиме обе стороны прослушивают свой порт и одновременно устанавливают соединение с противоположной стороной, то есть подключаются друг к другу. Следовательно, обе стороны должны использовать один и тот же порт для соединения, и обе стороны равноправны (в отличие от ролей принимающего и вызывающего при традиционной схеме). "Рандеву" широко используется для обхода межсетевых экранов, когда оба участника находятся за ними.

Используйте сценарии

UDT широко используется в высокопроизводительных вычислениях для обеспечения высокоскоростной передачи данных по оптическим сетям. Например, GridFTP, популярный инструмент передачи данных в сетях вычислительных ресурсов, поддерживает UDT в качестве протокола передачи данных. В общедоступном Интернете UDT применяется во многих коммерческих продуктах для быстрой передачи файлов по глобальным сетям. Поскольку UDT полностью основан на UDP, он также используется во многих ситуациях, где TCP уступает UDP. К таким сценариям относятся приложения типа "один к одному", видео- и аудиосвязь, а также многие другие.

Производные произведения

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

Награды

Команда UDT трижды становилась победителем престижного конкурса Bandwidth Challenge на ежегодной конференции ACM/IEEE Supercomputing Conference, ведущей в мире конференции, посвященной высокопроизводительным вычислениям, сетям, хранению данных и анализу. На SC06 (Тампа, Флорида) команда осуществила передачу астрономического набора данных со скоростью 8 Гбит/с с диска на диск из Чикаго, Иллинойс, в Тампу, Флорида, используя UDT. На SC08 (Остин, Техас) команда продемонстрировала применение UDT в сложной высокоскоростной передаче данных, включающей различные распределенные приложения на системе из 120 узлов, расположенной в четырех центрах обработки данных в Балтиморе, Чикаго (2) и Сан-Диего. На SC09 (Портленд, Орегон) совместная команда из NCDM, Naval Research Lab и iCAIR представила широкомасштабные облачные приложения для работы с большими объемами данных, работающие на основе UDT.