背景
WebRTC中PeerConnect的第一步是建立连接,而互联网中的用户大多隐藏在各种防火墙之下,属于局域网或者明面上是广域网但实际还是大型局域网的范畴内(如中国移动宽带用户)。这时候就需要一种技术帮我们获悉真实的网络地址从而建立连接。
简介
NAT (Network Address Translation,网络地址转换)由于当前使用的IPV4地址的长度限制只有32位,大多数终端都没有一个可以在互联网上可见的唯一IPV4地址。NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案,在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址。
STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间创建UDP通信。
TURN(Traversal Using Relays around NAT,中继型NAT遍历服务),是一种数据传输协议(data-transfer protocol),用于转发数据包给对端浏览器,当2个对等端因为NAT类型而无法建立连接时(当遇到对称型NAT会导致打洞失败)。允许在TCP或UDP的连在线跨越NAT或防火墙。注(https://tools.ietf.org/html/rfc5766)
简单的说,TURN与STUN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。
图解
简介
ICE(Interactive Connectivity Establishment
**,互动式连接建立),由 IETF 的 MMUSIC 工作组开发出来的,它所提供的是一种框架,使各种 NAT 穿透技术可以实现统一。ICE 跟 STUN 和 TURN 不一样,ICE 不是一种协议,而是一个框架(Framework),它整合了 STUN 和 TURN。
如上图所示,如果A想与B通信,那么其过程如下:
- A收集所有的IP地址,并找出其中可以从STUN服务器和TURN服务器收到流量的地址;
- A向STUN服务器发送一份地址列表,然后按照排序的地址列表向B发送启动信息,目的是实现节点间的通信;
- B向启动信息中的每一个地址发送一条STUN请求;
- A将第一条接收到的STUN请求的回复信息发送给B;
- B接到STUN回复后,从中找出那些可在A和B之间实现通信的地址;
- 利用列表中的排序列最高的地址进一步的设备间通信。
由于该技术是建立在多种NAT穿透协议的基础之上,并且提供了一个统一的框架,所以ICE具备了所有这些技术的优点,同时还避免了任何单个协议可能存在的缺陷。因此,ICE可以实现在未知网络拓扑结构中实现的设备互连,而且不需要进行对手配置。另外,由于该技术不需要为VoIP流量手动打开防火墙,所以也不会产生潜在的安全隐患。