WebRTC protocols

这篇文章介绍了WebRTC API运行依赖的底层协议。

ICEEDIT

交互式连接建立Interactive Connectivity Establishment (ICE) 是一个允许你的浏览器和对端浏览器建立连接的协议框架。在实际的网络当中,有很多原因能导致简单的从A端到B端直连不能如愿完成。这需要绕过阻止建立连接的防火墙,给你的设备分配一个唯一可见的地址(通常情况下我们的大部分设备没有一个公网地址),如果路由器不允许主机直连,还得通过一台服务器转发数据。ICE通过使用以下几种技术完成上述工作。

STUNEDIT

NAT的会话穿越功能Session Traversal Utilities forNAT (STUN) (缩略语的最后一个字母是NAT的首字母)是一个允许位于NAT后的客户端找出自己的公网地址,判断出路由器阻止直连的限制方法的协议。

客户端通过给公网的STUN服务器发送请求获得自己的公网地址信息,以及是否能够被(穿过路由器)访问。

An interaction between two users of a WebRTC application involving a STUN server.

NATEDIT

网络地址转换协议Network Address Translation (NAT) 用来给你的(私网)设备映射一个公网的IP地址的协议。一般情况下,路由器的WAN口有一个公网IP,所有连接这个路由器LAN口的设备会分配一个私有网段的IP地址(例如192.168.1.3)。私网设备的IP被映射成路由器的公网IP和唯一的端口,通过这种方式不需要为每一个私网设备分配不同的公网IP,但是依然能被外网设备发现。

一些路由器严格地限定了部分私网设备的对外连接。这种情况下,即使STUN服务器识别了该私网设备的公网IP和端口的映射,依然无法和这个私网设备建立连接。这种情况下就需要转向TURN协议。

TURNEDIT

一些路由器使用一种“对称型NAT”的NAT模型。这意味着路由器只接受和对端先前建立的连接(就是下一次请求建立新的连接映射)。

NAT的中继穿越方式Traversal Using Relays around NAT (TURN) 通过TURN服务器中继所有数据的方式来绕过“对称型NAT”。你需要在TURN服务器上创建一个连接,然后告诉所有对端设备发包到服务器上,TURN服务器再把包转发给你。很显然这种方式是开销很大的,所以只有在没得选择的情况下采用。

An interaction between two users of a WebRTC application involving STUN and TURN servers.

一、RFC5766/TURN

TURN,在RFC5766中定义,英文全称TraversalUsing Relays around NAT(TURN):Relay Extensions to Session Traversal Utilities forNAT(STUN),即使用中继穿透NAT:STUN的中继扩展。简单的说,TURN与STUN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。

如果一个主机位于NAT的后面,在某些情况下它不能够与其他主机点对点直接连接。在这些情况下,它需要使用中间网点提供的中继连接服务。TURN协议就是用来允许主机控制中继的操作并且使用中继与对端交换数据。TURN与其他中继控制协议不同的是它能够允许一个客户端使用一个中继地址与多个对端连接。

TURN协议被设计为ICE的一部分,用于NAT穿越,虽然如此,它也可以在没有ICE的地方单独使用。

操作概述

33

图:TURN

在一个典型组网中,一个TURN客户端连接在一个私有网络中,通过一个或多个NAT来连接到公网。在公网中有一个TURN服务器。在因特网的别处有一个或多个对端是这个TURN客户端希望通讯的。这些对端也有可能是在一个或多个NAT的后面。该客户端使用服务器作为一个中继来发送数据包 到这些对端去,并且从这些对端接收数据包。

客户端通过一个IP地址和端口的组合来与服务器建立会话。客户端使用TURN命令在服务器上创建和操作一个ALLOCATION。一旦这个allocation创建好了,客户端能够在数据发往哪个对端的指示下发送应用数据到这个服务器,服务器将中继这些数据到合适的对端。客户端发送的应用数据包含在TURN消息中,服务器将数据提取出来,并以UDP数据包方式发送给对端。反向上,对端以UDP数据包方式发送应用数据到这个allocation提供的中继传输地址。因为TURN消息总是包含客户端与哪些对端通讯的指示,客户端能够使用单一的allocation来与多个对端通讯。

术语

TURN client:遵循RFC5766的STUN客户端。

TURN server:遵循RFC5766的STUN服务器。

Peer:TURN客户端希望连接的主机。TURN服务器为TURN客户端和它的对端中继流量,但Peer并不与TURN服务器使用TURN协议进行交互,它接收从TURN服务器发送过来的数据,并向TURN服务器发送数据。

Transport Address:IP地址与端口号的组合。

Host Transport Address:客户端或对端的传输地址。

Server-Reflexive Transport Address:NAT公网侧的传输地址,该地址由NAT分配,相当于一个特定的主机传输地址。

Relayed Transport Address:TURN服务器上的传输地址,用于客户端和对端中继数据。

TURN Server Transport Address:TURN服务器上的传输地址,用于客户端发送STUN消息给服务器。

Peer Transport Address:服务器看到的对端的传输地址,当对端是在NAT后面,则是对端的服务器反射传输地址。

Allocation:通过Allocate请求将中继传输地址提供给客户端,除了中继状态外,还有许可和超时定时器等。

5-tuple:五元组,包括客户端IP地址和端口,服务器IP地址和端口和传输协议(包括UDP、TCP、TLS)的组合。

Channel:通道号与对端传输地址的关联,一旦一个通道号与一个对端的传输地址绑定,客户端和服务器就能够利用带宽效应更大的通道数据消息来交换数据。

Permission:一个对端允许使用它的IP地址和传输协议来发送数据到TURN服务器,服务器只为从对端发来的并且匹配一个已经存在的许可的流量中继到相应的客户端。

Realm:服务器内用于描述服务器或内容的一个字符串,这个realm告诉客户端哪些用户名和密码的组合可用于认证请求。

Nonce:服务器随机选择的一个字符串,包含在报文摘要中。为了防止中继攻击,服务器应该有规律的改变这个nonce。

新的STUN方法

下面给出了新的STUN方法的编号:

0x003    Allocate

0x004    Refresh

0x006    Send

0x007    Data

0x008    CreatePermission

0x009    ChannelBind

新的STUN属性

0x000c   CHANNEL-NUMBER

0x000D  LIFETIME

0x0010 Reserved      (was BANDWIDTH)

0x0012  XOR-PEER-ADDRESS

0x0013  DATA

0x0016 XOR-RELAYED-ADDRESS

0x0018  EVEN-PORT

0x0019  REQUESTED-TRANSPORT

0x001A  DON’T-FRAGMENT

0x0021 Reserved      (was TIMER-VAL)

0x0022  RESERVATION-TOKEN

上面属性中的部分属性长度不是4字节的倍数,采用STUN的规则,使用1~3个padding字节来补齐。

CHANNEL-NUMBER

CHANNEL-NUMBER属性包含通道的号码。属性长4字节,包含16比特的无符号整数和2字节的RFFU(Reserved For Future Use)字段,该字段必须设为0且在接收时被忽略。

34

LIFETIME

LIFETIME属性表示服务器在没有收到refresh时维持一个allocation的持续时间。属性长4字节,包含一个32比特的无符号整数值,表示剩余多少秒终止

XOR-PEER-ADDRESS

XOR-PEER-ADDRESS指定从TURN服务器看到的对端的地址和端口,例如如果对端是在一个NAT后面,则为对端的server-reflexive传输地址。

DATADATA属性存在于所有的Send和Dataindications消息中。属性的值是可变长度的,包括应用数据。如果属性的长度不上4字节的倍数,必须进行填充。

XOR-RELAYED-ADDRESS

XOR-RELAYED-ADDRESS存在于所有的Allocate响应中。它指定了服务器分配给客户端的地址和端口。

35

EVEN-PORT

这个属性允许客户端请求在中继传输地址的端口为偶数,并且服务器可选的保留紧跟着的下一个端口号。属性的值长1字节,结构如下:

36

值包括一个1比特标志字段:R:如果为1,服务器被请求保留下一个更高的端口号(基于同一个IP地址)为随后的allocation。如果为0,则不请求保留。属性的其他7比特值必须设置为0,并且在接收时被忽略。因为属性不是4字节的倍数,必须进行填充。

REQUESTED-TRANSPORT

客户端通过该属性为已分配的传输地址请求一个特定的传输协议。属性的值是4字节长度的。

37协议字段指定了需求的协议。可以取自IPv4报头中的协议字段的值或IPv6报头的下一个报头字段的协议号。目前仅允许设置为17,即UDP。RFFU字段在传输时必须设置为0,并在接收时被忽略。保留用于未来使用。

DON’T-FRAGMENT

客户端使用该属性来请求服务器设置IP报头中的DF(不要分片)位,当中继应用数据到对端时。该属性没有值,因此属性长度字段为0。

RESERVATION-TOKEN

RESERVATION-TOKEN属性包含一个token来唯一的标识一个中继传输地址已经被服务器保留。服务器在一个成功响应中包含该属性来告诉客户端这个token,客户端在接下来的Allocate请求中包括该属性来请求服务器为这个allocation使用那个中继传输地址。属性值是8字节长。

新的STUN错误响应号

403(Forbidden):请求是有效的,但因管理或类似的规定而不能被执行。

437(Allocation Mismatch):服务器接收到请求,要求在适当的位置的allocation,但没有allocation存在,或者一个收到的请求不指定任何allocation,但是一个allocation存在。

441(Wrong Credentials):请求中的证书没有匹配那些用来创建allocation的证书。

442(不支持的传输协议):Allocate请求要求服务器使用一个用于服务器和对端的传输协议但是该服务器不支持该传输协议。

486(Allocation Quota Reached):目前没有更多的allocations资源使用相同的用户名可被创建。

508(Insufficient Capacity):服务器不能够完成请求因为一些性能限制已经达到上限。在一个Allocate响应中,这可能因为服务器此时已经没有更多的中继传输地址资源了,没有更多的被请求的性能,或者相当于特定的保留的token不可用。


SDPEDIT

会话描述协议Session Description Protocol (SDP) 是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等。所以在数据传输时两端都能够理解彼此的数据。本质上,这些描述内容的元数据并不是媒体流本身。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值