NAT 简介
咱们晓得,WebRTC 会依照内网、P2P、直达的程序来尝试连贯。在大部分的状况下,理论是应用 P2P 或者直达的。这里 P2P 的场景次要应用的技术就是 NAT 穿透。
咱们先简略理解下 NAT。NAT 在实在网络中是常见的,它的呈现一是为了解决 ipv4 地址不够用的问题,二是为了网络安全思考的。
- 首先,让同一个内网中的多台主机共用一个公网 ip,能够大大缓解 ipv4 向 ipv6 适度期间,ipv4 地址不够用的问题。
- 另外,NAT 将主机暗藏在内网中,也就使得黑客想拜访起来并没有那么容易了。
NAT 的标准在 RFC 3022 中定义,其次要作用就是做网络地址转换。NAT 设施(路由器)会在内网地址和外网地址之间建设起映射关系。当内网主机向外网主机发送信息时,NAT 会将内网地址替换为映射的外网地址。绝对应的,当外网主机向内网主机产生信息时,NAT 会将外网地址替换为映射的内网地址。
因为 NAT 设施的存在,外网主机通常无奈间接与内网主机通信。所以在建设 P2P 连贯之前,须要做的就是 NAT 穿透,也就是俗称的“打洞”。
NAT 类型
RFC3489 和 RFC5389 是对于 NAT 穿透的协定,其中 RFC3489 中把 NAT 分成了 4 个类型。它们对 NAT 穿透的限度呈递进趋势。
齐全锥型
- 齐全锥型 NAT 的标准是,只有内网主机 A 通过端口 p1 收回数据包,在 NAT 上生成了相应的映射表(这个表就是所谓的“洞”)。接管数据包的外网主机能从这个数据包的报文中失去这个映射关系。它能够将这个映射关系通知其余外网主机,这样任意外网主机发送到这个 NAT 上端口 p1 的数据包就都会被转发到内网主机 A 上。
- 齐全锥型 NAT 的特点就是只有“打洞”胜利,所有晓得这个“洞”的主机都能通过它和内网主机进行通信。
IP 限度锥型
- IP 限度锥型 NAT 的标准相比于齐全锥型 NAT,限度了外网来的 IP。也就是说,只有从内网主机发送数据包的目标 IP,发送到这个 NAT 上端口 p1 的数据包才会被转发到内网主机 A 上。
- IP 限度锥型 NAT 的特点就是“打洞胜利”后,只有胜利“打洞”的外网主机能力通过这个“洞”和内网主机进行通信。其余外网主机即便晓得这个“洞”,发来的数据包也回被 NAT 抛弃。
端口限度锥型
- 端口限度锥型 NAT 的标准相比于 IP 限度锥型 NAT,除了限度外网来的 IP,还要限度端口。也就是说只有从内网主机发送数据包的目标 IP 和端口,发送到这个 NAT 上端口 p1 的数据包才会被转发到内网主机 A 上。
- 端口限度锥型 NAT 的特点就是,除了限度了“洞”的外网 ip,还限度了“洞”的外网端口。
对称型
- 对称型 NAT 的标准相比于端口限度锥型 NAT,还减少了一条规定。从内网主机 A 上发到不同的外网主机的数据包通过 NAT 时,NAT 都会为之调配不同的外网端口。
- 对称型 NAT 的特点就是,内网主机每次发送数据包给不同的外网主机时,都会产生一个新的“洞”。
NAT 类型检测
要进行 NAT 穿透,内网主机首先要晓得本人连贯的 NAT 的类型。在 RFC3489 中给出了规范的检测流程。这个过程须要 2 台领有 2 个网卡的 STUN 服务器。具体流程如下图所示。
- 主机向 1 号服务器的某个 IP 和端口发送一条申请,如果超过超时工夫没有收到响应,则阐明主机与服务器之间UDP 不通。
- 如果收到服务端的响应,则比照本地 IP 和接管到的响应包中的主机的公网 IP。如果这两个 IP 统一,则阐明主机在公网上,没有 NAT 防护。如果不统一,则须要进一步的 NAT 类型检测,稍后详述。
- 接下来,主机再次向 1 号服务器雷同的 IP 和端口发送一条申请,1 号服务器在收到申请后,会应用第二个网卡返回响应。如果主机收到了这个响应,则阐明它在一个 凋谢的网络 上,是一台公网主机。如果主机没有收到这个响应,则阐明它在 对称型防火墙(能够认为与对称型 NAT 相似)前面。
- 回到下面进一步的 NAT 类型检测流程。主机也是向 1 号服务器雷同的 IP 和端口发送一条申请,1 号服务器也会应用第二个网卡返回响应。如果主机收到了这个响应,则阐明它在 齐全锥型 NAT前面。
- 如果主机没有收到这个响应,则向 2 号服务器发送一条申请。主机收到 2 号服务器的响应后,比照 1 号服务器返回的响应包中的主机的公网 IP 和 2 号服务器返回的响应包中的主机的公网 IP,如果不统一,则阐明它在一个 对称型 NAT的前面。如果统一,则须要进一步的检测。
- 主机再次向 1 号服务器发送一条申请,1 号服务器应用雷同的 IP(即接管申请的 IP)和不同的端口返回响应。如果主机收到了这个响应,则阐明它在 IP 限制型 NAT 前面,如果主机没有收到这个响应,则阐明它在 端口限制型 NAT前面。
NAT 穿透流程
在确认完主机所在网络中的 NAT 类型后,就能够判断是否能进行 NAT 穿透,以及确认 NAT 穿透的办法。
一般而言,齐全锥型 NAT 以及 IP 限制型 NAT 能够与任何其余类型的 NAT 互通;两边都是端口限制型 NAT 的也能够互通;一边是端口限制型 NAT,另一边是对称型 NAT,或者两边都是对称型 NAT 的状况下想实现穿透很难,所以这种状况个别会通过 TRUN 协定进行数据直达。
在 WebRTC 中通信的单方通过 ICE 替换了下面获取到的一些网络信息,之后就能够尝试 NAT 穿透,建设 P2P 连贯了。
假如须要建设 P2P 通信的单方为主机 A 和主机 B。
- 如果主机 A 在齐全锥型 NAT 或者 IP 限制型 NAT 后,只有主机先往主机 B 发送一个数据,就会在该 NAT 上留下“洞”,即便发送的数据被对方的 NAT 抛弃。后续主机 B 发往主机 A 的数据也能通过主机 A 这边的 NAT 上的“洞”实现穿透了。总的来说,这种状况下,只有单方不停的发送数据包,且没有某一方的数据包被全副抛弃,就能胜利穿透。
- 如果主机 A 在端口限制型 NAT 后,而主机 B 也在端口限制型 NAT 后,只有单方相互发送数据包则和后面状况一样,能够利用 NAT 上的“洞”来穿透。
- 主机 A 在端口限制型 NAT 后,主机 B 在对称型 NAT 后,或者两边都在对称型 NAT 后,就只能通过服务器直达来通信了。服务器直达的 TURN 协定在 RFC5766 中进行了具体的标准。