这个文件描述了以UDP为基础的请求/回答模式的多媒体会话的NAT穿越的协议。这个协议名叫ICE。ICE利用了STUN协议和它的扩展版本TURN。ICE可以被任何请求/问答模式的协议利用。例如sip。
1. 简介
RFC 3264 定义了一个双向会话描述协议(SDP),以建立多媒体回话。这种请求/回答模式被sip利用。
请求/回答的协议很难穿越NAT。因为它们想要建立一个媒体包的流。它们想要携带媒体源的IP地址和端口,并且将这些东西放入消息中。这些东西很难通过NAT。这个协议也想直接在两个伙伴之间创建会话。这样的话,就可以减少媒体数据的延迟,减少报的丢失,并且减少应用程序的消耗。然而很难克服nat穿越的问题。各种各样的情况很难解决,但这正是本协议的目的。
各种各样的方法已经被一些协议定义了用于nat的穿越。例如turn,stun。Sdp。但是每种协议都有优点和缺点。我们缺少的是一种试用于多种环境的方法来解决NAT穿越。
这个说明书定义了ICE作为NAT穿越的方法,他可以被扩展成其他的传输协议。ICE是一种请求问答模式的扩展版本,
2. 预览ICE
在经典的ICE中,我们有两个端点想要交流。它们可以通过一些传输协议直接交流。客户端可能位于也可能没有位于NAT的后面,ICE让客户端来发现路径使他们之间交流。
图1 显示了一个经典的环境。两个点是L和R。它们俩都在NAT的后面。NAT的类型并不知道。客户L和R想进行一个请求/问答模式的交流来交换SDP信息。交流将通过SIP 服务器进行。
ICE主要关心的是网络中的STUN或者TURN服务器。每个客户端都有自己的STUN和TURN服务器,或者它们的一样。
ICE的基本观念如下:每个客户端有几个个传输地址端口对的组合。它们可以通过这些组合同其他客户端交流。
这些组合包括以下:
。在子网的传输地址
。在NAT上的传输地址
。在TURN Server上的转发地址
图中L的任何一个组合都可以被用来同R的组合中的任何一个组合交流。然而,有些组合可能用不到。例如,如果L和R都在NAT之后,它们的子网传输地址不能直接进行交流。ICE的目的是发现哪个地址对可以交流。ICE的目的就是尝试所有可能的对,来找到一个或多个可以用来通信。
2。.1 获取候选者地址
为能用好客户端必须找到所有的地址候选者。候选者是一个ip端口对。这篇文章定了三种类型的候选者。在子网的传输地址叫做HOST CANDIDATE。
若一个客户端是多路的。它包含来自每一个IP地址的候选者。对于peer来说,client可被peer到达通过各种各样的方式。若peer跟client一个子网,则用子网的候选者。若在外网则用外网候选者。为了找出哪个候选者最近,client包含了所有的候选者。
若使用TURN协议则候选者有Relayed Address,Server Reflexive Address,Local Address。
当client从 IP 地址和端口 X:x发送了一个TURN Allocate request,nat将会映射一个Server Reflexive Address,数据包将由host 地址候选者到Reflexive地址候选者。
当这里有多个NAT位于client 和server之间时,turn request将在任何一个nat上绑定,但是只有最靠近server的reflexisive候选者被client发现。
然后allocate request到大TURN server。Turn server分配了端口y,地址y,然后产生了一个allocate回应。然后通知客户端这是relayed candidate。Turn服务器也通过回应通知client 它的server reflexive 候选者—X1:x1。
当仅仅STUN服务器被利用的时候,客户端发送一个STUN绑定请求道STUN server。STUN server将通知客户端它的 server reflexive 候选者 X1:x1 。
2。.2 连接检查
当L收集了所有的候选者信息,它将他们由高到低的优先级顺序组织起来,并将他们放到SDP请求的属性中发到R。当R接收到请求后,它进行相同的收集过程并将自己的候选者都进行了回复。最后,每一个client都有了他们对方的完整的候选者集合。它将他们组织好,放到CANDIDATE PAIRS中,来看哪个pairs有效,每个代理进行了一些检查。每个检查都是一个STUN request/response传输。
连接检查的步骤很简单:
1 将候选者进行优先级组织。
2 发送检查每个优先级对
3 回复从其他代理中收到的每个检查。
检查是一个四次握手的过程。
2.3 整理候选者
依照上述的搜索规则找到了所有的候选者对,为了更快的得到记过,候选者被用一个特定的规则进行了整理。整理候选者的结果列表被叫做CHECK LIST.zhge规则在4.1.2
中被描述。它遵循两个基本规则。
。每个代理给候选者一个数字优先级。伴随着候选者发送到peer中。
。本地和远处的候选者的优先级被结合到一起。
当L和R的前面都有NAT时,第二条特性对于让ICE去工作很重要。大多数情况下,NAT将不允许包从主机发来。因此,ICE检查每个方向,直到两边都有了回应才能确定联通。
2。.4 冻结候选者
先前介绍的情况仅仅符合代理想要用一个组件来建立媒体会话的情况。一个多媒体六可能要求各种各样的组件。每个组建必须为这个多媒体流工作。例如RTP组件和RTCP组建。Agent通常需要建立一个或多个流的连通性。
每个流的网络特性可能都非常相似。通常需要为另一个组建改变候选者。
每个候选者都与一个叫FOUNDATION的属性相关。当两个候选者相似时,他们由相同的foundation。相同的类型,从相同的主机候选者获得,并且STUN赢相同的协议。否则他们的foundation是不一样的。若一个候选者有
2.6 总结ICE
ICE 检查在特定的环境下执行,高优先级的候选者被率先检查,然后是低优先级。得出结论的一个方法是只要一个媒体流的每个组件都成功完成通信,我们就宣告成功。实际上,这是一个合理的方法。详细的介绍在下面进行提供。然而,如果这个高优先级的连接在建立过程中,若丢了一个包,则会失败,那我们会朝低优先级找。我们不如多花一些时间来继续检查,可能产生更好的后果。然而,更多的是,通过这种规则得出的优先级可能不会得到最好的效果。
所以,ICE指定了agents中得一个作为CONTROLLING AGENT,其他的是CONTROLLED AGENT。controlling agent从所有有效的候选者中找出适用于媒体的一个进行任命。它可以用一下两种方法。用REGULAR NOMINATION和AGGRESSIVE NOMINATION。
在regular nomination中,the controlling agent让检查继续,知道至少一个有效的候选者被找到。然后在这些有效的候选者中挑选,向它任命的候选者对中发送第二次STUN请求