WebRTC建立网络连接的过程称为ICE(Interactive Connectivity Establishment,互动式连接建立),具体过程为:收集Candidate、交换Candidate、按优先级尝试连接。
Candidate指可连接的候选者。每个候选者是包含address(IP地址)、port(端口号)、protocol(传输协议)、CandidateType(Candidate类型)、ufrag(用户名)等内容的信息集。WebRTC将Candidate分为host、srflx、prflx和relay四类,优先级依次由高到低。
5.1 ICE过程
5.1.1 收集Candidate
1)host类型的Candidate根据主机的网卡个数来决定,一般一个网卡对应一个IP地址,给每个IP地址随机分配一个端口从而生成一个host类型的Candidate。
2)srflx类型的Candidate通过STUN服务器获得的IP地址和端口号生成。
3)relay类型的Candidate通过TURN服务器获得的IP地址和端口号生成。
5.1.2 交换Candidate
WebRTC收集好Candidate后通过信令系统将它们发送给对端,对端接收后会与本地的Candidate形成CandidatePair(连接候选者对,即一个本地Candidate,一个远端Candidate)。Candidate的交换不是等所有Candidate收集好后才进行,而是边收集边交换。
5.1.3 尝试连接
WebRTC形成CandidatePair后开始尝试连接,一旦连接成功不再进行尝试,但发现新的Candidate仍然继续交换。
WebRTC的ICE机制会选择最好的链路传输音视频数据,即如果通信双方在同一网段,则优先使用内网链路;如果通信双方不在同一网段,则优先使用P2P;如果上述方式都无法连通,则使用relay服务进行中转。
ICE的连通率几乎可以达到100%。在内网和P2P无法连通的情况下,还可以通过中继方式连通,从而大大提高了WebRTC的连通率。
WebRTC中的ICE既考虑了数据传输的效率,又考虑了网络的连通率,实现起来还很简单。
5.2 NAT
NAT(Network Address Translation,网络地址交换)主要解决IPv4地址不够用和安全问题。通过多台主机共用一个公网IP地址来减缓IPv4地址不够用的问题。使用NAT后,主机隐藏在内网,这样黑客很难访问到内网主机,从而达到保护内网主机的目的。
NAT其实就是一种地址映射技术,它在内网地址与外网地址之间建立了映射关系。
在RFC3489协议中,将NAT分为完全锥型、IP限制锥型、端口限制锥型和对称型四种。
5.2.1 完全锥型NAT
NAT打洞成功后,所有知道该洞的主机都可以通过它与内网主机进行通信。这里的"洞"指的是在NAT上建立了一个内外网的映射表,包括内网IP、内网端口、映射的外网IP以及映射的外网端口。
5.2.2 IP限制锥型NAT
NAT打洞成功后,只有与之打洞成功的外网主机才能通过该洞与内网主机通信,其他外网主机即使知道洞也不能与之通信。
当外网主机通过IP限制锥型NAT向内网主机发送消息时,NAT会检测数据包头中的源IP地址是否在NAT映射表中有记录,只有登记过的外网IP地址才可以通过NAT。
IP限制锥型NAT的打洞映射表包括内网IP、内网端口、映射的外网IP、映射的外网端口以及被访问主机的IP列表。
5.2.3 端口限制锥型NAT
除了像IP限制锥型NAT一样对IP地址进行检测外,还要对端口进行检测。
端口限制锥型NAT的打洞映射表包括内网IP、内网端口、映射的外网IP、映射的外网端口以及被访问主机的IP和端口的组合列表。
5.2.4 对称型NAT
内网主机每次访问不同的外网主机时,都会生成一个新洞。对称型NAT映射表中映射的外网IP地址和外网端口会随着访问目的主机不同而变化。
对称型NAT的打洞映射表包括内网IP、内网端口、映射的外网IP、映射的外网端口、被访问主机的IP和被访问主机的端口。
5.2.5 NAT类型检测
图中虚线左半部分用来判断内网主机是否有NAT防护,右半部分用来探测主机在哪种NAT类型之后。
内网主机进行NAT类型检测时,需要用到两台STUN服务器,每台STUN服务器需要两块网卡,每块网卡需要配置公网IP地址。
5.2.6 NAT穿越
1)各NAT之间可穿越表
2)IP限制型NAT与对称型NAT如何互通
① X主机与S服务器通信,交换外网IP、端口等信息,X主机创建NAT映射表。
② A主机与S服务器通信,交换外网IP、端口等信息,A主机创建NAT映射表。
③ X主机向A主机发送数据,X主机在NAT映射表中增加A主机的IP地址,数据未穿越被A主机的NAT丢弃。
④ A主机向X主机发送数据,A主机在NAT映射表中创建与X主机相关的映射表,数据可以穿越NAT到达X主机。
5.3 网络中继
当NAT之间无法打通时,WebRTC使用TURN协议通过中转的方式实现端与端之间的通信。
5.3.1 TURN协议中转数据
TURN协议采用了客户端/服务器模式,其服务器称为TurnServer,客户端称为TurnClient。
① 主机X(TurnClient)向TurnServer的3478端口发送Allocate指令,TurnServer收到该消息后,在TURN服务端分配一个与TurnClient相对应的relay地址,任何发向relay地址的数据都会被转发到TurnClient端。
② 主机A和主机B称为Peer端,可以使用UDP向TurnServer的relay地址发送数据,TurnServer根据映射关系将relay地址收到的数据转给对应的TurnClient,实现TurnClient与Peer之间的互通。
5.3.2 WebRTC如何使用TURN协议
主机A和主机B都是TurnClient,可以通过TURN协议与TurnServer建立联系;它们也是彼此的Peer端,可以向对端的relay地址发送数据,从而让TurnServer将数据中转给对端。