ice流程

时间:2024-05-19 21:34:44

本文谈到的技术点,表达可能不太严谨,主要是说明流程。
本文主要介绍一下ice的流程

ice交互难点

ice交互难得原因,是Nat技术所导致,为了克服这个,有了stun、turn方法,
ice流程
图中 Nat规则 不太严谨,是一个大体意思。这种一对多、多对多的情况,导致A、B之间的不通。

一般来讲,分为对称型NAT和圆锥形NAT,其中圆锥形NAT又分为完全圆锥型NAT、IP限制圆锥型NAT、Port限制圆锥型NAT。

1 完全圆锥型NAT
完全圆锥型NAT是指同一个内网IP1+Port1向任何外网发送数据,在NAT会被映射到同一个外网的IP2+Port2;且当外网向IP2+Port2发送数据,也会被转换到内网IP1+Port1。一些反向代理服务器的代理节点就是此类型的NAT。

2 IP限制圆锥型NAT
IP限制圆锥型NAT是指同一个内网IP1+Port1向任何外网发送数据,在NAT会被映射到同一个外网的IP2+Port2;但是这种地址映射是与外网目的主机IP关联的,也就是说当内网IP1+Port1没有主动向IP3的外网主机发送数据,那么IP3的主机向IP2+Port2发送数据,将会被NAT丢弃。

3 Port限制圆锥型NAT
Port限制圆锥型NAT是指同一个内网IP1+Port1向任何外网发送数据,在NAT会被映射到同一个外网的IP2+Port2;但是这种地址映射是与外网目的主机IP和端口关联的,也就是说当内网IP1+Port1没有主动向IP3的外网主机的Port3发送数据,那么IP3+Port3向IP2+Port2发送数据,将会被NAT丢弃。IP限制圆锥型NAT只认姓啥不问名,Port限制圆锥型NAT是既要认姓啥又要看名谁。

4 对称型NAT
对称型NAT是内网IP1+Port1向外网IP2+Port2发送数据时,在NAT会被映射到一个外网的IP3+Port3;当向外网IP4+Port4发送数据时,在NAT会被映射到一个外网的IP5+Port5。这种机制不能保证同一个内网IP和端口向不同外网IP和端口发送数据时,其映射的外网IP和端口的一致性。

来自于http://blog.sina.com.cn/s/blog_5f70c7060100gsyo.html 介绍

在上述Nat类型中,对称性Nat是需要turn中转的,其余的stun都能打通(不绝对,可能有多个内网服务器映射一个外网,且路由不能回环,也需要turn),反正stun不通的,使用turn中转,turn是一个保底方法,增加稳定性。

stun协议

stun介绍介绍的挺全面
STUN是一个C/S架构的协议,支持两种传输类型:
一种是请求/响应(request/respond)类型,由客户端给服务器发送请求,并等待服务器返回响应;
另一种是指示类型(indication transaction),由服务器或者客户端发送指示,另一方不产生响应,在turn协议中转流,有使用到。或者 reqest indication 表明此请求不需要回复。

所有的STUN报文信息都含有一个固定头部,包含了消息类型,长度和事务ID。消息类型表示是具体哪一种传输类型(两种传输类型又分了很多具体类型),
STUN中只定义了一个方法,即binding(绑定),其他的方法可以由使用者自行拓展(通过属性);Binding方法可以用于请求/响应类型和指示类型,
用于前者时可以用来确定一个NAT给客户端分配的具体绑定。此时协议是可靠的,一方发送bind_request,如果没有等到bind_response,就会重新发送bind_request,重发是有具体时间间隔、重发次数的,这个以后确认一下

用于后者时可以保持绑定的**状态。类型还可表示报文类型是请求/成功响应/错误响应/指示。
在固定头部之后是零个或者多个属性(attribute),长度也是不固定的。

turn协议

https://www.jianshu.com/p/34acd2486537
https://www.jianshu.com/p/4a15556c6318
介绍的挺好

目的是补充stun协议无法解决的Nat类型,提供一种中转方式,达到p2p连通。

ice流程

ice流程是个大体流程,不是按照标准的严谨流程

背景:
peerA peerB 信令服务器 signal
目的 是 peerA peerB 互相发送消息

前提条件:peerB通过信令服务器将本身的地址发送到peerA,描述peerA的流程
1、收集地址
peerA收集本地地址以及外网地址
外网地址自己是无法知道,此时需要用到stun协议,连接stun服务器,发送bind_request,收到服务端回复 bind_response
根据map_address属性 获取地址,和发送地址比对,确认是否有Nat

2、conecting
peerA 从 peerB的信息中,拿到一个地址(可能多个,要一个一个尝试),发送stun的bind_request请求,对端回复bind_success,表明A连接B成功。
注意:如果对端没有回复,peerA是会持续发送请求,直到超出一定限制。

3、connected
当A连接B成功后,B拿到A的地址 向A发送bind_request请求,对端回复bind_success 此时A、B互通了

这个连接过程涉及到4中Nat模型,连接过程参考
http://blog.sina.com.cn/s/blog_5f70c7060100gsyo.html
https://github.com/pannzh/P2P-Over-MiddleBoxes-Demo/tree/master/stun 图不错
都不错

4、进行DTLS握手
实际在第二步后,A就向B发送了dtls握手,B没有处理,直到A、B互通时,A再次发送握手,B处理请求回复,交换证书
握手成功

5、保持此条连接
相隔固定时间,发送bind_request保持连接。

6、取出peerB的其他连接信息,进行2-5步骤,将所有地址尝试后,选取优先级最高的。
这个不同地址的优先级排名规则,需要再学习一下,如果是turn realy地址,优先级属于最低。
stun分为四种候选者:
ice流程
参考:stun流程描述

候选者优先级:
将候选者按优先级排序
推荐的公式:priority = (2^24)(type preference) +(2^8)(local preference) + (2^0)*(256 - component ID)
可以看pjnath的ICE代码.使用的就是这个.

选择type和local preference的方针
首先中继候选者和v*n网络接口的主机候选者,他们由于传送和接受数据存在中间人,这就增加了延迟和包丢失的概率.所以出于这种观念,type preference,host=126,server=100,peer=110,relayed=0.而且如果agent有多个网络接口,v*n=0.
另外要考虑的local preference是IP类型,安全,拓扑.
候选者优先级参考

在交互中,如果最高优先级host类型交互成功,其他类型还需要交互吗?后续学习补充

7、收集完成
可以发送自定义数据。

以上流程均不严谨,了解大体流程,可以参考。