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

TURN技术浅析(下)

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

协议交互过程详细举例

4286-tmp

以图上为例进行讲解,每个消息中,多个属性包含在消息中并显示它们的值。为了方便阅读,值以人们可读的格式来显示。

1

客户端使用10.1.1.2:49271作为传输地址向服务器的传输地址发送Allocate请求。客户端随机选择一个96位的事务ID。该Allocate请求消息包括SOFTWARE属性来提供客户端的软件版本信息;包括LIFETIME属性,指明客户端希望该allocation具有1小时的生命期而非缺省的10分钟;包括REQUESTED-TRANSPORT属性来告诉服务器与对端之间采用UDP协议来传输;包括DONT-FRAGMENT属性因为客户端希望在随后的Send indications中使用DON’T-FRAGMENT属性。

服务器需要任何请求必须是经过认证的,因此服务器拒绝了该最初的Allocation请求,并且回应了携带有错误响应号为401(未授权)的Allocate错误响应;该响应包括一个REALM属性,指明认证的域;还包括一个NONCE属性和一个SOFTWARE属性。

客户端收到了错误响应号为401的Allocate错误响应,将重新尝试发送Allocate请求,此时将包括认证属性。客户端在新的请求中重新选择一个新的事务ID。客户端包括一个USERNAME属性,使用从服务器那收到的realm值来帮助它决定使用哪个值;请求还包括REALM和NONCE属性,这两个属性是从收到的错误响应中拷贝出来的。最后,客户端包括一个MESSAGE-INTEGRITY属性。

服务器收到认证的Allocate请求后,检查每个属性是否正确;然后,产生一个allocation,并给客户端回应Allocate成功响应。服务器在该成功响应中携带一个LIFETIME属性,本例中服务器将客户端请求的1小时生命期减小为20分钟,这是因为这个特定的服务器可能不允许超过20分钟的生命期;该响应包括XOR-RELAYED-ADDRESS属性,值为该allocation的中继传输地址;该响应还包括XOR-MAPPED-ADDRESS属性,值为客户端的server-reflexive地址;该响应也包含一个SOFTWARE属性;最后,包括一个MESSAGE-INTEGRITY属性来证明该响应,确保它的完整性;

2

接着,客户端为了准备向对端A发送一些应用数据而创建一个permission。这里通过一个CreatePermission请求来做到。该请求携带XOR-PEER-ADDRESS属性包含有确定的请求的IP地址,这里为对端A的地址;需要注意的是,属性中地址的端口号被设置为0在CreatePermission请求中,并且客户端使用的是对端A的server-reflexive地址而不是它的主机地址(私网地址);客户端在该请求中携带与之前的Allocate请求中一样的username、realm和nonce值,因此该请求被服务器认可。此时在该请求中,客户端没有携带SOFTWARE属性。

服务器收到该CreatePermission请求,产生一个相应的许可,并以CreatePermission成功响应来回应。该响应中只包含了Transaction-ID和MESSAGE-INTEGRITY属性。

3

现在客户端使用Send indication来发送应用数据到对端A。对端的server-reflexive传输地址包含在XOR-PEER-ADDRESS属性中,应用数据包含在DATA属性中。客户端已经在应用层上执行了路径MTU发现功能,因此通过DON’T-FRAGMENT属性来告知服务器当通过UDP方式来向对端发送数据时应设置DF位。Indications不能使用长期证书机制来认证,所以该消息中没有MESSAGE-INTEGRITY属性。

服务器收到Send indication后,提取出应用数据封装成UDP格式发给对端A;UDP报文的源传输地址为中继传输地址,并设置DF位。

对端A回应它自己的包含有应用数据的UDP包给服务器。目的地址为服务器的中继传输地址。当服务器收到后,将生成Data indication消息给客户端,携带有XOR-PEER-ADDRESS属性。应用数据包含在DATA属性中。

4

客户端现在若要绑定一个通道到对端B,将指定一个空闲的通道号(本例中为0x4000)包含在CHANNEL-NUMBER属性中,对端B的传输地址包含在XOR-PEER-ADDRESS属性中。与以前一样,客户端再次利用上次请求中的username、realm和nonce。

当服务器收到该请求后,服务器绑定这个对端的通道号,为对端B的IP地址安装一个permission,然后给客户端回应一个ChannelBind成功响应消息。

5

客户端现在发送一个ChannelData消息给服务器,携带有发送给对端B的数据。这个消息不是一个STUN消息,因此没有事务ID。它之有3个字段:通道号、数据、数据长度;服务器收到后,检查通道号后发现当前已经绑定了,就以UDP方式发送数据给对端B。

接着,对端B发送UDP数据包回应给服务器的中继传输地址。服务器收到后,回应给客户端ChannelData消息,包含UDP数据包中的数据。服务器知道是给哪个客户端发送ChannelData消息,这是因为收到的UDP数据包中的目的地址(即服务器的中继传输地址),并且知道使用的是哪个通道号,这是因为通道已经与相应的传输地址绑定了。

6

有时候,20分钟的生命期已经到了,客户端需要刷新allocation。此时通过发送Refresh请求来进行。该请求包含最后一次使用的usernamerealmnonce,还包含SOFTWARE属性。当服务器收到这个Refresh请求时,它注意到这个nonce值已经超期了,则给客户端回应一个错误响应号为438(过期Nonce)的Refresh错误响应,并提供一个新的nonce值。可护端将重试该请求,此时携带新的nonce值。若第二次尝试被接受,服务器将回应一个成功响应。需要注意的是,此时客户端在请求中没有携带LIFETIME属性,所以服务器刷新客户端的allocation时采用缺省的10分钟生命期。

 

0
相关文章!