RFC5245 ICE 各种概念中文注解
1)三种地址: Host candidate(本机地址); Server Reflexive candidate(公网IP); Relayed candidate(在TURN Server上的地址)
2交谊)BASE: 指与反射地址对应的本机地址。 本机地址的BASE就是本机地址。Relayed Candidate的Ba就是Candidate 自己,如果Relayed Candidate和Host Candidate相同,这个地址应该被丢弃。
3)只有STUN Server时,用STUN Binding 请求;对Turn Server ,是 Allocate 请求。
4)L收集了所有它的candidate后,优先级排序,通过Signal 通道Offer 发送给R。R自以为是意思是什么意思收到Offer后,开始自己的收集过程,收集完成后发送自己的candidate Answer 给L。两端开始组织成candidate pairs,然后开始检查各个pair的连通性。
5)如果在连通性检查返回的反射IP不同于任何已知的,这个新的地址会被标记为PEER REFLEXIVE CANDIDATE。
6)每个Agent给它的Candidate一个数字的优先级;最终的优先级是两端的优先级相加的值,这样两边都有同样的优先级。
7)每个Candidate有一个属性叫FOUNDATION。如果两个Candidate是用 同样的类型,从同一个Host Candidate和性别研究Stun Server用同样的协议得到;这样两个Candidate就有相同的FOUNDATION。一个Candidate Pair的FOUNDATION 就是两个Candidate的FOUNDATION的连接。开始的时候只有不同的FOUNDATION的Pair才会被检查;其他的Pair处于Frozen状态。当一个Pair的检查成功结束后,相同FOUNDATION的Pair 才处于Unfrozen状态。避免对相同的网络状况的Pair重复检查。
8)每个连通性检查的Request 都是被通过Signal交互Key的 Message Authentication Code (MAC)保护的。
9)有Controlling Agent 和Controlled Agent 之分。察今Controlling Agent 决定选择那个Pair。
10)两种方式: Regular or Aggressive Nomination
11)Regular Nomination: 当得到至少一个合法的Pair 后,Controlling Agent选择一个Pair,
在上面再发送一个带Flag 的请求,告诉对端这个就是被选择的Pair.
12)Aggressive Nomination:Controlling Agent 在所有的发送的请求里都带上Flag标志(作文第一次做饭Controlled Agent不用带);最先成功的那个被选择为媒体传输通道。(所有成功的Pair里优先级最高的那个。)
13)当所有的媒体流都完成后,Controlling Agent发送一个Updated Offer,如果在m和clines里的默认值与被选择的值不相同时。
14)Lite实现: Ice 的Lite 实现是给那些有公网IP的设备,这样这些设备比较容易的可以支持ICE。ICE的Lite实现不需要实现Candidate的收集过程;只需要提供Host Candidate 。不需要实现连通性检查或者状态机。只需要实现连通性检查的Respon 。Full Agent 是Controlling Agent 。两个Lite实现之间如果要互联,不需要发送Check。
15)为了发送Offer,执行5个步骤:收集Candidates;优先级排序;去除冗余;选择默认Candidate ;格式化发送SDP Offer。
16)收集Host Candidate:绑定Port 到本机的每一个Interface里;对每一个媒体流,Agent 都
需要为每一个Component得到一个Candidate;每个Candidate都有一个它对应的Component。每个Component都有个Id 想对应;RTP是1, RTCP是2。如果一个Agent 用到了RTP和RTCP,它有K个IP地址,它要收集2*K个主机Candidate 。
17)计算Foundation :相同类型(Host, Relayed, Server reflexive, or peer reflexive);Ba 有相同IP地址(port 可以不同);对Relayed or reflexive Candidate,得到他们的STUN or TURN Server 是相同的IP地址;用相同的协议得到(TCP or UDP, etc。)
18)在ICE过程完整之前,我的目标是什么Reflexive 和 Relayed 地址必需用 Binding Request 或 Refresh Transaction 保证是一直存在的。
19)Priority 计算公式:Priority = (2^24)*(Type Preference) + ( 2^8) * (Local Pre) + ( 2 ^0) *( 256 - Component ID)
实际上就是 Type Pre 最高位8 bits,Local Pre 中间16bits,(256-Com ID) 最后8 bits
Type Pre 从0 到 126; 126最高优先级;相同类型的Candidate优先级相同;Peer Reflexive 优先级大于Server Reflexive;
Local Pre 从0 到65535;如果只有一个IP 地址,优先级就是65535;
建议值:126 For Host; 100 for Server Reflexive; 110 for Peer Reflexive; and 0 for Relayed; Local Host Pre from a VPN should be 0;
对IPv6 IPv4双协议栈主机,V6优先级高于 6to4地址 高于 V4高压走廊地址;
20)如果一个candidate的地址和Ba都与另外一个Candidate 相同,认为是冗余的;消除低优先级的那个。
21)选择默认地址的目的是为了与Non-ICE对端通信。当与 ICE对端通信时,如果开始的时候没有选择默认地址,那么就需要在完成ICE流程后来一个updated Offer /Answer从而能更新SDP。 Agent 必需对所有在使用的媒体流选择一个默认地址;在使用的媒体流是指端口为0 的流。即使一个流被 a=inactive 或者带宽被设置为0,这个流也是在使用的(in-u)。 建议按如下顺序设置默认值:Relayed > Server Reflexive > Host。
如果是non-ICE aware; 对于RTP意式蔬菜汤来说,默认目标地址就是SDP里的c line; port 在 m line; 对于RTCP, 如果有RTCP的属性就是在RTCP属性里,否则就是在c line和 m line里的p
ort + 1; 默认Candidate 就是地址和默认目标地址相同的那个Candidate 。
22)如果想不支持RTCP就要声明: b=RS:0 and b=RR:0 RFC3556
23)Agent收到SDP Offer 后,首先验证Offer是否支持ICE,验证规则:对于每个媒体流的每个Component 的默认目标地址,必须出现在Candidate 属性里。例如在RTP流里,c line里的IP 地址和m line里的port,相应的出现在某个candidate里。RTCP属性里的值出现在另外一个candidate里。
(For each media stream in the SDP it received, the default destination for each component of that media stream appears in a candidate attribute.)
24)Candidate Pair Priority = 2 ^ 32 * Min(G, D) + 2 * MAX(G, D) + ( G>D?1:0); G: Control
ling Agent Priority; D: Controlled Agent Priority;
25)连通性检查/Connectivity Checks:
a) Agent发送Binding 请求;必须使用STUN short-term credential mechanism;FINGERPRINT 机制必须使用。
b)Agent 必须在Binding请求中包含PRIORITY 属性。值应该是与本地Candidate的Priority相同(除非这个Pair的属性是Peer Reflexive Type)。
c)Controlling Agent有可能包含 USE-CANDIDATE属性;Controlled Agent一定不能包括改属性;这个属性表明Controlling Agent希望能使用该Pair 来为这个媒体流传输数据(如果Check 能成功的话)。
d)Controlling Agent必须包含 ICE-CONTROLLING属性;Controlled Agent必须包含ICE-CONTROLLED属性;
e)STUN short-term credential: Ur Name形式如下 "Remote UrName:Local UrName"; Password用对端传送过来的。L -> R: urname RFRAG:LFRAG; Password RPASS; R->L: urname LFRAG:RFRAG; Password LPASS;