WebRTC网络基础 九、第六节 ICE框架

网友投稿 322 2022-09-20

WebRTC网络基础 九、第六节 ICE框架

今天我们来介绍一下ICE,那什么是ICE呢 ?那什么是ICE呢?其实下面的这张图就表达的非常清楚 ,我们来看一下,

第一个是双方通信的Peer 有两台机子A和B ,他们都是在NAT之后 ,这里有两个NAT,在NAT外面有两个STUN  服务,其实也可以用一个STUN服务对吧,他们主要用于这个其中的这个一个终端去穿越NAT时候进行NAT穿越使用的。所以在这里会形成一个这个映射后的公网的IP地址。所以这两个可以是两个,也可以是一个,甚至可以是多个,那么还有一个呢,就是relay server,所以就是我们上节课所介绍的这个TURN 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这个端口儿去发数据,但如果能通了,说明他是在同一个局域网内,但是直接通了,OK,如果不能通的情况下,那怎么办呢?他就尝试这个穿越NAT。就给他这边儿这个端口去发送数据,但肯定不通对吧,他是内网地址肯定不通,他不通了之后他就做另外一个尝试,那他使用什么呢,使用通过STUN服务拿到这个反射的地址,去这个地址进行尝试,看能不能通。那这个就根据这个我NAT类型儿,如果你是完全锥型儿的就可以通,如果限制型的端口型的就根据条件,那么,如果是对称型儿的两双方都是对称型儿的,就肯定不通,但如果做了这些尝试不通的情况下,那它自己会选择第三条路,就是通过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具体做哪些事儿呢?

ICE具体做些什么

收集candidate

对candidate Pair排序

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

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

收集Candidate

Host Candidate:本机所有IP和指定端口

Reflexive Candidate:STUN/TURN

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

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

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

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

但在后边儿呢,我还会给大家这个讲SDP的一些更加详细的这个配置和参数,那个时候呢,我们再仔细看一下。那在我们获取到所有的Candidate之后呢,就要形成这个候选对了,就是哪一个到哪一个去传输信令,把一方收集到所有候选者之后,那么通过信令传递给对方,双方都拿到这个信息之后呢,就进行这个匹配,首先在逻辑上形成一对儿一对儿的。这样就形成了这个Candidate Pair。

连通性检查

对候选对进行优先级排序

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

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

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:DoMarketing-营销智库:趋势:母婴头部品牌为何集体“押宝”TA?
下一篇:String类的常用方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~