WebRTC P2P技术之STUN、TURN、ICE

1.内容概述:

本文将简单介绍WebRTC P2P技术中的STUN、TURN、和ICE协议。首先需要了解的是NAT协议。

2.NAT

NAT是Net Address Translation的缩写,即网络地址转换。

家庭和办公网络环境大多是经过NAT路由中转的方式联网。这也意味着在家PC通过WIFI联网,在PC上通过命令行(ifconfig)查看到的IP地址(内网),跟通过baidu查看到的IP地址(公网),不一样,这也能证明PC处于NAT后面。

首先介绍一下NAT的分类以及NAT打洞原理。

NAT分类

完全锥形 Full Cone
在这里插入图片描述
内部机器A访问外网机器C,NAT打开一个端口,后面外网的任意ip和任意port都可以访问这个端口,也就是任意ip+任意port可以访问内网机器A。

缺点:安全性不好,因为可以被任意ip和端口访问

地址限制锥形 Address Restricted Cone
在这里插入图片描述
​ 内部机器A访问外网机器C,NAT打开一个端口,后面机器C的任意port可以访问这个端口,就是只能固定ip+任意port访问A

端口限制锥形 Port Restricted Cone
在这里插入图片描述
内部机器A访问外网机器C,NAT打开一个端口,后面机器C的固定port可以访问这个端口,就是只能固定ip+固定port访问A

对称型 Symmetric
在这里插入图片描述
​连接不同的外部Server,NAT打开的端口会变化。也就是内部机器A连接外网机器B时,NAT会打开一个端口,连接外网机器C时又会打开另外一个端口。

NAT穿越基本步骤

C1,C2向STUN发消息
C1C2向STUN发送消息,拿到各自的公网IP和端口

交换公网IP和端口
将C1的公网ip和端口发送给C2,C2的公网ip和端口发送给C1

C1->C2,C2->C1,甚至是端口猜测
C1C2就可以通信了,但是在对称型的场景下,甚至需要端口猜测

NAT穿越组合里,除了对称型与对称型无法打通以外,其余组合都可以打通

3.STUN

STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。

在新的RFC5389修订中把STUN协议定位于为穿透NAT提供工具,而不是一个完整的解决方案,英文全称是Session Traversal Utilities for NAT,即NAT会话穿透效用。RFC5389与RFC3489除了名称变化外,最大的区别是支持TCP穿透。
在这里插入图片描述

STUN主要有3个功能,分别是检测是否位于NAT后面,检测NAT的类型,获取经过NAT转换后的地址和端口。

客户端通过给公网的 STUN 服务器发送请求获得自己的公网地址信息,以及是否能够穿过路由器访问。

但是一些路由器严格地限定了部分私网设备的对外连接。这种情况下,即使 STUN 服务器识别了该私网设备的公网 IP 和端口的映射,依然无法和这个私网设备建立连接。这种情况下就需要转向 TURN 协议。

4.TURN

TURN协议是建立在UDP协议之上的一个应用层协议,首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的扩展。
在这里插入图片描述

一些路由器使用一种“对称型 NAT”的 NAT 模型。这意味着路由器只接受和对端先前建立的连接(就是下一次请求建立新的连接映射)。

NAT 的中继穿越方式 Traversal Using Relays around NAT (TURN) 通过 TURN 服务器中继所有数据的方式来绕过“对称型 NAT”。你需要在 TURN 服务器上创建一个连接,然后告诉所有对端设备发包到服务器上,TURN 服务器再把包转发给你。很显然这种方式是开销很大的,所以只有在没得选择的情况下采用。

5.ICE

综上所述,STUN的目的是为了进行P2P通信,通过提供反射地址(Server Reflexive Address)这种能力来使双方可以进行P2P通信,但是依赖NAT类型的不同,这种方式是有失败的概率的:比如双方都为对称型NAT或者一方为对称型,另一方为端口限制型。

因为有失败的可能性,所以单纯的依赖STUN协议提供的反射地址的话,需要事先探测出双方的NAT类型,假如发现是对称型的NAT,那么就不打洞了,而是直接中转。目前网络类型纷繁复杂,STUN协议在5389的时候去掉了NAT类型的判断的能力,因为越来越多的实践发现,在多层NAT下,类型的探测不总是有效的。而使用ICE的时候,不需要事先探测NAT类型。STUN还有一个作用是为ICE提供支持(对Binding的扩展)。

TURN协议的目的是为了保证通信双方百分之百能进行通信,就是在只知道反射地址而打洞失败的情况下的一种补充方案-----使用中继,使用中继方式百分之百能使得双方进行通信,只不过已经不是P2P的了,而且伴随而来的是转发效率的问题。不过这不要紧,因为该协议的目的就是保证双方肯定能通信,损失效率来保证了连同性。
在这里插入图片描述

ICE协议的目的就是综合以上两种方案,通过通信双方互相发探测包,找出一种最合理,最廉价的可行路径。

ICE首先探测内网地址,再探测STUN提供的反射地址,最后探测TURN协议的中继地址,反正最终目的就是探出一条路,内网地址不行用反射地址,反射地址不行,最后不得已情况下那就用中继地址。

猜你喜欢

转载自blog.csdn.net/wugebucuo/article/details/119656286