TURN技术浅析(上) | WebRTC编风网
0

TURN技术浅析(上)

已有 266 人阅读此文 - - H3C中文网站 - dora

一、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不可用。

1
相关文章!