在真实的网络环境中,NAT(网络地址转换)技术随处可见,它是一种把内部私有网络地址(IP地址)转换为合法网络IP地址的技术。这种通过使用少量的公有IP地址代表较多的私有IP地址的方式,不仅在一定程度上能都有效解决IPv4地址短缺的问题,还能通过隐藏主机IP解决一定的安全问题。但是由于需要连接的个人设备大多数都隐藏在各自的内网当中,导致无法直接获取IP地址,无法直接进行P2P的音视频通信。
现在的NAT基本可以总结成4种类型:
- 完全锥型
- IP限制锥型
- 端口限制锥型
- 对称型
为了解决这个问题,实现 NAT 穿越的效果,WebRTC 采用了 ICE 技术框架。ICE 技术框架是参照 RFC5245 建议实现的,它由STUN 服务器、TURN服务器和相应的ICE搜集和连接状态组成,以更有效的方式来建立P2P会话。WebRTC 在ICE技术框架的采用下,客户端无需关心所处网络的位置以及 NAT 类型,即可动态发现最优的传输路径。下面主要介绍一下STUN服务器、TURN服务器以及ICE技的工作流程。
STUN服务器
STUN服务器基于STUN(Session Traversal Utilities for NAT)协议,它可以让位于NAT后的客户端判断出路由器采用的NAT类型,找出自己的公网地址。通过信令服务器将公网地址转发给对端,从而完成候选地址交换,实现P2P直连的效果。但是STUN服务器只能获取完全锥型、IP限制锥型和端口限制锥型NAT的后面的主机地址,并不能获取对称型NAT后面的主机地址,因此ICE技术架构中还需要使用 TURN服务器的支持。
TURN 服务器
TURN 服务器基于TURN(Traversal Using Relays around NAT)协议,用于协助完成STUN服务器无法完成的NAT穿越场景。具体的操作是两端客户端获取TURN服务器的地址,通过TURN服务器进行数据转发,完成间接的P2P直连效果。
ICE技术
ICE技术基于ICE(Interactive Connectivity Establishment)协议,该协议中一共有三种候选地址(优先级依次下降):
- 主机地址(客户端自身自主获取的地址,用于同一局域网进行连接)
- 反射地址(客户端通过STUN服务器获取的地址,即当前设备的外网地址,告知多端即可在外网直连)
- 中继地址(客户端通过TURN服务器获取的地址,后续用于数据中转)
ICE技术的工作流程简单来说就是客户端尽可能获取不同的候选地址,并使用指定的信令通道进行交换,然后根据候选地址的优先级进行连通性测试,最后选择连接效果最优的候选地址建立连接。(ICE技术框架如下图所示)