ICE学习总结
发布时间:2018-01-29 16:22:36
发布时间:2018-01-29 16:22:36
交互式连接建立(Interactive Connectivity Establishment ——ICE)草案是由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。ICE定义的是一种标准化的方法,能够确定客户端之间存在的是哪一种类型的NAT防火墙,并且确定一连串可以用于实现连接的IP地址。通过使用多种协议及网络连接机制,如STUN(Simple Traversal of UDP Through NATs——STUN),TURN(Traversal Using Relay NAT——TURN),ICE可以了解到客户端所在网络结构以及这些设备可以实现通信的各类网络地址。
ICE的基本流程其实很清晰,分两个步骤,第一步就是收集各种类型的地址,第二步就是将本地和远端的地址进行配对,排序,然后执行连通性检查。
如果通信的双方有一方或者两方在NAT后,就需要进行NAT穿越。
NAT有4种不同的类型
1) Full Cone
2) Address Restricted Cone
3) Port Restricted Cone
以上三种NAT通称Cone NAT(圆锥形NAT).我们只能用这种NAT进行UDP打洞.
4) Symmetric(对称形)
对于这种NAT。连接不同的外部Server,NAT打开的端口会变化。也就是内部机器A连接外网机器B时,NAT会打开一个端口,连接外网机器C时又会打开另外一个端口。
比较常用的NAT穿越技术有STUN,TURN,但是STUN不支持TCP连接的穿越,也不支持对称NAT。TURN虽然支持TCP连接的应用也可以穿越对称NAT,但是TURN的局限性在于所有报文都必须经过TURNServer转发,增大了包的延迟和丢包的可能性,而且服务器的负担比较大。 ICE将STUN与TURN相结合,如果可以用STUN穿越,就建立P2P连接,否则就通过TURN服务器进行中转,建立relay连接。
候选地址包括主机候选地址(host Candidate),服务器反向候选地址(srflx--Server Reflexive Candidate),对端反向候选地址(prflx-- Peer Reflexive Candidate)和中继候选地址(relayed Candidate)
host Candidate,也就是本地网络接口的地址。
Server Reflexive Candidate,是通过主机候选地址向STUN服务器发送STUN请求获得的网络地址。实际上就是终端的网络包经过一重或多重NAT穿透之后,由STUN服务器观察到的经过NAT转换之后的地址。
图3.1 获取服务器反向候选地址
Peer Reflexive Candidate,通过从主机候选地址发送一个STUN请求到运行在Peer候选地址上的STUN服务器而获取的候选地址。
图3.2 获取对端反向候选地址
Relayed Candidate,通过从主机候选传输地址发送一个STUN分配请求到STUN服务器而获取的一个候选地址。它是STUN服务器为STUN请求的发起方在本机上分配的代理地址,所有被路由到该地址的网络包将会被转发到服务器反向地址,继而穿透NAT发送到终端,实际上就是中继服务器的地址。当NAT是对称式的防火墙时,STUN无法穿透的情况下由中继服务器来转发数据。
图3.3 获取中继转发地址
当呼叫端收集到所有的候选地址后,通过某种信令(sip,jingle等)将候选地址转发给应答端,应答端就获得了呼叫端的所有候选地址;而应答端同样也执行该过程。这样的话,呼叫端和应答端都有一个完整的包含了双方候选地址的列表,然后准备执行连通性检查。
首先呼叫端和应答端分别对地址列表进行配对,例如本地有n个地址,远端有m个地址,那么配成n*m对。然后对这些地址对进行连通性检查,连通性检查是通过发送和接收STUN请求和应答完成的。若通信双方的某一个地址对通过一个完整的四次握手,那么该地址对就是有效地址对。
当通过地址对中的本地地址向远端发送一个STUN请求,并且成功收到远端的STUN应答,称该地址是可接收的(包含两次握手);当本地地址收到远端地址发来的一个STUN请求,并成功响应,则称该地址为可发送的(也包含两次握手)。若一个地址对是可接收的同时又是可发送的,则称该地址对是有效的,即通过连通性检查。则此地址可用于媒体传输。
图4.1 四次握手
一旦连通性测试成功就需要保持keepalives,ICE是通过binding indication报文来保持keepalives。
图4.2 keepalives
如果客户端位于对称NAT后面,p2p无法建立的情况下turn server会转发数据,在转发数据前客户端需要和turn server进行协商。协商的具体流程如下图所示:
图5.1 rela模式的建立过程
1~4,认证和allocation,客户端首先向服务器发送allocation请求,但是这个请求没有带用户名等信息,因此服务器会返回一个错误的响应报文要求重新发送请求,第3步,客户端带着用户名等信息重新发起allocation请求,服务器认证通过,然后返回成功的响应信息,allocation请求一旦成功,turn服务器就会给客户端分配一个端口做为relay port,中继的地址和端口会通过响应消息的XOR-RELAYED-ADDRESS返回给客户端。
5,发送数据,一旦allocation成功,客户端A就可以通过turn服务器发送数据给客户端B,数据的发送是通过send indication报文来实现的,这个报文的XOR-PEER-ADDRESS属性中包含了对端的地址信息。但是此时客户端B不能发送数据到客户端A,客户端B需要经过permission请求才可以发送数据,否则服务器会将A的信息丢弃。
6~7,permission,只有在turn服务器创建了permission后客户端B才能通过turn服务器发送消息。
9,接收消息,一旦permission建立成功,turn就可以将收到的消息通过data indication用中继地址转发出去。
图6.1 NAT典型网络模型
如图6.1是NAT的典型模型:客户端A位于NAT后,是一个私网,客户端B在公网上,而STUN服务器也在公网上。
(1)~(4):客户端A是位于私网后的,首先A发送一个STUN请求的数据包,该数据包经过NAT后,数据包的IP头会被NAT改为合法的IP地址,STUN服务器收到该数据包后,解析出源地址,注意这个源地址并不是客户端A本地的地址,而是客户端A通过NAT映射后的公网地址,STUN服务器将该地址加入的STUN应答包里,然后返回给客户端A,那么客户端A就获得它在NAT后的映射地址,即服务器反向候选地址。
(5):客户端A也会获得它本机地址,然后客户端A将本机所有的地址通过信令信道发送到客户端B。
(6)~(7):和(1)~(4)是一样的过程,只是客户端B位于公网,所以STUN服务器给它返回的地址和它本机地址是一样的。
(8)和(5)是一样。
(9):客户端B就会根据地址列表向A发送绑定请求的数据包,但是由于A从来没和B通信过,所以这个包会被NAT丢弃。
(10)~(13):客户端A向服务器客户端B发送绑定请求,经过NAT后,地址转化为合法的公网地址,B接收到A的绑定请求后,发送绑定应答,因为A已经和B通信过,所以B发送的绑定应答包不会被NAT丢弃调。
(14)~(17):和(10)~(13)是一样的过程,因为A已经和B通信过,所以B能够顺利获得A给它返回的应答包。
至此,客户端A和客户端B之间已经完成四次握手,所以它们之间的链路可以用RTP流的传输。
测试工具:
客户端:pjsua,x-lite,icedemo,pjturn-client
服务器:stunman,turnserver,pjturn-srv,numb
发起端位于公司防火墙内部,stun/turn server 以及应答端位于公网。
发起方的SDP信息
v=0 |
发起方的checklist
11:50:59.567 icedemo Checklist created: 11:50:59.567 icedemo 0: [1] 192.168.6.243:54623-->210.14.78.243:33528 (not nominated, state=Frozen) 11:50:59.567 icedemo 1: [1] 192.168.6.243:54623-->192.168.0.243:33528 (not nominated, state=Frozen) 11:50:59.567 icedemo 2: [1] 192.168.6.243:54623-->61.65.55.4:58510 (not nominated, state=Frozen) 11:50:59.567 icedemo 3: [1] 61.65.55.4:51721-->210.14.78.243:33528 (not nominated, state=Frozen) 11:50:59.567 icedemo 4: [1] 61.65.55.4:51721-->192.168.0.243:33528 (not nominated, state=Frozen) 11:50:59.567 icedemo 5: [1] 61.65.55.4:51721-->61.65.55.4:58510 (not nominated, state=Frozen) |
发起方开始进行连通性测试
11:50:59.677 icedemo .Check 0: [1] 192.168.6.243:54623-->210.14.78.243:33528 (nominated): connectivity check SUCCESS 11:50:59.677 icedemo .Check 0: [1] 192.168.6.243:54623-->210.14.78.243:33528: state changed from In Progress to Succeeded 11:50:59.677 icedemo .Check 0 is successful and nominated |
收到binding success response后增加一个新的候选地址prflx
11:50:59.677 icedemo Candidate 3 added: comp_id=1, type=prflx, foundation=Pc0a806f3, addr=117.22.255.66:26449, base=192.168.6.243:54623, prio=0x6effffff (1862270975) |
发起方连通性测试的结果
11:50:59.677 icedemo .ICE process complete, status=Success 11:50:59.677 icedemo .Valid list 11:50:59.677 icedemo .0: [1] 117.22.255.66:26449-->210.14.78.243:33528 (nominated, state=Succeeded) 11:50:59.677 icedemo ICE negotiation success after 0s:110 11:50:59.677 icedemo Comp 1: sending from prflx candidate 117.22.255.66:26449 to host candidate 210.14.78.243:33528 11:50:59.677 icedemo.c .ICE negotiation successful |
应答方的SDP
v=0 |
应答方形成checklist
11:52:50.103 icedemo Checklist created: 11:52:50.103 icedemo 0: [1] 210.14.78.243:33528-->192.168.6.243:54623 (not nominated, state=Frozen) 11:52:50.103 icedemo 1: [1] 192.168.0.243:33528-->192.168.6.243:54623 (not nominated, state=Frozen) 11:52:50.103 icedemo 2: [1] 192.168.0.243:33528-->117.22.255.66:24286 (not nominated, state=Frozen) 11:52:50.103 icedemo 3: [1] 210.14.78.243:33528-->117.22.255.66:24286 (not nominated, state=Frozen) 11:52:50.103 icedemo 4: [1] 61.65.55.4:58510-->192.168.6.243:54623 (not nominated, state=Frozen) 11:52:50.103 icedemo 5: [1] 192.168.0.243:33528-->61.65.55.4:51721 (not nominated, state=Frozen) 11:52:50.103 icedemo 6: [1] 210.14.78.243:33528-->61.65.55.4:51721 (not nominated, state=Frozen) 11:52:50.103 icedemo 7: [1] 61.65.55.4:58510-->117.22.255.66:24286 (not nominated, state=Frozen) 11:52:50.103 icedemo 8: [1] 61.65.55.4:58510-->61.65.55.4:51721 (not nominated, state=Frozen) |
收到binding success response后增加一个新的候选地址prflx
11:52:50.103 icedemo ..Added new remote candidate from the request: 117.22.255.66:26449 |
应答方开始进行连通性测试
11:52:50.153 icedemo .Check 9: [1] 210.14.78.243:33528-->117.22.255.66:26449 (nominated): connectivity check SUCCESS 11:52:50.153 icedemo .Check 9: [1] 210.14.78.243:33528-->117.22.255.66:26449: state changed from In Progress to Succeeded 11:52:50.153 icedemo .Check 9 is successful and nominated |
应答方连通性测试的结果
11:52:50.153 icedemo .ICE process complete, status=Success 11:52:50.153 icedemo .Valid list 11:52:50.153 icedemo . 0: [1] 210.14.78.243:33528-->117.22.255.66:26449 (nominated, state=Succeeded) 11:52:50.153 icedemo Checklist: state changed from Idle to Running 11:52:50.153 icedemo Starting checklist periodic check 11:52:50.153 icedemo ICE negotiation success after 0s:050 11:52:50.153 icedemo Comp 1: sending from host candidate 210.14.78.243:33528 to prflx candidate 117.22.255.66:26449 11:52:50.153 icedemo.c .ICE negotiation successful |
发送以及接受数据
请求方发送及接收数据
12:11:31.236 icedemo.c !Data sent(内容为hello from caller)
12:12:06.862 icedemo.c Component 1: received 17 bytes data from 210.14.78.243:33528: "hello from callee"
响应方发送及接收数据
12:05:14.625 icedemo.c !Data sent(内容为hello from callee)
12:04:59.041 icedemo.c Component 1: received 17 bytes data from 117.22.255.66:26449: "hello from caller"
请求方位与西安公司的防火墙内,应答方位与上海公司的防火墙内,stun/turn server位于公网。
发起方的SDP信息
v=0 |
发起方的checklist
15:51:47.047 icedemo Checklist created: 15:51:47.047 icedemo 0: [1] 192.168.6.243:51663-->192.168.121.119:33001 (not nominated, state=Frozen) 15:51:47.047 icedemo 1: [1] 192.168.6.243:51663-->180.168.202.150:3877 (not nominated, state=Frozen) 15:51:47.047 icedemo 2: [1] 192.168.6.243:51663-->61.65.55.4:49153 (not nominated, state=Frozen) 15:51:47.047 icedemo 3: [1] 61.65.55.4:49152-->192.168.121.119:33001 (not nominated, state=Frozen) 15:51:47.047 icedemo 4: [1] 61.65.55.4:49152-->180.168.202.150:3877 (not nominated, state=Frozen) 15:51:47.047 icedemo 5: [1] 61.65.55.4:49152-->61.65.55.4:49153 (not nominated, state=Frozen) |
发起方的协商结果
15:51:47.251 icedemo .ICE process complete, status=Success 15:51:47.251 icedemo .Valid list 15:51:47.251 icedemo . 0: [1] 210.74.155.210:23881-->180.168.202.150:3877 (nominated, state=Succeeded) 15:51:47.251 icedemo ICE negotiation success after 0s:204 15:51:47.251 icedemo Comp 1: sending from prflx candidate 210.74.155.210:23881 to srflx candidate 180.168.202.150:3877 15:51:47.251 icedemo.c .ICE negotiation successful |
应答方的SDP信息
v=0 |
应答方的checklist
23:50:19.037 icedemo Checklist created: 23:50:19.037 icedemo 0: [1] 192.168.121.119:33001-->192.168.6.243:51663 (not nominated, state=Frozen) 23:50:19.037 icedemo 1: [1] 192.168.121.119:33001-->117.22.255.66:42127 (not nominated, state=Frozen) 23:50:19.037 icedemo 2: [1] 61.65.55.4:49153-->192.168.6.243:51663 (not nominated, state=Frozen) 23:50:19.037 icedemo 3: [1] 192.168.121.119:33001-->61.65.55.4:49152 (not nominated, state=Frozen) 23:50:19.037 icedemo 4: [1] 61.65.55.4:49153-->117.22.255.66:42127 (not nominated, state=Frozen) 23:50:19.037 icedemo 5: [1] 61.65.55.4:49153-->61.65.55.4:49152 (not nominated, state=Frozen) |
应答方的协商结果
23:50:19.086 icedemo .ICE process complete, status=Success 23:50:19.086 icedemo .Valid list 23:50:19.086 icedemo . 0: [1] 180.168.202.150:3877-->210.74.155.210:23881 (nominated, state=Succeeded) 23:50:19.086 icedemo ICE negotiation success after 0s:049 23:50:19.086 icedemo Comp 1: sending from srflx candidate 180.168.202.150:3877 to prflx candidate 210.74.155.210:23881 23:50:19.086 icedemo.c .ICE negotiation successful |
This page is intentionally left blank.