Page 295 - Web性能权威指南
P. 295

18.4.3 交互连接建立(ICE)
                 按照规范,为建立端到端的连接,两端必须之间必须能收发数据包。说起来很简单,
                 但由于端与端之间往往有很多层防火墙和 NAT 设备阻隔(参见 3.2 节“UDP 与网
                 络地址转换器”),真正实现起来并不容易。

                 首先,我们先看一看最简单的情况,即两端位于同一个内部网中,而且它们之间不
                 存在防火墙或 NAT 设备。此时,要建立连接,两端只要查询操作系统获知 IP 地址
                (如果有多块网卡,就需要多个 IP 地址),将 IP 地址加端口号追加到生成的 SDP 字
                 符串中,再把 SDP 转发给另一端即可。SDP 交换一完成,两端就可以发起直接的端
                 到端连接。


                            前面那个 SDP 示例展示的就是刚才提到的情况:其中 a=candidate 那一行
                            列出的就是一个私有 IP 地址(192.168.x.x),供相应端发起会话(参见 3.2
                            节中的“保留的私有网络地址范围”)。


                 目前来看没什么问题。可是,如果其中一端或者干脆两端分别位于明显不同的私有
                 网络中又会怎么样呢?当然还是重复前述工作流,找到并把每一端的 IP 地址嵌入
                 SDP,但端到端的连接很明显无法连接成功!我们需要的是一条连接两端的公共路
                 由线路。好在,WebRTC 框架可以代替我们处理大部分复杂工作:

                 •   每个 RTCPeerConnection 连接对象都包含一个“ICE 代理”;
                 •   ICE 代理负责收集 IP 地址和端口(candidate);
                 •   ICE 代理负责执行两端的连接检查;
                 •   ICE 代理负责发送连接持久化信息。


                 设置好会话描述后(无论本地还是远程),本地 ICE 代理会自动开始发现本地端所
                 有可能的候选 IP 和端口的进程:

                 (1) ICE 代理向操作系统查询本地 IP 地址;
                 (2) 如果有配置,ICE 代理会查询外部 STUN 服务器,以取得本地端的公共 IP 和端
                    口号;
                 (3) 如果有配置,ICE 代理会将 TURN 服务器追加为最后一个候选项;假如端到端的
                    连接失败,数据将通过指定的中间设备转发。


                            如果有人问过你:“我的公共 IP 地址是多少?”你作了回答,那你实际
                            上就完成了一次手工的“STUN 查找”。STUN 协议允许浏览器了解自己
                            是否位于一个 NAT 后面,并发现自己的公共 IP 和端口(参见 3.2.3 节
                           “STUN、TURN 与 ICE”)。

                                                                              WebRTC   |   285
   290   291   292   293   294   295   296   297   298   299   300