Day08 NAT 穿透 ICE、STUN、TURN

ICE

ICE(Interactive Connectivity Establishment,互动式连接建立)是用於 Offer/Answer 模式下的 NAT 穿越的技术,主要用於在UDP协议下建立多媒体会话。在实际的网路当中,有很多原因会导致简单的从 A 端到 B 端直连不能如愿完成。这需要绕过阻止建立连接的防火墙,给你的设备分配一个唯一可见的地址,如果路由器不允许主机直连,还得通过一台服务器转发数据。ICE 通过使用 STUN、TURN、NAT、SDP 技术完成上述工作。

ICE 建立连线的过程

ICE 建立连线的过程:

  1. 使用内网 IP 位置,如果双方都在同一个内网中,就会成功建立连线
  2. 如果使用内网失败,ICE 将使用 STUN 取得 NAT 的外网 IP 位置及 port,并尝试使用外网 IP 位置建立连线,两端都是非对称型 NAT 的情况下通常都可以成功连线
  3. 如果使用 STUN 还是无法成功连线,那就代表两端无法直接进行 P2P 的连线,那就需要使用TURN 来对讯号进行转传。

ICE 在所有的候选地址中,选择开销最小的路由。

STUN

https://ithelp.ithome.com.tw/upload/images/20210922/201300621vcmqsLcpw.png

当我们的客户端位於 NAT 的内网中虽然可以与外网连线,但我们并不知道外网的 IP 位置,这个时候就需要通过 STUN 来取得外网 IP 位置。

STUN(Session Traversal Utilities for NAT,NAT 对谈穿越应用程序)是一种网路协定,它允许位於NAT(或多重NAT)後的客户端找出自己的公网位址,查出自己位於哪种类型的NAT之後以及NAT为某一个本地埠所系结的Internet端埠。这些资讯被用来在两个同时处於NAT路由器之後的主机之间建立UDP通信。该协定由RFC 5389定义。

STUN 的 NAT 类型检查流程

  • 红色无法连线
  • 黄色可以连线

https://ithelp.ithome.com.tw/upload/images/20210922/20130062RD80UU31GP.png

TURN

https://ithelp.ithome.com.tw/upload/images/20210922/20130062JMy7KwqmQl.png

从上一篇的 NAT 分类,以及上面对 STUN 的理解,我们知道在 Symmetric NAT 的网路环境中,是无法使用点对点 (Peer-to-Peer; P2P) 的方式来穿透 NAT,在这种情况下我们就需要 TURN(Traversal Using Relay NAT)来转发封包。

不过这种方式虽然可以穿透防火墙,但却没有了原先 P2P 的优势,而是变成了 Client-Server 的模式,因此 TURN Server 必须满足非常高的频宽要求,尤其是在多个并行连线的情况下。因此,使用 TURN Server 的成本很高,只有在没有其他传输选项时才会选择这个解决方案。

总结

本篇了解 ICE、STUN、TURN 的基本运作,ICE 实际运作更复杂,不过我们先理解这些就可以了,我们也不需要自己去实现一个 ICE server,後面实作会使用开源的框架 。

参考资料

https://zh.wikipedia.org/wiki/STUN

https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Protocols

http://www.cs.nccu.edu.tw/~lien/Writing/NGN/firewall.htm


<<:  【从零开始的Swift开发心路历程-Day10】简单介绍UITableView

>>:  Day8 Html常用标签_3

[从0到1] C#小乳牛 练成基础程序逻辑 Day 11 - Flow Chart ○♢▭ 五种流程图案 线上绘制工具

五种流程图案○♢▭ | 线上绘制工具 | draw.io 🐄点此填写今日份随堂测验 ...

Day22 - 前处理: 资料平衡&Label 调整

在 Day20 介绍资料集时有提到过五类情绪有资料不平衡的问题,为了处理资料不平衡的问题,我们会在 ...

使用 Golang Driver 开发 Neo4j 应用程序

#前面已经分享过以 HTTP API 或 JavaScript driver 开发 Neo4j 前端...

[Day 20] Mattermost - 自签凭证绑定 Docker版

自签凭证绑定 Docker版 当有需求要Mattermost绑定自签凭证时怎麽办?我们的Matter...

Powershell 入门之逻辑判断(下)

今天我们来看一下 powershell 中的另一种逻辑判断 switch. switch 语法: s...