ICE协议介绍
ICE
协议是WebRTC
的一个重要组成部分, 全称为:Interactive Connectivity Establishment
,
要用到stun
和turn
协议, 用于NAT穿越, 建立P2P连接。
最新版本为:RFC 8445
ICE协议要点
使用场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
+---------+
+--------+ |Signaling| +--------+
| STUN | |Server | | STUN |
| Server | +---------+ | Server |
+--------+ / \ +--------+
/ \
/ \
/ <- Signaling -> \
/ \
+--------+ +--------+
| NAT | | NAT |
+--------+ +--------+
/ \
/ \
+-------+ +-------+
| Agent | | Agent |
| L | | R |
+-------+ +-------+
|
Agent L
要和Agent R
通信,因为分别在NAT
后面,
所以要先通过STUN
协议交换Agent L
和Agent R
的NAT
映射后的地址。
在ICE
中,这样的地址可以称为candidate transport addresses(候选地址)
。
候选地址可以有以下三种:
public
地址: 直接暴露在公网的地址, 即NAT
映射后的地址。
private
地址: 隐藏在NAT
后面的地址, 只能被NAT
后面的设备访问到。
relay
地址: 经过TURN
服务器转发的地址, 可以被公网访问到, 但只能被NAT
后面的设备访问到。
candidate
host Candidates
本地网卡ip和port, 不能包括: 回环地址(127.0.0.1)
Server-Reflexive and Relayed Candidates
nat
映射的地址和turn
转发的地址
Keeping Candidates Alive
一旦分配了server-reflexive
或relay
地址, 就需要定时发送keep-alive
包, 以保持连接的有效性。
Role
在每个会话中,每个ICE agent
必须有一个角色(controlling
或controlled
)。具体是哪个角色根据以下情况分析:
-
两个坐席都是full
发起ICE
处理的agent
是controlling
,另外一个agent
就是controlled
。
会有连接检查。
-
一个坐席是full
, 另一个坐席是lite
full agent
是controlling
, 另一个lite agent
就是controlled
。
-
都是lite
发起ICE
处理的agent
是controlling
,另外一个agent
就是controlled
。
没有连接检查.
一旦会话建立, 双方ICE agent
的控制状态就不能再变了,但是full
orlite
这个状态在重启的时候可以改变。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
+-------+
|STUN |
|Server |
+-------+
|
+---------------------+
| |
| Internet |
| |
+---------------------+
| |
| |
+---------+ |
| NAT | |
+---------+ |
| |
| |
+-----+ +-----+
| L | | R |
+-----+ +-----+
|
详细的地址示例:
ENTITY |
IP Address |
Mnemonic name |
ICE Agent L |
10.0.1.1 |
L-PRIV-1 |
ICE Agent R |
192.0.2.1 |
R-PUB-1 |
STUN Server |
192.0.2.2 |
STUN-PUB-1 |
NAT (Public) |
192.0.2.3 |
NAT-PUB-1 |
交互流程为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
L NAT STUN R
|STUN alloc. | | |
|(1) STUN Req | | |
|S=$L-PRIV-1 | | |
|D=$STUN-PUB-1 | | |
|------------->| | |
| |(2) STUN Req | |
| |S=$NAT-PUB-1 | |
| |D=$STUN-PUB-1 | |
| |------------->| |
| |(3) STUN Res | |
| |S=$STUN-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |MA=$NAT-PUB-1 | |
| |<-------------| |
|(4) STUN Res | | |
|S=$STUN-PUB-1 | | |
|D=$L-PRIV-1 | | |
|MA=$NAT-PUB-1 | | |
|<-------------| | |
|(5) L's Candidate Information| |
|------------------------------------------->|
| | | | STUN
| | | | alloc.
| | |(6) STUN Req |
| | |S=$R-PUB-1 |
| | |D=$STUN-PUB-1 |
| | |<-------------|
| | |(7) STUN Res |
| | |S=$STUN-PUB-1 |
| | |D=$R-PUB-1 |
| | |MA=$R-PUB-1 |
| | |------------->|
|(8) R's Candidate Information| |
|<-------------------------------------------|
| | (9) Bind Req |Begin
| | S=$R-PUB-1 |Connectivity
| | D=$L-PRIV-1 |Checks
| | <-------------------|
| | Dropped |
|(10) Bind Req | | |
|S=$L-PRIV-1 | | |
|D=$R-PUB-1 | | |
|------------->| | |
| |(11) Bind Req | |
| |S=$NAT-PUB-1 | |
| |D=$R-PUB-1 | |
| |---------------------------->|
| |(12) Bind Res | |
| |S=$R-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |MA=$NAT-PUB-1 | |
| |<----------------------------|
|(13) Bind Res | | |
|S=$R-PUB-1 | | |
|D=$L-PRIV-1 | | |
|MA=$NAT-PUB-1 | | |
|<-------------| | |
|Data | | |
|===========================================>|
| | | |
| |(14) Bind Req | |
| |S=$R-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |<----------------------------|
|(15) Bind Req | | |
|S=$R-PUB-1 | | |
|D=$L-PRIV-1 | | |
|<-------------| | |
|(16) Bind Res | | |
|S=$L-PRIV-1 | | |
|D=$R-PUB-1 | | |
|MA=$R-PUB-1 | | |
|------------->| | |
| |(17) Bind Res | |
| |S=$NAT-PUB-1 | |
| |D=$R-PUB-1 | |
| |MA=$R-PUB-1 | |
| |---------------------------->|
|Data | | |
|<===========================================|
| | | |
.......
| | | |
|(18) Bind Req | | |
|S=$L-PRIV-1 | | |
|D=$R-PUB-1 | | |
|USE-CAND | | |
|------------->| | |
| |(19) Bind Req | |
| |S=$NAT-PUB-1 | |
| |D=$R-PUB-1 | |
| |USE-CAND | |
| |---------------------------->|
| |(20) Bind Res | |
| |S=$R-PUB-1 | |
| |D=$NAT-PUB-1 | |
| |MA=$NAT-PUB-1 | |
| |<----------------------------|
|(21) Bind Res | | |
|S=$R-PUB-1 | | |
|D=$L-PRIV-1 | | |
|MA=$NAT-PUB-1 | | |
|<-------------| | |
| | | |
|