webrtc数据通道之SCTP over DTLS简介

一、总述

webrtc的数据通道可以走三种协议:1、SCTP;2、RTP;3、QUIC。这里先研究第一种,SCTP。

webrtc使用SCTP over DTLS方式传输数据通道报文。 

DTLS的作用是给数据通道数据加密(保证数据安全性)、增加链路证书校验机制(防止网络攻击)。

与TLS over TCP不同,UDP层没有对数据报文的乱序、丢包做处理,会导致链路证书校验协商无法保证。所以:

1、DTLS在创建连接时的握手消息里面,需要增加可靠性传输机制。

2、由于UDP对数据的实时性要求比较高,所以链路建立稳定后,传输应用数据时,没有提供数据可靠性传输机制,需要SCTP协议或者应用层保证。

二、DTLS

1)握手消息全协商流程

2)握手消息可靠性设计流程

  • 包丢失

一旦Client传输了ClientHello消息,它会期望收到从Server发来的一个 HelloVerifyRequest。然而,如果这个Server的消息丢失了,Client就会知道ClientHello或HelloVerifyRequest已经丢失,然后重传。当Server收到重传包时,它就会知道重传发生了。Server也维护了一个重传定时器,当其超时后会重传。

需要注意超时和重传并不应用于HelloVerifyRequest,因为这需要在Server上创建状态。HelloVerifyRequest被设计的足够小以避免自身被分片,因此可以不用考虑多个HelloVerifyRequest交叉的情况。

  • 包重排

在DTLS中,每个握手消息会在握手中被分配一个明确的序列号。当一个客户端收到一个握手消息时,它能快速确定这个消息是否是它所期望接收的下一个消息。如果是,它会进行处理。如果不是,它会将其放入队列中,等所有缺失的报文都收到后再进行处理。

  • 包大小

TLS和DTLS握手消息可能会相当大(理论上可以达到的上限是2^24-1字节,实际上是很多个K字节)。相比值之下,UDP报文通常被限制在小于1500字节,如果不想要IP分片的话。为了适应这个限制,每个DTLS握手消息可以在几个DTLS记录中进行分片,每个DTLS记录都会试图适应一个单个IP数据报。每个DTLS握手消息包含一个分片偏移和分片长度。因此,一个拥有一个握手消息所有字节的接受者能够重组原始的未分片消息。

3)DTLS报文格式

  • ContentType type定义

          20:change_cipher_spec   密码变更(每次变更epoch要加一)
          21:alert    报警消息
          22:handshake   握手消息
          23:application_data    应用数据

  • ProtocolVersion version

          DTLS version 1.2版本使用的是{254, 253}

  • uint16 epoch

          计数值,随着每次加密状态改变而递增

  • uint48 sequence_number

          本记录的序列号

  • uint16 length

          fragment数据长度,不能超过2^14次方。

  • 握手消息定义

  • 握手消息抓包示例

  • 应用数据抓包示例

 

三、SCTP

最早STCP是把窄带7号信令的可靠性传输机制引入到IP协议、优化TCP协议的不能分帧传输的局限性提出来的。不过后来应用不是很广泛。

webrtc使用的是改良剪切版的STCP协议。由于SCTP协议是承载在DTLS协议上,所以SCTP的Multi homing功能,在webrtc的数据通道没有被使用。

有两个草案描述webrtc的改良方法《draft-ietf-rtcweb-data-channel-13》、《draft-ietf-rtcweb-data-protocol-09》,根据描述webrtc根据实际场景,引入了:可靠传输模式、部分可靠传输模式、不可靠传输模式等。

这几种模式在DataChannelInit结构体中配置。

当ordered配置成false、maxRetransmits配置成0,这里实现的就是不可靠传输,类似UDP协议。

当ordered配置成true、maxRetransmits配置成-1、maxRetransmits配置成-1,这里实现的就是可靠传输,类似TCP协议。

也可以根据需要配置成部分可靠性传输。

四、webrtc实现

  • 创建数据通道

CreateDataChannel
->CreateSctpTransport_n
->CreateDtlsTransport_n
->CreateDtlsTransportChannel_n
->new DtlsTransport

备注:WebRtcSession::Initialize里面有限制,使用SCTP通道须开启DTLS功能。

接收发送DTLS报文,及处理DTLS的握手消息等,在DtlsTransport类中实现。

 

五、附录

https://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol

https://www.html5rocks.com/en/tutorials/webrtc/datachannels/

https://bloggeek.me/sctp-data-channel/

《rfc6347》

《rfc5246》

《draft-ietf-rtcweb-data-protocol-09》

《draft-ietf-rtcweb-data-channel-13》

 

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
WebRTC 简介 WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音通话或视频聊天的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术。 WebRTC提供了实时音视频的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。 虽然WebRTC的目标是实现跨平台的Web端实时音视频通讯,但因为核心层代码的Native、高品质和内聚性,开发者很容易进行除Web平台外的移殖和应用。很长一段时间内WebRTC是业界能免费得到的唯一高品质实时音视频通讯技术。 为什么需要 WebRTC 开发者教程? 虽然WebRTC技术已经较为成熟,其集成了最佳的音/视频引擎,十分先进的codec,且包含了使用STUN、ICE、TURN、RTP-over-TCP的关键NAT和防火墙穿透等众多门槛并不低的技术。抛开音视频技术本身的复杂性外,要想找到合适的资料、完整的代码和库、配合合适的IDE和辅助工具能正常地实现编译和安装都非常的不容易,而这还只是个开始。没有靠谱的教程,你该怎么开始?那么地坑等在那,难道你打算一个一个趟过去? 本《WebRTC 零基础开发者教程》主要讲了什么 本文中提供下载的《WebRTC 零基础开发者教程》将以一个初学者的角度,从0开始逐步引导你掌握WebRTC开发的方方面面(当然,教程中更多的是操作性的内容,具体到技术原理和实现,显然不是本教程的讨论范畴)。 《WebRTC 零基础开发者教程》目录 1 工具 1.1 depot_tools 1.1.1 目标 1.1.2 Chromium 1.1.3 使用说明在这儿 1.1.4 下载 1.1.5 使用 1.1.6 具体使用例子 1.2 Gyp工具 1.3 Python工具 1.4 本地集成开发环境(IDE ) 1.4.1 Visual studio 1.4.2 Kdevelop 1.4.3 Eclipse 2 Webrtc 2.1 下载、编译 2.1.1 Windows下 2.1.2 ubuntu下编译 2.1.3 编译Android(只能在 linux 下) 3 webrtc开发 3.1 开发P2P视频软件需要处理的问题 3.1.1 用户列的获取、交换、信令的交换 3.1.2 P2P通信 3.1.3 多媒体处理 3.2 webrtc架构 3.2.1 WebRTC架构组件介绍 3.2.2 WebRTC核心模块API介绍 3.2.3 webRTC核心API详解 4 Libjingle详细介绍 4.1 重要组件 4.1.1 信号 4.1.2 线程和消息 4.1.3 名称转换 4.1.4 SSL支持 4.1.5 连接 4.1.6 传输,通道,连接 4.1.7 候选项 4.1.8 数据包 4.2 如何工作 4.2.1 Application模块 4.2.2 XMPP Messaging Component 模块 4.2.3 Session Logic and management commponent 模块 4.2.4 Peer to peer Component 模块 4.2.5 其他 4.3 建立libjingle应用程序 5 代码分析 5.1 音频通道建立过程 5.2 音频接收播放过程 5.3 视频接收播放过程 6 协议 6.1 XMPP协议 6.1.1 原理介绍 6.1.2 XMPP 协议网络架构 6.1.3 XMPP 协议的组成 6.1.4 Xmpp介绍 6.1.5 协议内容 6.2 Stun协议 6.2.1 P2P实现的原理 6.2.2 P2P的常用实现 6.2.3 Stun URI 6.2.4 内容 6.2.5 中文内容 6.2.6 开源服务器 6.2.7 公开的免费STUN服务器 6.3 Turn协议 6.3.1 概念 6.3.2 Turn uri 6.3.3 开源服务器工程 6.3.4 开源库 6.4 交互式连接建立(Interactive Connectivity Establishment) 6.4.1 IETF规格 6.4.2 开源工程 6.5 XEP-0166 Jingle 6.5.1 绪论 6.5.2 需求 6.6 Sctp协议 6.7 Rtp协议 7 附件 7.1 Gyp工具 7.2 Google test程序 7.3 Webrtc库介绍 7.4 webrtc代码相关基础知识 7.5 STUN和TURN技术浅析 7.6 基于ICE的VoIP穿越NAT改进方案 7.7 ubuntu安装使用stuntman 7.8 一个开源的ICE库——libnice介绍 7.9 4种利用TURN穿越对称型NAT方案的设计与实现 7.10 基于ICE方式SIP信令穿透Symmetric_NAT技术研究

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值