Previous: 4.4.3.3 Новый протокол TCP
UP:
4.4.3 Протокол TCP Next: 4.4.3.5 Протокол TFRC |
Протокол DCCP (Datagram Congestion Control Protocol; RFC-4336, -4340) является транспортным протоколом, который использует двунаправленные уникастные соединения с управлением перегрузкой для ненадежной доставки дейтограмм. Протокол DCCP предназначен для приложений, которые реализуют поточную схему TCP, но имеют приоритет для своевременной доставки данных с сохранением порядка кадров или требуют надежности, или которым нужен механизм подавления перегрузки, отличный от TCP. До настоящего времени такие приложения использовали либо TCP, чья надежность и гарантия упорядочения доставки давалась за счет неопределенно большой задержки, или UDP и независимого механизма управления перегрузкой (или вообще с отсутствием подавления перегрузки). Протокол DCCP будет предоставлять стандартный способ управления перегрузкой и позволит использовать механизм ECN (Explicit Congestion Notification).
Протокол DCCP предназначен для приложений, которые не требуют параметров SCTP [Stream Control Transmission Protocol, RFC 2960], таких как упорядоченная доставка при нескольких потоках.
Протокол UDP исключает большие задержки, но приложения UDP, которые используют управление перегрузкой, вынуждены вносить задержки сами. Протокол DCCP имеет встроенную систему управления перегрузкой, включая поддержку ECN для ненадежных потоков дейтограмм, исключая непредсказуемые задержки, характерные для TCP. Протокол DCCP обеспечивает надежное согласование параметров при установлении соединения.
Одной из целей DCCP было максимальное облегчение для UDP приложений перехода на DCCP, когда он будет внедрен. Чтобы облегчить это, DCCP был спроектирован с минимальной избыточностью, как с точки зрения размера заголовка пакета, так и с позиции загрузки ЦПУ машин партнеров. В DCCP была включена минимальная функциональность, при сохранении возможности включения новых функций, таких как FEC (Forward Error Correction), псевдонадежность и множественные потоки, которые могут быть добавлены поверх DCCP, если потребуется.
Возможны разные механизмы управления перегрузкой для разных приложений. Например, игры реального времени могут требовать быстрого использования всей доступной полосы пропускания, в то время как потоковая среда может использовать компромисс между скоростью отклика и стабильной, менее импульсивной передачей. (Резкое изменение потока может вызвать неприемлемые сбои UI (User Interface), такие как слышимые паузы или щелчки). Протокол DCCP, таким образом, предлагает приложению выбор одного из нескольких механизмов управления перегрузкой. Одной из альтернатив является TCP-подобное управление перегрузкой, сокращение вдвое окна перегрузки в ответ на потерю пакета. Приложения, использующие механизм управления перегрузкой, будут быстро реагировать на изменения доступной полосы, но должны выдерживать резкое изменение окна перегрузки, что типично для TCP. Вторую альтернативу представляет механизм управления скоростью передачи, дружественный по отношению TCP (TFRC) [RFC 3448]. Это алгоритм управления перегрузкой, базирующийся на уравнении скорости передачи данных, минимизирует резкие изменения скорости передачи.
Протокол DCCP позволяет также ненадежному трафику без проблем использовать технику ECN. Ядро UDP API не может позволить приложениям считать UDP пакеты, адаптированными к ECN, так как API не может гарантировать, что приложение способно корректно детектировать или реагировать на перегрузку. Ядро DCCP API лишено такого недостатка, так как имеет встроенный механизм управления перегрузкой.
В DCCP было решено не использовать менеджер управления перегрузкой [RFC 3124], который допускает несколько одновременных потоков между отправителем и получателем. Менеджер перегрузки может быть использован только приложениями, которые имеют свою собственную обратную связь в случае потери пакетов между конечными точками соединения, но этого нет во многих приложениях, использующих UDP. Кроме того, сегодняшний вариант менеджера перегрузки, как правило, не поддерживает более одного механизма управления перегрузкой. DCCP должен быть способен использовать механизм управления перегрузкой там, где это требуется приложению.
Предполагается, что протокольные механизмы DCCP, будут адаптированы к любому приложению, требующему уникастных потоков с управлением перегрузки. Механизмы управления перегрузкой, встраиваемые в DCCP, описаны в отдельных ID профайлах управления [CCID 2 PROFILE, CCID 3 PROFILE], они могут, однако вызвать проблемы для некоторых приложений, включая широкополосное интерактивное видео. Эти приложения должны быть способны использовать DCCP, когда будут стандартизованы подходящие ID профайлы управления перегрузкой.
Протокол DCCP имеет следующие характеристики:
Ниже рассмотрены наиболее существенные отличия DCCP от TCP.
Каждое DCCP соединение реализуется между двумя партнерами, которые будут называться DCCP A и DCCP B. Данные могут передаваться в обоих направлениях. В рамках протокола рассматриваются субнаборы соединений, называемых полусоединениями (half-connection - HC). Смотри рис. 1. Эти полусоединения обеспечивают передачу информационных пакетов в одном направлении, плюс соответствующие подтверждения в противоположном направлении. В контексте одного полусоединения, HC-отправитель является партнером отправителем данных, в то время как HC-Receiver является партнером, посылающим подтверждения. Каждое полусоединение контролируется механизмом управления перегрузкой, специфицированным однобайтовым идентификатором, или CCID (Congestion Control ID). Партнеры согласуют режим обмена на фазе формирования соединения. CCID для полусоедиения описывает, как HC-отправитель ограничивает поток информационных пакетов; как он поддерживает необходимые значения параметров, такие как окна перегрузки; как HC-получатель уведомляет отправителя о перегрузке, посылая подтверждения; и как он поддерживает частоту подтверждений.
Рис. 1. Структура обменов в протоколе DCCP
Любое соединение DCCP предполагает формирование DCCP сокетов в пассивном состоянии прослушивания. Активной стороной считается клиент, а роль пассивной стороны выполняет сервер.
DCCP имеет встроенный механизм согласования параметров соединения, такой как активные CCID для обеих полусоединений (см. рис. 1). Опции Change, Prefer и Confirm служат для согласования параметров. Change посылается с целью изменения определенного параметра. Адресат может откликнуться, послав Prefer, где запросит партнера заменить значение параметра, или может изменить значение параметра и послать подтверждение Confirm. Надежность установления параметров обеспечивается повторной передачей, если это потребуется.
Протокол DCCP использует девять различных типов пакетов: DCCP-Request, DCCP-Response, DCCP-Data, DCCP-Ack, DCCP-DataAck, DCCP-CloseReq, DCCP-Close, DCCP-Reset, и DCCPMove. Длина пакета DCCP варьируется в пределах от 12 до 1020 байт. Алгоритм формирования и разрыва DCCP соединения подразумевает следующие обмены.
DCCP-Request
Посылается клиентом для инициализации соединения (первый шаг трехходовой процедуры).
DCCP-Response
Посылается сервером в ответ на запрос DCCP-Request (второй этап трехшаговой процедуры инициации соединения).
DCCP-Data
Используется для передачи прикладных данных.
DCCP-Ack
Используется для передачи только подтверждений.
DCCP-DataAck
Используется для передачи прикладных данных в сочетании с подтверждениями.
DCCP-CloseReq
Посылается сервером для предложения клиенту закрыть соединение.
DCCP-Close
Используется клиентом или сервером для закрытия соединения; для запуска процедуры сброса (DCCP-Reset).
DCCP-Reset
Используется для закрытия соединения, обычным или необычным образом.
DCCP-Sync, DCCP-SyncAck
Используется для ресинхронизации номеров пакетов после длительного периода потерь.
Процедура взаимодействия партнеров включает в себя следующие обмены:
Все DCCP пакеты имеют базовый заголовок с форматом, показанным на рис. 2:
Рис. 2. Базовый заголовок пакетов DCCP
Если X равно нулю, передаются только младшие (LSB) 24 бита порядкового номера, а базовый заголовок имеет длину 12 байт. Ниже поясняется назначение полей базового заголовка.
Порт отправителя и получателя (по 16 бит каждый)
Эти поля идентифицируют соединение, аналогично соответствующим полям TCP и UDP. Порт отправителя характеризует порт, через который послан данный пакет, а порт назначения характеризует процесс, которому должен быть этот пакет доставлен. Когда соединение формируется, клиент должен выбрать порт отправителя случайным образом, чтобы уменьшить вероятность атаки.
Прикладные интерфейсы DCCP должны воспринимать номера портов, также как это делается в случае TCP и UDP. Например, машины, которые различают привилегированные и непривилегированные порты для TCP и UDP должны делать то же самое и для DCCP.
Смещение данных (8 бит)
Смещение от начала заголовка пакета DCCP первого октета прикладных данных (выражается в 32-битных словах). Получатель должен игнорировать пакеты, где значение поля Data Offset (смещение данных) меньше минимального размера заголовка для данного типа, или больше размера самого пакета DCCP.
CCVal (4 бита)
Используется HC-отправителем CCID. Например, CCID отправителя A->B, который активен в DCCP A, может послать 4 бита данных с каждым пакетом получателю, записав их в поле CCVal. Отправитель должен установить CCVal равным нулю, если только HC-отправитель CCID не требует иного, а получатель должен игнорировать поле CCVal, если HC-получатель CCID не специфицирует обратного.
Checksum Coverage (CsCov – покрытие контрольным суммированием): 4 бита.
Поле CsCov определяет части пакета, которые покрываются полем контрольная сумма. Она всегда покрывает заголовок и опции DCCP, но некоторые приложения могут допускать некоторые исключения. Это может улучшить работу протокола в условиях каналов с высоким уровнем шума.
Контрольная сумма. (16 бит)
Интернет контрольная сумма заголовка пакета DCCP (включая опции), псевдозаголовок сетевого уровня и, в зависимости от CsCov, все, некоторые, или никакие поля данных приложений.
Зарезервировано (Res). (3 бита)
Отправитель должен записать в это поле все нули, а получатель должен это поле игнорировать.
Тип. (4 бита)
Поле тип специфицирует тип пакета. Определены следующие типы пакетов:
Таблица 1. Типы пакетов DCCP
Тип | Описание | |
0 | DCCP-Request (запрос) | |
1 | DCCP-Response (отклик) | |
2 | DCCP-Data (данные) | |
3 | DCCP-Ack (подтверждение) | |
4 | DCCP-DataAck (подтверждение данных) | |
5 | DCCP-CloseReq (запрос закрытия) | |
6 | DCCP-Close (закрытие) | |
7 | DCCP-Reset (сброс) | |
8 | DCCP-Sync (установление соединения) | |
9 | DCCP-SyncAck (Подтверждение соединения) | |
10-15 | Зарезервировано |
Адресаты должны игнорировать любые пакеты с зарезервированным типом.
Расширенные порядковые номера (X). 1 бит
Если Х=1, в заголовке используется 48-разрядные порядковые номера. Пакеты DCCP-Data, DCCP-DataAck и DCCP-Ack могут иметь значение X равное 0 или 1. Все пакеты DCCP-Request, DCCP-Response, DCCP-CloseReq, DCCP-Close, DCCP-Reset, DCCP-Sync и DCCP-SyncAck должны иметь Х=1; партнеры должны игнорировать любые такие пакеты с Х=0. При высокоскоростных соединениях следует использовать для всех пакетов Х=1.
Порядковый номер. 48 или 24 бита
На рис. 2А показан формат базового паета DCCP при Х=0.
Рис. 2A. Базовый заголовок пакетов DCCP при Х=0
Идентифицирует пакет в последовательности. Номер по порядку увеличивается на 1 после посылки каждого пакета, включая пакеты DCCP-Ack, которые не несут в себе прикладных данных.
Каждому механизму управления перегрузкой, поддерживаемому DCCP, присвоен идентификатор, или CCID: номер в диапазоне от 0 до 255. Во время установления соединения и опционно после этого, партнеры согласуют свои механизмы управления перегрузкой. ID управления перегрузкой имеет код 1. Величина CCID/A равна CCID, используемому для полусоедиения A →B. DCCP B посылает опцию "Change R(CCID, K)" чтобы DCCP A использовал для своих информационных пакетов CCID K.
CCID является характеристикой сервера, при согласовании CCID-опций может использоваться список из нескольких приемлемых CCID, записанных в убывающем порядке по приоритету. Например, опция "Change R(CCID, 2 3 4)" просит получателя использовать для своих пакетов CCID 2, хотя CCID 3 и 4 также являются приемлемыми. (Это соответствует байтам "35, 6, 1, 2, 3, 4": Change R опция <35>, длина опции <6>, ID код <1>, CCID (2, 3, 4)). Аналогично, "Confirm L(CCID, 1, 2 3 4)" говорит получателю, что отправитель использует для своих пакетов CCID 2, но что CCID 3 и 4 могут быть также приемлемыми. В настоящее время стандартизованы следующие значения CCID.
Таблица 2. Идентификаторы управления перегрузкой DCCP
CCID | Значение | |
0-1 | Зарезервировано | |
2 | TCP-подобное управление перегрузкой | |
3 | Управление перегрузкой TFRC | |
4-255 | Зарезервировано | |
Все определенные в настоящее время типы пакетов, за исключением DCCP-запрос и DCCP-Data, содержат в себе субзаголовок номера подтверждения в четырех или восьми байтах, следующих за базовым заголовком. Когда X=1, он имеет формат, показанный на рис. 3.
Рис. 3. Формат подзаголовка номера подтверждения
Клиент инициирует DCCP соединение, посылая пакет запроса. Эти пакеты могут содержать прикладные данные и должны иметь 48-битные порядковые номера (X=1).
Рис. 4.4. Формат пакета DCCP-запроса
Код сервиса: 32 бита
Описывает прикладной уровень сервиса, к которому желает подключиться клиентское приложение. Поле код сервиса предназначено для индикации прикладного протокола, используемого для соединения. Сервер откликается на корректный DCCP-запрос пакетом DCCP-отклика. Это является второй фазой трехходового диалога. Пакеты DCCP-отклика могут содержать прикладные данные, и должны использовать 48-битные порядковые номера (X=1).
Рис. 5. Формат пакета DCCP-отклика
Номер подтверждения имеет 48 бит
Содержит GSR (Greatest Sequence Number Received – наибольший полученный порядковый номер). Так как DCCP-отклик посылается только во время установления соединения, он всегда равен порядковому номеру полученного DCCP-запроса.
Код сервиса: 32 бита
Должен равняться коду сервиса, соответствующему DCCP-запросу.
Поле данных DCCP соединения пересылается в пакетах DCCP-Data и DCCP-DataAck, в то время как пакеты DCCP-Ack используются для подтверждений, когда не требуется передавать какой-либо информации. Пакеты DCCP-Ack не содержат данных, но имеют номера подтверждений.
Рис. 6. Формат пакета DCCP-Data
Пакеты DCCP-Ack и DCCP-DataAck часто содержат дополнительно опции подтверждения, такие как Ack вектор, которые требуются для используемого механизма управления перегрузкой.
Все пакеты DCCP могут содержать опции, которые располагаются в конце заголовка, их длина кратна 8 битам. Все опции всегда включаются в контрольное суммирование. Опция может начинаться с любого байта. В настоящее время определены следующие опции:
Таблица 3. Опции
Длина [байт] | Назначение | |
0 | 1 | Заполнитель |
2 | 1 | Медленный получатель |
32 | 3-4 | Игнорируется |
33 | Переменная | Изменение |
34 | Переменная | Предпочтение |
35 | Переменная | Подтверждение |
36 | Переменная | Инициализация Cookie |
37 | Переменная | Вектор Ack [в данный момент 0] |
38 | Переменная | Вектор Ack [в данный момент 1] |
39 | Переменная | Data Dropped |
40 | 6 | Временная метка |
41 | 6-10 | Отклик на временную метку |
42 | Переменная | Идентификация |
44 | Переменная | Вызов |
45 | 4 | Контрольная сумма поля данных |
46 | 4-6 | Время работы |
128-255 | Переменная | Специфические опции CCID |
Первый байт данных каждой опции Change, Prefer или Confirm является числовым параметром, определяющим тип согласуемого параметра. Остальные данные представляют собой одно или более значение параметра, и интерпретируется в соответствии с особенностями данного параметра (характеристики). В настоящее время определены следующие параметры:
Число | Назначение | Нач. длина | Обязатель-ность |
0 | Зарезервировано | - | - |
1 | Управление перегрузкой (CCID) | 2 | Y |
2 | Возможность коротких номеров | 1 | Y |
3 | Окно последовательности | 100 | Y |
4 | Невозможность ECN | 0 | N |
5 | Ack Ratio | 2 | N |
6 | Послать вектор Ack | 0 | N |
7 | Послать число NDP | 0 | N |
8 | Минимальное покрытие контрольной суммой | 0 | N |
9 | Проверка контрольной суммы данных | 0 | N |
10-127 | Зарезервировано | - | - |
128-255 | CCID-Specific Features (специфические характеристики) | - | - |
Управление перегрузкой требует, чтобы получатели передавали отправителям данные о потерях пакетов и метках ECN. Получатели DCCP должны сообщать обо всех замеченных перегрузках, в соответствии с профайлом CCID.
Ack Ratio предоставляет общий механизм, с помощью которого CCID, определяющий время подтверждения информационных пакетов, может выполнять упрощенное управление перегрузкой. CCID 2, TCP-подобное управление перегрузкой, использует Ack Ratio, чтобы ограничить частоту подтверждений. Некоторые CCID игнорируют Ack Ratio, выполняя управление перегрузкой для подтверждений каким-то другим способом.
HC-Получатель посылает опцию Slow Receiver (медленный получатель) своему отправителю, чтобы уведомить его о проблемах с обработкой его данных.
Опция Data Dropped (отброшенных данных) указывает, что некоторые пакеты, отмеченные как полученные, на самом деле были отброшены, прежде чем были переданы приложению. Механизм управления перегрузкой отправителя может реагировать на потерянные информационные пакеты.
Опция контрольной суммы поля данных содержит в себе 16 битное дополнение по модулю 1 суммы всех 16-битных слов, содержащихся в поле данных DCCP (информации, транспортируемой пакетами DCCP-Request, DCCP-Response, DCCP-Data, DCCP-DataAck или DCCP-Move). В сочетании с длиной контрольной суммы меньше 15, это позволяет различить случаи повреждения заголовка и поля данных пакета. Пакеты с поврежденным заголовком должны рассматриваться как отброшенные сетью, в то время как пакеты с поврежденным полем данных могут обрабатываться дифференцированно, например, реакция отправителя на повреждение может быть менее жесткой, чем на перегрузку.
Протокол DCCP осуществляет простую поддержку многодомности и мобильности за счет механизма переадресации партнеров. Мобильный партер должен согласовать поддержку мобильности заранее. Когда мобильный партнер получает новый адрес, он посылает пакет DCCP-Move с этого адреса стационарной станции. Стационарная станция изменяет состояние соединения с учетом изменившегося адреса партнера. Поддержка DCCP мобильности призвана решить лишь простейшие проблемы многодомности и мобильности. Например, DCCP не имеет поддержки одновременного перемещения партнеров. Приложениям, где требуется более сложная семантика мобильности, или более сильные гарантии безопасности, следует использовать существующие решения, подобные Mobile IP или [SB00].
В противоположность TCP, DCCP не предлагает надежно упорядоченной доставки. Как следствие, в случае DCCP нет осложнений для слоев, размещенных выше DCCP, в частности для мультиплексирования субпотоков в рамках одного DCCP соединения.
Транспортный протокол реального времени, RTP [RFC 1889], в настоящее время используется (поверх UDP) многими приложениями DCCP. Существует два потенциальных источника избыточности в комбинации RTP-поверх-DCCP, задублированные данные подтверждения и задублированные порядковые номера. Этот источник избыточности добавляет 4 байта на пакет по отношению к RTP-поверх-UDP. Однако конкретные CCID могут использовать место, занимаемое порядковым номером RTP.
Протокол DCCP не предоставляет криптографических гарантий безопасности. Приложения, требующие серьезной безопасности должны использовать IPsec или какую-то иную схему безопасности. Несмотря ни на что, DCCP имеет возможности противостоять некоторым видам атак. Этому способствует используемая система нумерации пакетов.
Текущий список Интернет-проектов, в том числе по направлению DCCP, доступен по адресу http://www.ietf.org/ietf/1id-abstracts.txt.
[DCCP] | E. Kohler, M. Handley, S. Floyd, and J. Padhye. Datagram Congestion Control Protocol, draft-ietf-dccp-spec-04.txt, работа продолжается, июнь 2003. |
[RFC 1889] | Audio-Video Transport Working Group, H. Schulzrinne, S. Casner, R. Frederick, and V. Jacobson. RTP: A Transport Protocol for Real-Time Applications. RFC 1889. |
[RFC 2026] | S. Bradner. The Internet Standards Process---Revision 3. RFC 2026. |
[RFC 2960] | R. Stewart, Q. Xie, K. Morneault, C. Sharp, H. Schwarzbauer, T. Taylor, I. Rytina, M. Kalla, L. Zhang, and V. Paxson. Stream Control Transmission Protocol. RFC 2960. |
[RFC 3448] | M. Handley, S. Floyd, J. Padhye, and J. Widmer, TCP Friendly Rate Control (TFRC): Protocol Specification, RFC 3448, Proposed Standard, January 2003. |
[SB00] | Alex C. Snoeren and Hari Balakrishnan. An End-to-End Approach to Host Mobility. Proc. 6th Annual ACM/IEEE International Conference on Mobile Computing and Networking (MOBICOM ’00), August 2000. |
Previous: 4.4.3.3 Новый протокол TCP
UP:
4.4.3 Протокол TCP Next: 4.4.3.5 Протокол TFRC |