WebRTC源码研究(28)ICE 框架

WebRTC源码研究(28)ICE 框架

1. ICE 框架简介

什么是ICE呢?

其实下面的这张图就表达的非常清楚 ,我们来看一下,
ICE 框架简介

第一个是双方通信的Peer 有两台机子A和B ,他们都是在NAT之后 ,这里有两个NAT,在NAT外面有两个STUN 服务,其实也可以用一个STUN服务,它们主要用于这个其中的这个一个终端去穿越NAT时候进行NAT穿越使用的。所以在这里会形成一个这个映射后的公网的IP地址。所以这两个可以是两个,也可以是一个,甚至可以是多个,那么还有一个呢,就是relay server,这个Relay server的实际大多数情况下也具有STUN Server的功能,所以在这里呢,有可能这三个是合成一个的。那他也可以获取到这个NAT映射后的这个公网IP,但同时呢,它还有这个中继的功能。那最后一个呢,是这个网络,整个这个信令是通过这个云端然后进行交互的,这就是它整个这张图包含了一些元素。

那我们就来看看这ICE是如何进行工作并且使这个两个终端最终进行这个媒体流的通讯的:
首先我们看左边,实际这个ICE干的第一件事儿是什么呢?就是让这个终端去得到所有能够连接到这个终端B的通路。那这个终端都有哪些通路呢?他首先他本机实际是有网卡的。这个本机的网卡就绑定了一个IP,那这个IP,实际就是有可能是一条通路了,因为如果他是在同一个局域网内,那么这俩就直接通过这个本地的IP地址就可以进行通讯。所以这是本机的这个IP地址,这是一条通路。

那么第二条通路呢,就是穿越NAT

当这个终端首先访问这个STUN服务,通过STUN服务能获取到NAT映射的这个映射后的地址。它把这个地址去传给另外一个公关,那么这个终端拿到这个地址,并且把它穿越NAT就是向STUN服务请求拿到穿越后的这个映射地址交给这个终端A,那么双方都拿到他们的外网的IP地址之后呢,然后就可以进行这个尝试P2P的穿越了。那如果穿越成功了,他们也直接就能通过NAT进行通讯了。如果不成功,那么还有地方,

第三条路就是走中继

那这个终端通过NAT将数据转给这个中继,中继再向另外一个端去转发数据。那是不是就这三个呢?其实不是,在我这个终端上其实可能是多网卡。所以有可能是四个,但是可能有那个VPN那就有五个,有可能是虚拟IP那六个。那一个其实每一个都要做一些尝试,这个ICE的第一步就是将这个终端与另外一个终端的所有可能的通路全部收集起来,这是他做的第一个最主要的事儿。那将它所有的这个终端的这个通路收集起来之后干什么呢?然后他就传给对方,那对方也是做同样的这个操作,也收集所有的这个通路,然后呢,转给这个终端一。那双方都拿到这个对方的通路之后呢,然后进行尝试,

怎么尝试呢?

首先,让它这个主机的网卡的IP就去向这个主机的这个IP这个端口儿去发数据,如果能通了,说明他是在同一个局域网内。
如果不能通的情况下,那怎么办呢?
他就尝试这个穿越NAT。就给他这边儿这个端口去发送数据,但肯定不通对吧,它是内网地址肯定不通,它不通了之后就做另外一个尝试,那使用什么呢,使用通过STUN服务拿到这个反射的地址,去这个地址进行尝试,看能不能通。

那这个就根据这个我NAT类型:
(1)如果你是完全锥型儿的就可以通,
(2)如果限制型的端口型的就根据条件,
(3)如果是对称型儿的两双方都是对称型儿的,就肯定不通,

但如果做了这些尝试还不通的情况下,那它自己会选择第三条路,就是通过NAT,然后将数据转发给这个relay Server,那么这里relay Server呢,再通过这个中转转给这个终端B,最终这三条路肯定要有一条路是通的。

当然也可能不通,如果这个relay server也是被这个防火墙给隔开了,那就不通,那这个时候呢,就双方就确实没法通信了,但一般情况下,经过relay,这是最后一条路的时候肯定会通的。

所以ICE的基本的功能就是:

  • 第一步,要收集所有的通路,
  • 第二步就是对所有通路进行检测,看能不能通,那通了之后,那么ICE的这个工作就算结束了。

那么经过这张图呢,其实大家对这个ICE也基本上有了解,

下面我们就来看几个ICE的基本概念。

ICE Candidate

每个candidate是一个地址

ICE的第一个基本概念是Candidate,也就是候选者,
那什么是候选者呢?
就是我刚才所说的就是它的一个通路,就是每个Candidate是一个地址,那么这些地址包括IP地址端口。这是一个地址对。

例如:a=candidate:…UDP…192.169.1.2 typ host

你拿到这些通过之后,他们要交换对吧,
那交换使用什么交换呢?
是使用SDP,它是对于这个媒体信息以及网络信息的一个描述规范,这个规范最终是通过信令将这个SDP发送给对方,双方拿到各自的对方的SDP,就能识别出对方都有哪些通路。

它的格式是什么呢?

就是A代表一个属性呢,属性是一个Candidate,也就是一个候选者一条通路。
在这个这条通路里面必须包含一些基本信息:
第一个就是这个类型的,它是UDP的还是TCP的,他的IP地址是多少?端口是多少?类型是什么?是主机类型,就是我们自己本机的这个网卡还是这个反射后的,经过NAT反射后地址还是中继地址,它是有类型的。

那再下来呢,对这个有一个总结,就是每个候选者都包括了协议、IP、端口和类型,这就是candidate
那candidate类型其实我刚才我们已经介绍了,它有三种类型:

  • 主机候选者

  • 反射候选者

  • 中继候选者

一些主机候选者就是我们网卡自己的这个IP地址还有端口,那么反射呢,就是经过NAT之后的这个IP地址和端口,中继就是通过TURN服务给开通的这个IP地址和端口。

ICE具体做些什么

  • 收集candidate
  • candidate Pair排序

实际刚才我们已经描述了:
第一个收集candidate,那怎么收集?
刚才已经做了一些介绍,后面我们还会做更详细的,
收集到这些这个候选者之后呢,其实他要做一下排序,不是说每个候选者就拿过来,我们就检测对吧,这样会浪费很多时间,所以形成这个候选者对之后哪条路跟哪条路,形成一对儿一对儿的候选者之后呢。
然后要做他还有一套算法进行排序,那么我们认为优先级最高的那个先做测试有可能是先通的,这样就节省了时间。
那个最后呢,就是说连通性测试,连通性测试就是尝试,我发送一个请求,然后你给我回一个请求,OK,那么我们都收到了,这就连通的,如果说发出去之后超时了,没有收到,这就是说明是不连通的,这就是ICE具体做的一些事情。candidate关系图

如上图所示,我们看一下这个candidate的关系图,也就是说我们拿到这个通路他是怎么拿到的?实际刚才已经说得很清楚了,就是说我本地这是一个agent,实际就相当于我们一个终端,但本地网卡,网卡有IP,那这个就是host的类型的主机类型儿的候选者,经过NAT到那个TURN服务也可以到达STUN服务
一般情况下,像我们真实的这个配置的时候呢,是STUN服务TURN服务是部署在同一台机子上的,就是它的程序是一个程序,同时具有STUN和这个TURN两者的功能。
这个时候你就可以拿到他的映射的这个地址,映射后的就是NAT之后那个映射的公网地址就是一个IP和一个端口。
我们请求一个allocate请求一个TURN服务的时候,如果成功了,他会给我们开通一个这个IP地址和端口。用于中继用。
那这三种类型儿是怎么获取的呢?
就这么获取的,当他去发送一个请求的时候,实际就是拿到了自己的IP地址。然后映射后来这个IP地址,以及这个TURN中继的这个IP地址,
上面就是这就是对candidate关系图的讲解。

接下来我们再来看看怎么收集Candidate
Host Candidate:本机所有IP和指定端口

Reflexive Candidate:STUN/TURN

我们来看一下收集候选者就是获取自己本机所有IP和端口。
那就映射后的是STUN和这个TURN,实际是用STUN和这个TURN送请求的时候获取到的映射后的这个候选者。
那么还有这个中继的候选者是通过这个TURN服务,我们发送一个allocate的请求申请的这个服务,那么他是一个中继。
那么拿到这些候选者之后,我们要交换信息,刚才已经说了,就是通过SDP

那什么是SDP呢?

SDP(Session Description Protocol):它只是一种信息格式的描述标准,本身不属于传输协议,但是可以被其他传输协议用来交换必要的信息。

它是一种这个信息格式的描述标准,就本身并不属于一种传输协议,它可以被其他传输协议用来交换必要的信息,这里包含的信息就包括了媒体信息和网络信息,这是最主要的。

接下来我们看一个例子:SDP例子

这个例子就是一个标准的SDP的一个例子。
首先是版本,一般都是0了。
第二个是own,那儿就是他,这个归谁所有,如果这台机子就叫这个名字,对他有一系列的号儿,那么IP地址是多少?但是这IP地址最终不是他进行传输的,在我们WEBRTC里并不是用这个IP,c表示connection表示连接这个网络的IPV4,OK,这些都不太重要。这里呢,有一个媒体信息就是说在我这次交换媒体信息里,媒体就是一个audio也就是音频,它使用的是RTP的协议,对于这个音频它有一个参数,就是我使用的这个音频的编码方式是PCMU采样率是8000,这里大家了解一下就好。

最重要的是最后两行,它检测到有两种Candidate就是候选的路,
第一条是UDP的,IP 是 10.0.1.1端口是 8998,类型是host;
第二种也是UDP的,IP是192.0.2.3端口是45664,类型是穿越NAT的映射地址,这里没有中继地址,就是最终不可能通过中继传输数据,那 要么 就是说我们在同一局域网内可以互通,要么就是穿越NAT走P2P,这就是SDP。那就SDP,我们现在就知道有SDP这个东西,并且它的一个基本格式视频就好了。

形成Candidate Pair
一方收集到所有候选者后,通过信令传给对方

同样,另一方收到候选者后,也做收集工作

当双方拿到全部列表后,将候选者形成匹配对儿

我们获取到所有的Candidate之后呢,就要形成这个候选对了,就是哪一个到哪一个去传输信令,把一方收集到所有候选者之后,那么通过信令传递给对方,双方都拿到这个信息之后呢,就进行这个匹配,首先在逻辑上形成一对儿一对儿的。这样就形成了这个Candidate Pair

连通性检查

  • 对候选对进行优先级排序

  • 对每个候选对进行发送检查

  • 对每个候选对进行接收检查

那拿到一对一对的通过之后呢,实际就是做连通性检测。
第一个要进行排序,要把哪一些优先级高的先排队最先进行检测,这样可以节省时间为,这在我们之前已经给大家做过介绍啊。那在检测的时候呢,首先是要进行发送检测,就说我能不能发出去。那发送是OK的时候
然后我们再接收,其实在实际过程中为了这个节省时间是发送跟接收是同时进行的,所以如果我发送出去之后,然后再能收回我自己发送的信息,那么说明整个通路就是通过了,这其实在实现时还是非常简单的,这么说起来呢,就是要分为发送检测和接收检测。

OK。那么整个过程呢,就是这样的,但他在检测连通性过程中,A首先向B发送的请求,但比如说B响应,你这是通的。B然后再发送请求,A在返回说OK,你是通的需要这个四次,其实实际做了很多优化,都不需要这个完整的这个过程。那么以上就是ICE的相关的一些内容,在这里插入图片描述
在我们后边儿的这个实践中呢,都会用到这些内容,所以大家对这块儿要有一个清醒的认识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值