7┃音视频直播系统之 WebRTC 中的连接的创建、STUN/TURN 以及 NAT 穿越
作者:互联网
一、Candidate
-
即 ICE Candidate(ICE 候选者)。表示 WebRTC 与远端通信时使用的协议、IP 地址和端口
-
一般组成包括: 本地 IP 地址、本地端口号、候选者类型,包括 host、srflx 和 relay、优先级、传输协议等等
-
当 WebRTC 通信双方彼此要进行连接时,每一端都会提供许多候选者,比如你的主机有多块网卡,那么每块网卡的不同端口都是一个候选者
-
WebRTC 会按照上面描述的格式对候选者进行排序,然后按优先级从高到低的顺序进行连通性测试,当连通性测试成功后,通信的双方就建立起了连接
-
在WebRTC 中,它首先会尝试 NAT 穿越,即尝试端到端直连。如果能够穿越成功,那双方就通过直连的方式传输数据,这是最高效的。但如果 NAT 穿越失败,为了保障通信双方的连通性,WebRTC 会使用中继方式,当然使用这种方式传输效率会低一些
-
在众多候选者中,host 类型的候选者优先级是最高的。在 WebRTC 中,首先对 host 类型的候选者进行连通性检测,如果它们之间可以互通,则直接建立连接。其实,host 类型之间的连通性检测就是内网之间的连通性检测。WebRTC 就是通过这种方式巧妙地解决了大家认为很困难的问题
-
同样的道理,如果 host 类型候选者之间无法建立连接,那么 WebRTC 则会尝试次优先级的候选者,即 srflx 类型的候选者。也就是尝试让通信双方直接通过 P2P 进行连接,如果连接成功就使用 P2P 传输数据;如果失败,就最后尝试使用 relay 方式建立连接
-
如果用代码结构表示,大概可以是如下:
-
host:表示本机候选者
-
srflx:表示内网主机映射的外网的地址和端口
-
relay:表示中继候选者
{
IP: 127.0.0.1,
port: 3333,
type: host/srflx/relay,
priority: number,
protocol: UDP/TCP,
usernameFragment: string
}
二、STUN 协议
-
如果主机没有公网地址,是无论如何都无法访问公网上的资源的
-
而一般情况下,主机都只有内网 IP 和端口,那它是如何访问外网资源的呢
-
在内网的网关上都有 NAT (Net Address Transport) 功能
-
NAT 的作用就是进行内外网的地址转换
-
这样当你要访问公网上的资源时,NAT 首先会将该主机的内网地址转换成外网地址,然后才会将请求发送给要访问的服务器;服务器处理好后将结果返回给主机的公网地址和端口,再通过 NAT 最终中转给内网的主机
-
而想让内网主机获得它的外网 IP 地址,就只需要在公网上架设一台服务器,并向这台服务器发个请求即可获得,也就是 STUN 协议,我们只要遵守这个协议就可以拿到自己的公网 IP 了
三、TURN 协议
-
我们经常说的 relay 服务器或 TURN 服务器它们是同一个意思,都是指中继服务器
-
而relay 服务是通过 TURN 协议实现的
-
relay 型候选者的优先级与其他类型相比是最低的,但在其他候选者都无法连通的情况下,relay 候选者就成了最好的选择。因为它的连通率是所有候选者中连通率最高的
四、NAT 打洞 /P2P 穿越
-
NAT解决的问题: IPv4 地址不够用的、安全问题
-
当收集到 Candidate 后,WebRTC 就开始按优先级顺序进行连通性检测了。它首先会判断两台主机是否处于同一个局域网内,如果双方确实是在同一局域网内,那么就直接在它们之间建立一条连接
-
但如果两台主机不在同一个内网,WebRTC 将尝试NAT 打洞,即 P2P 穿越。在 WebRTC中,NAT 打洞是极其复杂的过程,它首先需要对 NAT 类型做判断,检测出其类型后,才能判断出是否可以打洞成功,只有存在打洞成功的可能性时才会真正尝试打洞
-
WebRTC 将 NAT 分类为 4 种类型:完全锥型 NAT、IP 限制型 NAT、端口限制型 NAT、对称型 NAT
五、ICE
-
ICE 就是包括了 STUN、TURN 协议的一套框架
-
其实 ICE 就是上面所讲的获取各种类型 Candidate 的过程
-
就是:在本机收集所有的 host 类型的 Candidate,通过 STUN协议收集 srflx 类型的 Candidate,使用 TURN 协议收集 relay 类型的 Candidate
六、完全锥型 NAT
-
完全锥型 NAT 的特点是,当 host 主机通过 NAT 访问外网的 B 主机时,就会在 NAT 上打个“洞”,所有知道这个“洞”的主机都可以通过它与内网主机上的侦听程序通信
-
所谓的“打洞”就是在 NAT 上建立一个内外网的映射表,并且一般会使用UDP 是无连接协议,也就是说只要你发送数据给它,它就能收到
七、IP 限制锥型 NAT
-
IP 限制锥型要比完全锥型 NAT 严格得多
-
它主要的特点是,host 主机在 NAT 上“打洞”后,NAT 会对穿越洞口的 IP 地址做限制
-
只有指定的 IP 地址才可以通过,也就是说,只有 host 主机访问过的外网主机才能穿越 NAT
八、端口限制锥型
-
端口限制锥型比 IP 限制锥型 NAT 更加严格
-
它主要的特点是,在 NAT 上对打洞时对IP 地址做了限制,还对具体的端口做了限制
九、对称型 NAT
-
对称型 NAT 是所有 NAT 类型中最严格的一种类型
-
对称型 NAT 对每个连接都使用不同的端口,甚至更换 IP 地址,会建立多个内外网的映射表
标签:候选者,IP,音视频,TURN,host,NAT,主机,WebRTC 来源: https://www.cnblogs.com/autofelix/p/16276569.html