SCTP - у "вечного" TCP появился конкурент

1 февраль, 2007 - 17:54Леонід Бараш

IP-базированные сети, несмотря на свой впечатляющий рост, все еще не вытеснили другие универсальные телекоммуникационные инфраструктуры, к примеру такие, как ISDN, ATM и мобильные сети. И поскольку упомянутые инфраструктуры способны поддерживать все приложения и сервисы, возникает необходимость во взаимодействии между сетями. Для того чтобы переносить сигнальный трафик, генерируемый в других сетях, через IP-сети, было разработано семейство протоколов, базирующихся на Stream Control Transmission Protocol (SCTP), надежном транспортном протоколе потоковой передачи, обеспечивающем упорядоченную доставку данных между двумя конечными точками.

SCTP - относительно новый протокол транспортного уровня для IP-сетей (аналогичный TCP и UDP), - был определен рабочей группой IETF Signaling Transport (SIGTRAN) в 2000 г. Хотя изначально SCTP предназначался для телефонной сигнализации, в роли транспортного он снимает ряд ограничений TCP и в то же время заимствует некоторые полезные свойства UDP.

Подобно TCP, SCTP обеспечивает надежный транспортный сервис, передавая данные по сети без ошибок и в нужной последовательности, и так же ориентирован на соединение. Это означает, что перед передачей данных устанавливается соединение, которое сохраняется вплоть до успешного ее завершения. SCTP является протоколом индивидуальной рассылки (unicast) и поддерживает обмен данными только между двумя конечными точками. Рассмотрим вкратце основные его особенности.

Поддержка множественной адресации

SCTP - у "вечного" TCP появился конкурент
Рис. 1

Если в хосте установлено несколько сетевых интерфейсных карт, то он может иметь несколько IP-адресов, по которым к нему можно обращаться (multihoming - многодомность). В TCP понятие соединение (connection) относится к каналу между двумя конечными точками (в этом случае - сокет между интерфейсами двух хостов). SCTP вводит концепцию ассоциации (association), которая устанавливается между двумя хостами, однако потенциально поддерживает несколько интерфейсов на каждом хосте. Рис. 1 иллюстрирует различие между соединением TCP и ассоциацией SCTP. В случае TCP каждый хост включает единственный сетевой интерфейс, и соединение создается только между ними. В приведенном примере для SCTP каждый хост имеет два сетевых интерфейса. Таким образом, существует два независимых пути: один от C0 к S0 и второй - от C1 к S1. Протокол объединяет оба эти пути в ассоциацию.

Нужно отметить, что в текущей спецификации протокола многодомность не может использоваться для разделения нагрузки, а только лишь для целей избыточности. При нормальном режиме для получателя выбирается единственный адрес (в терминологии SCTP он называется основным), по которому и осуществляется вся передача данных. Для порций данных, транслируемых повторно, может быть указан альтернативный адрес с целью повысить вероятность доставки.

Для поддержки многодомности отправитель и получатель обмениваются списком адресов в процессе инициализации ассоциации (она будет рассмотрена ниже). Каждый узел должен обладать способностью получать сообщения от любого адреса, ассоциированного с другим узлом. В то же время для одной сессии используется единый номер порта для всего списка IP-адресов.

SCTP имеет встроенный механизм мониторинга путей в ассоциации. Если один из них оказывается неработоспособным, трафик направляется альтернативным маршрутом. Обработка отказа может также служить для управления сетевым соединением приложения. Например, возьмем ноутбук с интерфейсами Wi-Fi и Ethernet. Когда он подключен к доку, то в качестве сетевого соединения будет задействован высокоскоростной интерфейс Ethernet, но если это соединение прерывается (скажем, устройство отключается от дока), то связь будет восстановлена через беспроводной интерфейс. Таким образом, мониторинг путей обеспечивает высокую доступность и увеличивает надежность.

Многопотоковая передача данных

Ассоциация SCTP во многом подобна соединению TCP, однако SCTP может поддерживать несколько потоков внутри ассоциации. Это свойство явно выражено в самом названии протокола - Stream Control Transmission Protocol. Данные разбиваются на множество потоков, доставляемых получателю независимо. Каждому потоку присваивается номер, который кодируется внутри SCTP-пакетов, передающихся через ассоциацию. Потеря сообщения в одном из потоков никак не сказывается на остальных.

Одним из примеров полезности многопотоковости может служить доставка мультимедийных документов, таких как Web-страницы, которые отсылаются в рамках единой сессии. Поскольку такие документы содержат объекты разных размеров и типов данных (к примеру, HTML-страницы и графические образы), многопотоковость позволяет передавать их не строго, а частично упорядоченными. В результате этого улучшается восприятие документа пользователем.

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

Сохранение границ сообщений

Еще одно отличие рассматриваемого протокола от TCP - сохранение границ сообщений.

TCP ориентирован на поток байтов. Все байты, посланные по TCP-соединению, доставляются в строгом порядке. Это значит, что байт, отправленный первым, должен быть безопасно доставлен в пункт назначения прежде, чем второй байт может быть обработан, даже если он "ухитряется" прибыть раньше. Если за один шаг посылается некоторое количество байтов, а позже - еще, то вся последовательность будет принята в строгом порядке, но получатель не сможет определить, на каком шаге были отправлены те или иные байты.

SCTP - у "вечного" TCP появился конкурент
Рис. 2

В противоположность этому SCTP сохраняет границы сообщений, поскольку оперирует не отдельными байтами, а целым сообщением. Другими словами, если клиент посылает серверу сначала сообщение длиной 100 В, а затем второе длиной 50 В, то оба они будут прочитаны сервером двумя соответствующими операциями чтения (рис. 2).

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

Особенности процедуры инициализации ассоциации

SCTP - у "вечного" TCP появился конкурент
Рис. 3

И в TCP, и в SCTP новое соединение устанавливается с помощью механизма квитирования. В TCP для этого используется трехэтапная процедура (рис. 3, а). Клиент посылает пакет SYN, на который сервер отвечает квитанцией SYN-ACK. Затем клиент подтверждает ее получение пакетом ACK. При этом может возникнуть следующая ситуация. Предположим, злоумышленник формирует пакет с фальшивым адресом источника и потом "затапливает" сервер пакетами SYN. Сервер выделяет соответствующие ресурсы и затем "задыхается" под лавиной пакетов SYN и не может обслуживать новые запросы. Так организуется атака, известная как отказ в обслуживании (DoS).

SCTP защищается от подобных атак с помощью четырехэтапной процедуры установки связи и ввода специальной записи состояния (cookie). Рассмотрим этот механизм (рис. 3, б).

Клиент сообщает серверу о намерении установить соединение, посылая пакет INIT. При этом получателю не требуется сохранять никакой информации о состоянии или резервировать какие-либо ресурсы. Вместо этого он отвечает пакетом INIT-ACK, который включает cookie, содержащую всю информацию, требуемую отправителю для формирования своего состояния. Оба сообщения INIT и INIT-ACK содержат несколько параметров, необходимых для установки начального состояния:

  • список всех IP-адресов, которые станут частью ассоциации;
  • номер транспортной последовательности, используемый для обеспечения надежной доставки данных;
  • тег инициации, включаемый в каждый входящий пакет SCTP;
  • количество выходящих потоков, запрашиваемых каждым из узлов;
  • количество входящих потоков, которые способен поддерживать каждый из узлов.

После этого клиент возвращает пакет COOKIE-ECHO, который содержит запись cookie, посланную сервером, и может включать связанные с ним пользовательские сообщения DATA. На этом шаге сервер выделяет ресурсы для соединения и подтверждает это, отправляя клиенту пакет COOKIE-ACK (он также может содержать пользовательские сообщения DATA). Это в определенной мере компенсирует задержку, вызванную четырехэтапным механизмом квитирования.

Отключение соединения

Транспортным протоколам, ориентированным на соединение, необходим метод его поэтапного разрыва. Сравним, как это делается в случаях TCP и SCTP.

SCTP - у "вечного" TCP появился конкурент
Рис. 4

Как видно из рис. 4, а, завершение сеанса TCP проходит в четыре этапа. Разрывающий соединение узел посылает пакет FIN, сигнализируя, что у него нет больше данных для отправки. Однако другая сторона может продолжать передавать данные сколь угодно долго, и лишь затем ответить пакетами подтверждения ACK и окончания FIN. Такая ситуация известна как наполовину открытое соединение. Приложения нечасто используют это состояние, и поэтому разработчики SCTP решили удалить этот этап, заменив его более определенной завершающей последовательностью операций (рис. 4, б). Протокол предусматривает, что коль скоро одной из сторон была начата процедура разрыва (послан пакет SHUTDOWN), то оба узла прекращают передачу данных по соединению. Им остается только подтвердить свои действия квитанциями SHUTDOWN-ACK и SHUTDOWN- COMPLETION.

В заключение добавим, что SCTP нашел свое место во всех основных ОС, включая GNU/Linux, BSD и Solaris. Для Microsoft Windows он существует в виде коммерческого пакета третьей стороны. Он также применяется другими протоколами, такими как SIP и SS7. Когда он станет общедоступным, приложения начнут использовать его как основной транспорт.