在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望处于不同内部网络中的两台主机能够直接进行通信,即所谓的P2P通信,避免通过其他公共服务器的中转的方式来降低实时通信的延迟。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal),而更多关于NAT的介绍我们在《WebRTC之NAT穿墙》已经做了简单的介绍。
如果对NAT穿透还不了解的话建议先温习一下。
而今天的主角是STUN、TURN和ICE,它们是实现NAT穿透的不同技术方案。
STUN
STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
在新的RFC5389修订中把STUN协议定位于为穿透NAT提供工具,而不是一个完整的解决方案,英文全称是Session Traversal Utilities for NAT,即NAT会话穿透。STUN在RFC5389与RFC3489中除了名称变化外,最大的区别是在新的定义中支持TCP穿透。
STUN是典型的客户端/服务器模式,客户端发起请求,服务端进行响应,默认端口是3478。
两种STUN规范:分别是和。
RFC3489通过UDP进行穿墙。目前的服务器对于UDP的限制比较多,导致这种模式穿墙的成功率不高。
RFC5389是在RFC3489的升级版,但是含义确是不一样的,一系列的穿墙攻击,纳入了TCP穿墙。
所有的STUN消息都包含20个字节(每个字节占8位,总共是160位)的消息头,其中2个字节(也就是16位)的消息类型,2个字节的消息长度,这个长度不包含消息头的长度还有16个字节的事务ID,请求与响应事务ID相同。
消息头之后就是是消息体,消息体可以是0或多个属性,每个属性进行TLV编码,包括16位的属性类型、16位的属性长度和变长属性值。
更加具体的消息交互协议笔者目前还不打算深入研究,因为目前我的目的是为了学习并使用WebRTC,还没到达弄清楚WebRTC的每一个细节点的高深境界。
四种主要NAT类型中有三种是可以使用STUN进行穿透:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT,对称型NAT则不能使用。
那么对称型NAT如何实现P2P通信呢TURN协议
上面说到对称型NAT无法使用STUN成功进行穿透,这时候就需要TURN出场了。
TURN协议的目的就是为了解决对称型NAT无法穿越的问题。
TURN(Traversal Using Relay NAT,通过Relay方式穿越NAT),是一种数据传输协议。允许通过TCP或UDP方式穿透NAT。TURN也是一个Client/Server协议,也和STUN使用同样的消息格式。
但实现TURN client的终端必须在通讯开始前与TURN server进行交互,并要求TURN server产生"relay port",也就是中继转发地址。这时TURN server会建立peer,即远端端点(remote endpoints),开始进行中继(relay)的动作,TURN client利用relay port将数据传送至peer,再由peer转传到另一方的TURN client。
说白了笔者觉得TURN协议更像一个中继转发协议,并不是真正意义上的P2P通信(不知道笔者这样的理解对不对)
ICE
ICE(Interactive Connectivity Establishment,互动式连接建立)。ICE定义了穿越方法而不是协议。
既然我们NAT穿透可以使用STUN也可以使用TURN,那么什么时候使用STUN什么时候使用TURN呢?这就是ICE做的事情。
更通俗地讲ICE更像一个NAT穿透的管理者,使用者只需要告诉ICE我要穿墙即可,至于怎么穿墙那就是ICE的事情了。
ICE整合了STUN与TURN。ICE使得两个NAT后的端点通信更加便捷。ICE使用STUN进行打洞,若失败,则使用TURN进行中转。
下面说说ICE的主要工作:
1、收集候选地址也就是收集Candidate
所谓的Candidate就是一个由IP和端口组成的地址。而Candidate又有三种类型:
2、对Candidate Pair进行排序
ICE收集到了候选者地址后,两个对等端都拥有了若干自己和对方的候选地址,并将其配对,组成Candidate Pair。
每对Candidate Pair都有对应的优先级,ICE需要对每对Candidate Pair进行优先级的排序。
3、对候选地址进行连通性检测
ICE对排序好的Candidate Pair进行发送检测和接收检测,发送和检测是同时进行的,如果发送消息出去之后还能收回和发送出去一样的信息则说明连通性是通的
参考资料
《P2P技术详解(四):P2P技术之STUN、TURN、ICE详解》
关注我,一起进步,人生不止coding!!!
领取专属 10元无门槛券
私享最新 技术干货