Использование каналов данных WEBRTC

Использование каналов данных WEBRTC

Краткое содержание

В этом руководстве мы рассмотрим, как добавить канал данных в одноранговое соединение, которое затем можно использовать для безопасного обмена произвольными данными. Мы посмотрим, как создать канал данных и обсудим варианты автоматических и ручных переговоров.

Ключевые моменты

1. Транспорт SCTP используется для передачи и получения данных для RTCDatachannels на одноранговом соединении.

2. Интерфейс rtcpeerconnection имеет свойство только для чтения, называемое SCTP, которое возвращает объект RTCSctpTransport, описывающий используемый транспорт SCTP.

3. Метод CreateMataChannel () на интерфейсе RTCPeerconnection используется для создания нового канала данных.

4. Автоматические переговоры позволяют RTCPeerconnection обрабатывать переговоры и создание канала данных.

5. Вручные переговоры включают в себя создание объекта RTCDataChannel с согласованным имуществом, установленным на True, а затем переговоры о соединении вне полосы.

6. Максимальный размер сообщения, который может быть отправлен по каналу данных, может быть определен с использованием свойства maxMessageize объекта RTCSCTPTransport.

7. Компоненты WEBRTC Используют шифрование для защиты данных, передаваемых через RTCDataChannel.

8. Спецификации для каналов данных WEBRTC можно найти в WEBRTC: связь в реальном времени в спецификации браузеров.

9. Совместимость каналов данных WEBRTC варьируется в разных браузерах.

10. Дополнительные ресурсы и варианты для редактирования или проблем с отчетностью со страницей можно найти в разделе «См. Также».

Вопросы и ответы

  1. Какова цель блоков ACK в каналах данных WEBRTC?
    Блоки ACK используются для информирования отправителя, что определенные пакеты не нужно обижаться, даже если в доставленных пакетах есть пробел. Например, если данные данных с TSNS 100, 102, 103 и 104 доставляются, но совокупный TSN ACK составляет 100, блоки ACK можно использовать, чтобы указать, что TSN 102, 103 и 104 не нужно возмущаться.
  2. Что делает свойство SCTP интерфейса rtcpeerconnection return?
    Свойство SCTP возвращает объект RTCSCTPTransport, который описывает транспорт SCTP, используемый для передачи и получения данных для RTCDatachannels на одноранговом соединении. Если SCTP не обсуждается, стоимость нулевой.
  3. Как можно создавать канал данных в WEBRTC?
    Канал данных может быть создан с использованием метода Ceneleatachannel () на интерфейсе rtcpeerconnection. Этот метод возвращает объект RTCDataChannel, представляющий недавно созданный канал данных.
  4. В чем разница между автоматическими переговорами и ручными переговорами?
    В автоматических переговорах RTCPeerConnection обрабатывает переговоры и создание канала данных. Метод CreateAtachannel () вызывается без указания значения для согласованного имущества или со значением false. В ручных переговорах канал данных создается с помощью согласованного свойства, установленного в True, и переговоры выполняются вне полосатой с использованием веб-сервера или других средств.
  5. Как можно определить максимальный размер сообщения, который можно отправить по каналу данных?
    Максимальный размер сообщения можно определить путем доступа к свойству MaxMessageize объекта RTCSCTPTransport, который представляет транспорт SCTP, используемый RTCPeerconnection.
  6. Данные, передаваемые на RTCDataChannel, автоматически защищены?
    Да, все данные, передаваемые на RTCDataChannel, автоматически защищены с использованием безопасности транспортного уровня Datagram (DTLS). Компоненты WEBRTC обязаны использовать шифрование для обеспечения безопасности данных.
  7. Где можно найти спецификации для каналов данных WEBRTC?
    Спецификации для каналов данных WebRTC можно найти в SEBRTC: связь в реальном времени в спецификации браузеров, в частности, в разделе DOM-RTCPEerconnection-STCTP.
  8. Какова совместимость каналов данных WEBRTC в разных браузерах?
    Совместимость каналов данных WEBRTC может варьироваться в разных браузерах. Важно проверить и обеспечить совместимость для целевых браузеров и версий.
  9. Какие дополнительные ресурсы связаны с каналами данных WEBRTC?
    Вы можете редактировать страницу на GitHub, сообщить о проблемах содержимого или просмотреть исходный код на GitHub. Эти варианты можно найти в разделе «См. Также» ниже.

    Использование каналов данных WEBRTC

    ACK блокирует TSN, которые были получены после совокупного TSN ACK . Это используется, если в доставленных пакетах есть разрыв. Позволять’S скажем, куски данных с TSNS 100, 102, 103 и 104 доставляются. Совокупный TSN ACK будет 100, но блоки ACK можно было бы использовать, чтобы сообщить отправителю, что это не так’Т нужно отказаться от 102, 103 или 104 .

    Rtcpeerconnection: свойство SCTP

    Только для чтения SCTP Свойство на интерфейсе RTCPeerConnect. Если SCTP не был согласован, эта стоимость нулевой .

    Транспорт SCTP используется для передачи и получения данных для любого и всех RTCDataChannel S на одноранговом соединении.

    Ценить

    Объект RTCSCTPTransport, описывающий транспорт SCTP, используемый RTCPeerConnection для передачи и получения на его каналах данных, или NULL, если переговоры SCTP не произошли.

    Пример

    констант Peerconnection "=" новый Rtcpeerconnection(); констант канал "=" Peerconnection.Созданный атаканал("Мои данные"); канал.OnoPen "=" (событие) =>  канал.отправлять("Отправка сообщения"); >; канал.OnMessage "=" (событие) =>  консоль.бревно(событие.данные); >; // определить самый большой размер сообщения, который можно отправить констант SCTP "=" Peerconnection.SCTP; констант maxmessageize "=" SCTP.maxmessageize; 

    Технические характеристики

    Спецификация
    WEBRTC: общение в реальном времени в браузерах
    # dom-rtcpeerconnection-sctp

    Совместимость браузера

    Таблицы BCD загружаются только в браузер

    Смотрите также

    Нашел проблему с контентом с этой страницей?

    • Измените страницу на GitHub.
    • Сообщите о проблеме контента.
    • Посмотреть источник на GitHub.

    Эта страница была в последний раз изменен 25 апреля 2023 года участниками MDN.

    Ваш план для лучшего интернета.

    Использование каналов данных WEBRTC

    В этом руководстве мы рассмотрим, как добавить канал данных к одноранговому соединению, которое затем можно использовать для безопасного обмена произвольными данными; то есть любые данные, которые мы хотим, в любом формате, который мы выбираем.

    Примечание: Поскольку все компоненты WEBRTC необходимы для использования шифрования, любые данные, передаваемые на RTCDataChannel, автоматически защищены с использованием безопасности транспортного уровня Datagram (DTLS). Смотрите безопасность ниже для получения дополнительной информации.

    Создание канала данных

    Основной транспорт данных, используемый RTCDataChannel, может быть создан одним из двух способов:

    • Позвольте Webrtc создать транспорт и объявить его для удаленного сверстника для вас (заставив его получить событие DataChannel). Это простой способ, и он работает для широкого спектра использования, но может быть недостаточно гибким для ваших нужд.
    • Напишите свой собственный код, чтобы договориться о транспортировке данных и написать свой собственный код, чтобы сигнализировать другому однорангу, что ему нужно подключиться к новому каналу.

    Давайте посмотрим на каждый из этих случаев, начиная с первого, который является наиболее распространенным.

    Автоматические переговоры

    Часто вы можете разрешить подключение к сверстнику обрабатывать переговоры о подключении RTCDataChannel для вас. Чтобы сделать это, позвоните

    CreatedAtachannel () без указания значения для согласованного имущества или указания имущества со значением false . Это автоматически заставляет RTCPeerconnection обработать переговоры для вас, заставив удаленного узла создать канал данных и связывать их вместе по всей сети.

    Объект RTCDataChannel немедленно возвращается cenecualAtachannel (); Вы можете сказать, когда соединение было успешно сделано, наблюдая за открытым событием, которое будет отправлено в RTCDataChannel .

    позволять DataChannel "=" ПК.Созданный атаканал("MyApp Channel"); DataChannel.addEventListener("открыть", (событие) =>  Begin Transmission(DataChannel); >); 

    Ручные переговоры

    Чтобы вручную договориться о подключении канала данных, вам необходимо сначала создать новый объект RTCDataChannel, используя метод CreateAtachannel () на RTCPeerconnection, указав в параметрах согласованное свойство, установленное на True . Это сигнализирует о подключении к сверстнику, чтобы не пытаться договориться о канале от вашего имени.

    Затем договоритесь о подключении вне полосы, используя веб-сервер или другие средства. Этот процесс должен сигнализировать о удаленном узле, что он должен создать свой собственный rtcdatachannel с согласованным свойством, также устанавливается на True, используя тот же идентификатор . Это свяжет два объекта через rtcpeerconnection .

    позволять DataChannel "=" ПК.Созданный атаканал("MyApp Channel",  согласован: истинный, >); DataChannel.addEventListener("открыть", (событие) =>  Begin Transmission(DataChannel); >); requestRemoteChannel(DataChannel.идентификатор); 

    В этом фрагменте кода канал создается с помощью согласованного SET TO TRUIN, затем функция, называемая requestRemotechannel (), используется для запуска переговоров, для создания удаленного канала с тем же идентификатором, что и локальный канал.

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

    Буферизация

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

    Понимание пределов размера сообщений

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

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

    Когда два пользователя, управляющие Firefox, общаются на канале данных, ограничение размера сообщения намного больше, чем когда Firefox и Chrom. Вместо этого Chrome увидит серию сообщений, которые, по его мнению, являются завершенными, и доставит их в приемный RTCDataChannel в качестве нескольких сообщений.

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

    Проблемы с большими сообщениями

    В настоящее время не практично использовать RTCDataChannel для сообщений, более 64 киб (16 киб, если вы хотите поддержать обмен данными кросс-браузера). Проблема возникает из -за того, что SCTP – протокол, используемый для отправки и получения данных на RTCDataChannel – был изначально предназначен для использования в качестве сигнального протокола. Ожидалось, что сообщения будут относительно небольшими. Поддержка сообщений, больше, чем MTU сетевого уровня была добавлена ​​почти как запоздалая мысль, в случае сигнализации сообщений, необходимых для большего, чем MTU. Эта функция требует, чтобы каждая часть сообщения имела последовательные номера последовательностей, поэтому их нужно передавать один за другим, без каких -либо других данных, не следовых между ними между ними.

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

    Это станет проблемой, когда браузеры должным образом поддержит текущий стандарт для поддержки более крупных сообщений-флаг конец записи (EOR), который указывает, когда сообщение является последним в серии, который следует рассматривать как единую полезную нагрузку. Это реализовано в Firefox 57, но еще не реализовано в Chrome (см. Chromium Bug 7774). При поддержке EOR полезные нагрузки RTCDataChannel могут быть намного больше (официально до 256 киб, но реализация Firefox ограничивает их на колоссальном 1 GIB). Даже при 256 киб, это достаточно большое, чтобы вызвать заметные задержки при обращении с неотложным движением. Если вы пойдете еще больше, задержки могут стать несостоятельными, если вы не уверены в своих условиях эксплуатации.

    Чтобы решить эту проблему, новая система Планисты потока (Обычно называется «Спецификация SCTP NDATA») была разработана, чтобы сделать возможным переключение сообщений, отправляемых на разные потоки, включая потоки, используемые для реализации каналов данных WEBRTC. Это предложение все еще находится в черновой форме IETF, но после реализации это позволит отправлять сообщения с по существу без ограничений по размеру, поскольку уровень SCTP автоматически переоценит базовые подметки, чтобы гарантировать, что данные каждого канала имеют возможность пройти через.

    Поддержка Firefox для NDATA находится в процессе реализации; См. Firefox Bug 1381145, чтобы отслеживать его, становясь доступным для общего использования. Команда Chrome отслеживает свою реализацию поддержки NDATA в Chrome Bug 5696.

    Примечание: Большая часть информации в этом разделе частично основана на сообщении в блоге, демистификации ограничения сообщений канала данных WEBRTC, написанные Леннартом Гралом. Он вдается в более подробную информацию, но с тех пор браузеры были обновлены с тех пор, некоторые из них могут быть устаревшими. Кроме того, со временем это станет более чем, особенно после того, как поддержка EOR и NDATA полностью интегрированы в основные браузеры.

    Безопасность

    Все данные, передаваемые с использованием webrtc, зашифрованы. В случае RTCDataChannel используемым шифрованием является безопасность транспортного уровня Datagram (DTLS), которая основана на безопасности транспортного уровня (TLS). Поскольку TLS используется для обеспечения каждого подключения к HTTPS, любые данные, которые вы отправляете на канале данных, столь же безопасны, как и любые другие данные, отправленные или полученные в браузере пользователя.

    Более принципиально, поскольку WEBRTC-это одноранговое соединение между двумя пользовательскими агентами, данные никогда не проходят через веб-сервер или сервер приложений. Это уменьшает возможности для перехвата данных.

    Нашел проблему с контентом с этой страницей?

    • Измените страницу на GitHub.
    • Сообщите о проблеме контента.
    • Посмотреть источник на GitHub.

    Эта страница была в последний раз изменен 25 апреля 2023 года участниками MDN.

    Использует ли Webrtc sctp?

    Охто

    Мы аррегировали подоаджолгн. SpoMOщHщ эtOй straoniцы mы smosememememopredetath, чto -aprosы otpra. То, что нужно?

    Эta -steraniцa otobrana -overshy -aTeх -stuчah -obra -aTeх -stu -y -y -ogdaTomAtiчeskymi -stri -stri -rah -strhe -strhe -strhe -stri -stri -stri -stri -stri -stri -rah -rah -stristriouri Котора. Straoniцa -oprepaneTeTeTeTeTOTOTOTO -opobrasthep -apoSle -o, kak -эat. ДО СОМОМОНТА.

    Иошнико -а -а -а -в -впологовый схлк -а -апросов. Esli-yspolheoute obhщiй dostup-vanterneTTHETHETHETHETHET,. Охраторс. Подеб.

    Проверка, в котором я, eSli -voAchephephephephe -yvodyte -sloжne -apro Эмами, Или,.

    Передача данных #

    Что я могу получить от webrtc’S Связь данных? #

    WEBRTC предоставляет каналы данных для передачи данных. Между двумя сверстниками вы можете открыть 65 534 канала данных. Канал данных основан на данных, и каждый имеет свои собственные настройки долговечности. По умолчанию каждый канал данных гарантированной доставки. Если вы подходите к WEBRTC из каналов фоновых данных в СМИ могут показаться расточительными. Почему мне нужна вся эта подсистема, когда я мог бы просто использовать http или websockets? Реальная питание с каналами данных заключается в том, что вы можете настроить их, чтобы вести себя как UDP с неупорядоченной/потерянной доставкой. Это необходимо для низкой задержки и высокопроизводительных ситуаций. Вы можете измерить обратное давление и убедиться, что вы отправляете только столько, сколько ваша сеть поддерживает.

    Как это работает? #

    WEBRTC использует протокол передачи управления потоком (SCTP), определенный в RFC 4960. SCTP – это протокол транспортного уровня, который был предназначен как альтернатива TCP или UDP. Для WEBRTC мы используем его в качестве протокола уровня приложений, который работает над нашим соединением DTLS. SCTP дает вам потоки, и каждый поток может быть настроен независимо. Каналы данных WEBRTC – это просто тонкие абстракции вокруг них. Настройки, касающиеся долговечности и упорядочения, только что передаются прямо в агент SCTP. Каналы данных имеют некоторые функции, которые SCTP может’T Express, как метки канала. Чтобы решить, что WEBRTC использует протокол создания канала данных (DCEP), который определяется в RFC 8832. DCEP определяет сообщение для передачи метки и протокола канала.

    Dcep #

    DCEP имеет только два сообщения data_channel_open и data_channel_ack . Для каждого открытого канала данных удаленное управление должно отвечать ACK.

    Data_channel_open #

    Это сообщение отправлено агентом WEBRTC, который хочет открыть канал.

    Формат пакета #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип сообщения | Тип канала | Приоритет | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Параметр надежности | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Длина ярлыка | Длина протокола | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ / label / \ \+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+\ \ \ / protocol / \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Тип сообщения #

    Тип сообщения – это статическое значение 0x03 .

    Тип канала #

    • Data_channel_reliable (0x00) – Сообщения не потеряны и поступят в порядке
    • Data_channel_reliable_unordered (0x80) – никакие сообщения не потеряны, но они могут выйти из порядка.
    • Data_channel_partial_reliable_rexmit (0x01) – Сообщения могут быть потеряны после попытки запрашиваемой суммы раз, но они поступят в порядке.
    • Data_channel_partial_reliable_rexmit_unordered (0x81) – Сообщения могут быть потеряны после попытки запрошенной суммы раз и могут выйти из порядка.
    • Data_channel_partial_reliable_timed (0x02) – Сообщения могут быть потеряны, если они доны’это прибудет в запрошенное количество времени, но они прибудут в порядке.
    • Data_channel_partial_reliable_timed_unordered (0x82) – Сообщения могут быть потеряны, если они донут’Т приезжайте за запрошенную сумму времени и может выйти из порядка.

    Приоритет #

    Приоритет канала данных. Каналы данных с более высоким приоритетом будут запланированы первыми. Большие сообщения пользователей с более низким приоритетом не задержит отправку сообщений пользователей с более высоким приоритетом.

    Параметр надежности #

    Если тип канала данных равен data_channel_partial_reliable, суффиксы настраивают поведение:

    • Rexmit – определяет, сколько раз отправитель будет переосмыслить сообщение, прежде чем сдаться.
    • Время – определяет, сколько времени (в MS) отправитель переосмысчит сообщение, прежде чем сдаться.

    Этикетка #

    Строка UTF-8-кодировка, содержащая имя канала данных. Эта строка может быть пустой.

    Протокол #

    Если это пустая строка, протокол не указан. Если это непустая строка, она должна указать протокол, зарегистрированный в “WebSocket Subprotocol Registry”, Определено в RFC 6455.

    Data_channel_ack #

    Это сообщение отправлено агентом WEBRTC, чтобы подтвердить, что этот канал данных был открыт.

    Формат пакета #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип сообщения | +-+-+-+-+-+-+-+-+ 

    Протокол передачи управления потоком #

    SCTP – это реальная сила, стоящая за каналами данных WEBRTC. Он предоставляет все эти функции канала данных:

    • Мультиплексирование
    • Надежная доставка с использованием механизма ретрансмиссии, подобного TCP
    • Параметры частичной надежности
    • Предотвращение перегрузки
    • Управление потоком

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

    Концепции #

    SCTP – это протокол, богатый функцией. Этот раздел будет покрывать только части SCTP, которые используются WEBRTC. Особенности в SCTP, которые не используются WEBRTC, включают в себя многолетний и выбор пути.

    С более чем двадцатилетним развитием SCTP может быть трудно полностью понять.

    Ассоциация #

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

    Потоки #

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

    WEBRTC позволяет вам настраивать создание потока, но SCTP фактически позволяет изменить конфигурацию в любое время.

    # На основе DataGram

    SCTP создает данные как Datagrams, а не как байт -поток. Отправка и получение данных похоже на использование UDP вместо TCP. Ты не ДОН’T нужно добавить любой дополнительный код для передачи нескольких файлов по одному потоку.

    Сообщения SCTP Дон’T есть пределы размера, такие как UDP. Единственное сообщение SCTP может быть несколько гигабайт в размере.

    Куски #

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

    Каждый пакет SCTP содержит список кусков. Таким образом, в одном пакете UDP вы можете иметь несколько кусков, несущих сообщения из разных потоков.

    Номер последовательности передачи #

    Номер последовательности передачи (TSN) является глобальным уникальным идентификатором для кусков данных. Переплата данных – это то, что несет все сообщения, которые пользователь хочет отправить. TSN важен, потому что он помогает приемнику определить, потеряны ли пакеты или не в порядке.

    Если приемник замечает отсутствующий TSN, это не’T -дайте данные пользователю, пока он не выполнится.

    Идентификатор потока #

    Каждый поток имеет уникальный идентификатор. Когда вы создаете канал данных с явным идентификатором, он на самом деле просто передается прямо в SCTP в качестве идентификатора потока. Если ты не ДОН’T пройдите идентификатор, идентификатор потока выбран для вас.

    Идентификатор протокола полезной нагрузки #

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

    • Webrtc dcep (50) – сообщения dcep.
    • Webrtc string (51) – Сообщения строк данных DataChannel.
    • Bebrtc Binary (53) – Двоичные сообщения Datachannel.
    • Webrtc string пусто (56) – Сообщения строк DataChannel с длиной 0.
    • Bebrtc Binary Emption (57) – Двоичные сообщения DataChannel с длина 0.

    Протокол #

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

    Каждый кусок начинается с поля типа. Перед списком кусков, у вас также будет заголовок.

    Data Chunk #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 0 | Зарезервирован | U | B | E | Длина | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Идентификатор потока | Номер последовательности потока | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Идентификатор протокола полезной нагрузки | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ \ / user data / \ \ \ \ \ \ \ \ \ \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Перебор данных – это то, как обменяются все пользовательские данные. Когда вы отправляете что -нибудь по каналу данных, это то, как его обмениваются.

    U бит установлен, если это неупорядоченный пакет. Мы можем игнорировать номер последовательности потока.

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

    • B = 1, e = 0 – Первая часть фрагментированного пользовательского сообщения.
    • B = 0, e = 0 – средняя часть фрагментированного пользовательского сообщения.
    • B = 0, e = 1 – последний кусок фрагментированного пользовательского сообщения.
    • B = 1, e = 1 – нефрагментированное сообщение.

    TSN – это номер последовательности передачи. Это глобальный уникальный идентификатор для этого чанка данных. После 4 294 967 295 кусков это будет завершено до 0. TSN увеличивается для каждого чанка в фрагментированном пользовательском сообщении, чтобы приемник знал, как заказать полученные куски для восстановления исходного сообщения.

    Поток идентификатор является уникальным идентификатором потока, которым принадлежит эти данные.

    Номер последовательности потока-это 16-битный номер, увеличенный каждое пользовательское сообщение и включен в заголовок Chunk сообщений данных. После 65535 сообщений это завершится до 0. Этот номер используется для определения порядка доставки в приемник, если вы установлены на 0. Аналогично TSN, за исключением того, что номер последовательности потока увеличивается только для каждого сообщения в целом, а не для каждого отдельного куски данных.

    Идентификатор протокола полезной нагрузки – это тип данных, который проходит через этот поток. Для webrtc это будет DCEP, String или Binary.

    Пользовательские данные – это то, что вы отправляете. Все данные, которые вы отправляете через канал данных WEBRTC, передаются через кусок данных.

    Init Chunk #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 1 | Флаги кусок | Длина чанка | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Инициировать тег | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Рекламный кредит окна приемника (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Количество исходящих потоков | Количество входящих потоков | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Начальный TSN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / Необязательно / Параметры длины переменной / \ \ \ \ \ \ \ \ \ \ \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Инициальный кусок начинает процесс создания ассоциации.

    Tag initiate используется для генерации cookie. Файлы cookie используются для человека в среднем и отрицании защиты обслуживания. Они более подробно описаны в разделе Match Machine.

    Рекламируемый кредит на окне приемника используется для SCTP’S Контроль заторов. Это сообщает, насколько большой буфер присвоитель выделен для этой ассоциации.

    Количество исходящих/входящих потоков уведомляет удаленное из того, сколько потоков поддерживает этот агент.

    Первоначальный TSN – это случайный UINT32, чтобы начать локальный TSN в.

    Дополнительные параметры позволяют SCTP вводить новые функции в протокол.

    Мешок кусок #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 3 | Флаги Chunk | Длина чанка | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Совокупный TSN ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Рекламный кредит окна приемника (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Количество блоков ACK GAP = N | Количество дубликатов tsns = x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #1 Start | Gap Ack Block #1 END | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #N Start | GAP ACK Block #N END | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Дубликат TSN 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Дубликат TSN x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Чанк мешка (выборочное подтверждение) – это то, как приемник уведомляет отправителя, который получил пакет. Пока отправитель не получит мешок для TSN, он повторно распределит рассматриваемый кусок данных. Мешок делает больше, чем просто обновлять TSN, хотя.

    Кумулятивный TSN ACK самый высокий TSN, который был получен.

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

    ACK блокирует TSN, которые были получены после совокупного TSN ACK . Это используется, если в доставленных пакетах есть разрыв. Позволять’S скажем, куски данных с TSNS 100, 102, 103 и 104 доставляются. Совокупный TSN ACK будет 100, но блоки ACK можно было бы использовать, чтобы сообщить отправителю, что это не так’Т нужно отказаться от 102, 103 или 104 .

    Дубликат TSN сообщает отправителю, что он получил следующие куски данных более одного раза.

    Сердцебиение кусок #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 4 | Флаги кусок | Длина сердцебиения | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / heartbeat Информация tlv (переменная-+-+-+-+-+\ \ / Heartbeat +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Кусок сердцебиения используется для утверждения, что пульт дистанционного управления все еще реагирует. Полезно, если вы’T отправляя куски данных и необходимо сохранить открытое картирование NAT.

    Прервать кусок #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 6 | Зарезервированный | T | Длина | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ Zero или больше ошибок \ / / / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Арендовый кусок внезапно закрывает ассоциацию. Используется, когда одна сторона входит в состояние ошибки. Изящно заканчивающее соединение использует кусок выключения.

    Выключение Chunk #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 7 | Флаги кусок | Длина = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Совокупный TSN ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Чанк отключения начинает изящное закрытие ассоциации SCTP. Каждый агент информирует удаленное по последнему TSN, которое он отправил. Это гарантирует, что пакеты не потеряны. Webrtc делает’T Сделайте изящное закрытие ассоциации SCTP. Вам нужно снести каждый канал данных самостоятельно, чтобы грациозно справиться с ним.

    Кумулятивный TSN ACK – последний TSN, который был отправлен. Каждая сторона знает, что не заканчивается, пока они не получили кусок данных с этим TSN.

    Ошибка Чанк #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 9 | Флаги кусок | Длина | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ \ / одна или несколько ошибок / \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Чунк ошибок используется для уведомления о удаленном агенте SCTP о том, что произошла нерадостная ошибка.

    Вперед tsn Chunk #

     0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Тип = 192 | Флаги = 0x00 | Длина = переменная | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Новый кумулятивный TSN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Stream-1 | Поток последовательности-1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ / / \+-+-+-+-+-+-+-+-+ +-+-+-+-+-+| Stream-N | Поток последовательности N | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

    Правный TSN Chunk перемещает глобальный TSN вперед. SCTP делает это, так что вы можете пропустить некоторые пакеты, которые вы не надеваете’больше не заботится о. Позволять’S скажем, вы отправляете 10 11 12 13 14 15, и эти пакеты действительны только в случае прибытия. Эти данные также чувствительны в режиме реального времени, поэтому, если он прибудет поздно, они не’T полезно.

    Если вы проиграете 12 и 13, нет причин отправлять 14 и 15 ! SCTP использует прямой TSN Chunk для достижения этого. Он говорит приемнику, что 14 и 15’собираюсь больше доставлять.

    Новый кумулятивный TSN Это новый TSN связи. Любые пакеты до того, как этот TSN не будет сохранен.

    Последовательность потока и потока используется для прыжка номера номера последовательности потока впереди. Вернитесь к кусочке данных для значения этого поля.

    Государственный аппарат #

    Это некоторые интересные части стационарной машины SCTP. Webrtc делает’T Используйте все функции статей SCTP, поэтому мы исключили эти части. Мы также упростили некоторые компоненты, чтобы сделать их понятными самостоятельно.

    Соединение поток #

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

    Init ack -кусок содержит печенье. Затем печенье возвращается своему создателю, используя печенье . Если проверка cookie успешна, отправляется ACK Cookie ACK, а кусочки данных готовы к обмену.

    Установление связи

    Соединение протолока #

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

    Keep-Alive Механизм #

    SCTP использует запрос на сердцебиение и сердцебиение ACK, чтобы сохранить связь живым. Они отправляются в настраиваемый интервал. SCTP также выполняет экспоненциальный откат, если пакет имеет’Т прибыл.

    Кусок сердцебиения также содержит значение времени. Это позволяет двум ассоциациям вычислять время поездки между двумя агентами.