Micro transport protocol что это

Обновлено: 01.05.2024

Микротранспортный протокол или μTP (иногда также uTP ) - это открытый вариант протокола однорангового обмена файлами BitTorrent на основе UDP, предназначенный для смягчения низкой задержки и других проблем контроля перегрузки, обнаруживаемых в обычном BitTorrent через TCP , при обеспечении надежного, упорядоченного Доставка.

Он был разработан для автоматического замедления [1] скорости, с которой пакеты данных передаются между пользователями торрентов с одноранговым обменом файлами, когда это мешает другим приложениям. Например, протокол должен автоматически разрешать совместное использование линии ADSL между приложением BitTorrent и веб-браузером.

Развитие

, была адаптирована для использования в качестве протокола фонового транспорта компанией Plicto, которая была основана Станиславом Шалуновым, а позже была приобретена BitTorrent, Inc. в 2006 году, и получила дальнейшее развитие в рамках своего нового владельца. Он был впервые введен в ветвях мкТоррент 8.x beta, а - в альфа-корпусах мкТоррент 9.

Реализация, использованная в мкTorrent, позже была разделена на библиотеку "libutp" и опубликована под лицензией .

Первым клиентом свободного программного обеспечения, реализовавшим pciTP, был KTorrent 4.0. libtorrent ents мкTP с версии 0.16.0 и используется в qBittorrent с версии 8.0. Tixati Vuze (ранее A reus) Скорость передачи мкТР с версии 2.30.

H Torrent/uTP — о протоколе и самодельных DPI в черновиках Recovery Mode

Также провайдерам намного сложнее блокировать передачу данных через μTP благодаря отсутствию строгих, формализованных отличий UDP пакетов обычного трафика (формируемого, к примеру, сетевыми играми) от трафика, формируемого протоколом μTP, в отличие от TCP пакетов, по содержанию полей которых можно делать вывод об их принадлежности к p2p-трафику.
Жизнь с uTP

Другим побочным эффектом явилось то, что uTorrent запрашивал больше трафика чем позволял тарифный план провайдера, и от этого страдали даже те провайдеры у которых шейпер был настроен правильно: на хомячка из интернета прилетало ощутимо больше его тарифного плана и этот излишек дропался шейпером. Провайдеры несли финансовые потери от такого DDoS хомяка на самого себя.
Авторы uTorrent позже всё таки научились правильно подстраиваться под канал, но их эксперименты стоили нервов и денег.

Ещё одним неприятным моментом в экспериментах с uTP на начальных этапах было то, что он генерировал большую пакетную нагрузку, отправляя множество мелких UDP пакетов. Позднее авторы научились заполнять пакеты с данными целиком.
Повышение пакетрейта губительно сказывается на WiFi и прочих радиолинках.

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

Протокол uTP
Версия 0

Начиная с uTorrent 1.8

Версия 1

Начиная с uTorrent 2.0

Типы пакетов


flags из версии 0 превратился в type в версии 1, типы пакетов перечислены выше.
Сначала отправляется SYN на него приходит ответ STATE или RESET.
Завершается соединение на FIN или RESET.
DATA и STATE используются при передаче данных.

Остальные поля меня интересовали мало, хотя для ext опций валидацию написал.

Шифрование

Если кто то ещё читает и не уснул то мог заметить что шифрования нет.
Его действительно нет!
Не потому что описание не полное а потому что оно реализовано несколькими уровнями выше и uTP никак не касается.
uTP заголовки никак не шифруются.

Заход 1: uTPControl

Из спортивного интереса я решил попробовать написать нечто что сможет аккуратно выключать uTP у юзеров чей трафик проходит через роутер с моей программой.
В начале я пробовал слать RESET с виндовой машины, перебирая connid, но это явно не работало, не совпадали адреса отправителя пакета и seq_nr, ack_nr. Это был первый неудачный опыт.

Минусов у этого решения было два:
1. Ложные срабатывания: иногда пакеты от некоторых онлайн игр были прямо как uTP и им улетал ответ, видимо у игр от этого срывало крышу и юзеры жаловались.

2. Низкая производительность: все пакеты из ядра копировались в юзерспейс и там в один поток обрабатывались.
В один поток на CoreDuo Е5300 под FreeBSD 7.3 выдавало до 100 тысяч пакетов RESET в секунду.
Один поток можно было обойти запустив несколько экземпляров и как то раскидав через ipfw пакеты между ними.

В виду этих фатальных недостатков интерес со стороны сообщества пропал и я её забросил.

Был человек который превратил это в netgraph ноду, но ложные срабатывания это не вылечило.

Заход 2: ng_utp

В итоге получилась netgraph нода, которую можно подключать к L2 хукам типа ng_ether или L3 хукам, например ng_ipfw. В первом случае можно вообще сделать прозрачный эзернет мост из двух сетевух (не обязательно физических). Ещё можно просто поставить тазик и зеркалировать на него весь траф, но я сейчас не уверен в работоспособности такой схемы.

Результатов замеров производительности я не сохранил.
Однако нода без проблем параллелится по ядрам, может выполнятся как контексте ISR так и потоками netgraph, взаимные блокировки потоков сведены к минимуму.

В случае L2: мультикаст и броадкаст пакеты пролетают сразу насквозь, тэгированный трафик обрабатывается как обычный. QinQ не делал, добавить не сложно.
Обрабатываются только IPv4 пакеты UDP, не адресованные и не отправленные с 127/8, не являющиеся броадкастом или мультикастом, и ещё немного проверок что это не мусор а то что нужно, включая опциональную проверку контрольной суммы IP и UDP.

Теперь у нас есть куда писать данные по конкретному uTP соединению.
Пишем: время последнего обновления, время последней отправки запроса и получения ответа, считаем запросы и ответы, запоминаем какие типы пакетов встречались.
seq_nr и ack_nr можно было бы тоже запоминать и анализировать но и без них достаточно точно получается определять.
Старые записи удаляются автоматически.

Действовать имеет смысл только для DATA и STATE пакетов.

Сейчас это всё ещё может быть актуальным для различных беспроводных сетей и офисных сетей, остальные уже обновились и расширились.

Сигнатуры
Версия 0
SYN

'udp[17] = 2 and udp[18] = 4 and udp[21:2] = 0 and udp[23] = 0 and udp[24] = 8 and udp[25:4] = 0 and udp[29:4] = 0'

41 = udp hdr len (8) + upd pkt data len

upd header included:
'(udp[4:2] = 41 and udp[25:2] = 0x0204 and udp[29:4] = 0x00000008 and udp[33:4] = 0 and udp[37:4] = 0)'

RESET

'udp[17] = 0 and udp[18] = 3'

31 = udp hdr len (8) + upd pkt data len

upd header included:
'(udp[4:2] = 31 and udp[25:2] = 0x0003)'

Версия 1
SYN

'udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x40 and udp[1] = 2 and udp[18:2] = 0 and udp[20] = 0 and udp[21] = 8 and udp[22:4] = 0 and udp[26:4] = 0'

(udp[0] & 0x0f = 1 and udp[0] & 0xf0 = 0x40) => udp[0] = 0x41

38 = udp hdr len (8) + upd pkt data len

upd header included:
'(udp[4:2] = 38 and udp[8:2] = 0x4102 and udp[26:4] = 0x00000008 and udp[30:4] = 0 and udp[34:4] = 0)'

RESET

upd header included:
'(udp[4:2] = 28 and udp[8:2] = 0x3100)'

Обнаружение фильтрации

Проще всего, используя описание протокола, реализовать простенький клиент, который будет устанавливать соединение и пытаться отправлять данные.
По сути нужно симулировать установление соединения, и дальше пытаться слать DATA и STATE пакеты в ответ с ext типа ACK.
Дальше один клиент запускается в интернете, другой у себя и смотрим теряются ли пакеты в 100% случаев или может RESET приходят.
Сходным образом при использовании yota некоторые пакеты из l2tp на завершающем этапе согласования пропадают в 100% случаев. Так было ещё в сентябре.

Заключение

2. Производители различных DPI уже давно добавили сигнатуры для uTP, вряд ли им это было трудно сделать.

3. В порядке слухов: для линукса вроде бы тоже есть ядерная версия для работы с uTP протоколом на базе ipp2p а может уже отдельно. Но в паблик её не выкладывали. С середины 2012 года.

4. Для IPv6 код не писал, на всякий случай ;)

Протокол микротранспорта

Micro Transport Protocol или microTP (иногда также uTP) является открытым UDP-вариантом протокола обмена файлами BitTorrent peer-to-peer, предназначенным для борьбы с плохой задержкой и другими проблемами контроля состояния, обнаруженными в обычном BitTorrent по TCP, обеспечивая при этом надежную, упорядоченную доставку.

Он был разработан для автоматического замедления скорости, с которой пакеты данных передаются между пользователями торрентов совместного доступа к файлам, когда он мешает другим приложениям. Например, протокол должен автоматически разрешать совместное использование линии ADSL между приложением BitTorrent и веб-браузером.

Протоколы Интернета вещей (какая-то небольшая часть из них)

В системе Интернета вещей протоколами взаимодействия принято считать протоколы, расположенные в верхней части стека протоколов для системы IoT. На остальных уровнях используются технологии, которые уже зарекомендовали себя в сети Интернет и используются под разные задачи следующим образом:

  • на нижнем уровне (уровне доступа к сети) располагаются технологии: пакетной передачи данных Ethernet, связи для коммуникации в беспроводной локальной сетевой зоне, беспроводных персональных сетях, беспроводных сетях масштаба города и другие;
  • на сетевом уровне технологии адресации: IPv4 и IPv6;
  • на транспортном уровне протоколы передачи данных: TCP и UDP.

Протоколы связи — это формальные стандарты и политики, состоящие из правил, процедур и форматов, которые определяют связь между двумя или более устройствами по сети.

Устройства в системе Интернета вещей должны согласовывать различные аспекты для успешного обмена данными. Использование правильного протокола в соответствии с окружающей средой и используемыми устройствами имеет важное значение. Это может повысить безопасность системы IoT в целом.

Основные, широко используемые стандартизированные протоколы Интернета вещей:

Использование стандартизированных протоколов на IoT-платформах значительно ускоряют внедрение и разработку новых систем и приложений Интернета вещей за счет четко определенного описания работы и предъявляемых требований.

Constrained Application Protocol

CoAP – это ограниченный протокол уровня приложения, созданный рабочей группой The Internet Engineering Task Force (IETF) Constrained RESTful Environments (CoRE) в июне 2014 г. Стандарт протокола описан в документе RFC 7252 «The CoAP» .

Данный протокол основан на технологии «запрос-ответ». Такая реализация предусматривает наличие вызывающей стороны («Клиент» на рисунке), которая инициирует запросы к конкретной службе, размещённой на удалённом сервере («Сервер» на рисунке).

Протокол CoAP предназначен для взаимодействия устройств с ограниченными ресурсами и устройств с низким энергопотреблением, например датчиков малой мощности, выключателей, клапанов, которые управляются или контролируются удаленно через сеть Интернет.

Extensible Messaging and Presence Protocol

XMPP работает поверх транспортного протокола TCP с обеспечением защищенности передачи данных в сети за счет использования криптографических протоколов TLS/SSL.

Данный протокол не поддерживает технологию «quality of service» (QoS), что делает его непрактичным для межмашинного взаимодействия.

СОДЕРЖАНИЕ

μTP вышли из исследований в Интернет2 на QoS и высокой производительности объемного транспорта , был адаптирован для использования в качестве протокола транспортного фона по Plicto, который был основан Станислав Шалунов [2] , а затем он был приобретен BitTorrent, Inc. в 2006 году, и получил дальнейшее развитие в рамках своего нового владельца. [3] Впервые он был представлен в бета-версиях μTorrent 1.8.x и опубликован в альфа-версиях μTorrent 1.9. [4] [5]

Реализация μTP, используемая в μTorrent, позже была разделена на библиотеку libutp и опубликована под лицензией MIT . [6] [7]

Первым бесплатным программным клиентом, реализующим μTP, был KTorrent 4.0. [8] [9] libtorrent реализует μTP начиная с версии 0.16.0 [10] и используется в qBittorrent начиная с 2.8.0. [11] Tixati реализует μTP начиная с версии 1.72. [12] Vuze (ранее Azureus) реализует μTP, начиная с версии 4.6.0.0. [13] Передача реализует μTP, начиная с версии 2.30. [14]

Алгоритм управления перегрузкой, используемый μTP, известный как фоновый транспорт с низкой дополнительной задержкой ( LEDBAT ), направлен на уменьшение задержки, вызываемой приложениями, использующими протокол, при максимальном увеличении пропускной способности, когда задержка не является чрезмерной. [15] [16] Кроме того, информация от контроллера перегрузки μTP может использоваться для выбора скорости передачи TCP-соединений. [17]

Контроль состояния мкТП

Algorithm управления зависимостью, используемый мкТП, известный как LEDBAT (Low Extra Delay Background Transport, LEDBAT), предназначен для уменьшения задержки, вызванной приложениями, использующими протокол, при максимизации ширины полосы пропускания, когда задержка не является избыточной.

LEDBAT описан в RFC 6817. По состоянию на 2009 год детали реализации мкТР отличались от деталей текущего проекта Интернета.

pciTP также добавляет поддержку NAT traveral, используя перфорацию UDP между двумя одноранговыми узлами порта, где третий одноранговый узел без распределения действует как сервер STUN.

Читайте также: