音视频开发学习(-)续,协议

来源:互联网 发布:mmd如何载入动作数据 编辑:程序博客网 时间:2024/05/16 11:41

stun, turn, ice协议概述

stun,turn,ice是ietf提出的处理voip网络中nat穿越问题的协议族。
    stun 可以处理大部分nat问题,turn是stun协议的一个增强版,专用于处理对称形nat问题,而ice则是综合stun及turn的产物,是一个框架,综合运用STUN和TURN的结构,它提供可靠的VoIP或视频通话配置以及媒体传输,通过一个SIP供给/应答模型供端点交换多个候选IP地址和端口(比如私有地址和TURN服务器地址)。
    采用此框架可以完美解决voip 中 媒体传输中遇到的 nat及防火墙问题,而信令穿越则需要另一套机制,过去人们提出了多种处理nat问题的方案,但都有局限性,采用ice则完全解决了这些问题,ice的另一个特点时能够通过一定机制检测nat类型,从而决定采用何种方案处理,比如对于大多数呼叫,媒体可能直接用p2p方式即可,而有些方案可能不论什么nat类型都用media-relay方式,这种方式增加了端到端延时及丢包概率。
    stun和turn都是client/server协议,说白了就是客户端向服务器要自己的公网地址及端口,然后放在自己invite请求的sdp消息体及对invite的 200 ok  sdp 消息体中。
大多数sip客户端和服务器支持stun协议,所以都有一定缺陷。
http://blog.csdn.net/perfectpdl/article/details/7636067

STUN和TURN技术浅析

http://www.h3c.com.cn/MiniSite/Technology_Circle/Net_Reptile/The_Five/Home/Catalog/201206/747038_97665_0.htm
http://www.h3c.com.cn/MiniSite/Technology%5FCircle/Technology%5FColumn/

SDP 协议分析

http://www.cnblogs.com/qingquan/archive/2011/08/02/2125585.html
SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP)、MIME 扩展协议的电子邮件以及超文本传输协议(HTTP)。SDP协议是也是基于文本的协议,这样就能保证协议的可扩展性比较强,这样就使其具有广泛的应用范围。SDP 不支持会话内容或媒体编码的协商,所以在流媒体中只用来描述媒体信息。媒体协商这一块要用RTSP来实现.

ICE学习 (术语)  

http://ghj19850926.blog.163.com/blog/static/18591560201291734453123/
  1.     Component  : 首先一个Component是一块需要仅仅一个传送地址的媒体流.一个媒体流可以需要多个component,每一个都是为整个媒体流工作而运作.例如对于基于RTP的媒体流,每一个媒体流分为两个组件,一个是RTP,一个是RTCP.

  2.     Foundation :  两个候选者如果它们有相同的类型,base,stun服务器的话,那么它们有相同的Foundation.三者如果有一项不同的话, Foundation是不一样的.两个具有相同foundation对的候选者对,具有相似的网络特性.Foundation用于Frozen算法.

  3. Agent:是在请求/应答交换中与协议实现相关的,在一个请求/应答交换中,有两个相关的Agent

  4. Peer:从一个会话中的某个Agent的角度看,它的peer就是另一个Agent。进一步说,从请求者的角度看,它的peer就是应答者。从应答者的角度看,它的peer就是请求者。

  5. Transport AddressIP地址与端口的组合。

  6. Candidate:是一个传输地址,它即将被ICE过程处理,来确定能否基于该传输地址传输媒体。

  7. Host Candidate:是一个候选地址,它通过绑定了特定端口到主机某个接口获取。接口可以是物理接口或逻辑接口。例如,通过VPNsRSIPRealm Specific IP)获取的接口。

  8. Server Reflexive Candidate:是一个候选地址,通过从主机候选地址发送一个STUN请求到STUN服务器获取的候选地址。服务器反向地址实际上就是Agent的网络包经过一重或多重NAT穿透后,由STUN服务器观察到的经过NAT转换后的地址。

  9. Peer Reflexive Candidate:是个候选地址,通过从主机候选地址发送一个STUN请求到运行在Peer候选地址上的STUN服务器而获取的候选地址。

  10. Relayed Candidate:是一个候选地址,通过从主机候选传输地址发送一个STUN分配请求到STUN服务器而获取的一个候选传输地址。Relayed Candidate是常驻STUN服务器的,并且STUN服务器向后转播数据包到Agent。中继地址实际是STUN服务器为STUN请求的发起方在本机上分配的代理地址,所有被路由到该地址的网络包将会被转发到服务器反向地址,继而穿透NAT发送到终端,因此如名字所示,它是STUN服务器完成中继功能的地址。

  11. Translation:中继候选传输地址的转换是当中继器收到一个包后,将要把该包转发到的目的传输地址。对于通过STUN分配请求学习到的中继地址,其转发就是分配应答所返回的服务器反向地址。

  12. Base : 服务器反向候选地址的基主机候选地址就是发起它的主机候选地址。主机候选地址也有一个基主机候选地址,与它自己相同。类似的,中继地址的基主机候选地址也是它自己。

  13. Local Candidate:是候选地址,是Agent已经获取的,并且包括在所发送的请求或应答中。

  14. Remote Candidate:是个候选地址,Agent从它的Peer那里收到的请求或应答中所包含的候选地址。

  15. In-Use Candidate:是个候选地址,是一个出现在活动的媒体流的m/cline中的候选地址。

  16. Candidate Pair:包含了本地候选地址和远程候选地址的一对组合。

  17. Check:是个候选地址对,Agent可以从它的本地候选地址发送一个STUN连通性检查。

  18. Check List:一个STUN检查的有序集合,Agent要产生这些到peerSTUN检查。

  19. Periodic CheckAgent按照定时器结果,周期性的通知它发送一个检查,进行连通性检查。

  20. Triggered Check:在收到一个来自Peer的连通性检查时,产生的一个连通性检查。

  21. Valid List:一个候选地址对的有序集合,这些候选地址被STUN成功的处理,证明是有效的。

ICE 实现流程(1)  

收集主机候选者.收集的过程和传输协议有关,这儿特指UDP.agent对于媒体流的每一个component遍历主机的网络接口获得一个候选者.比如基于RTP的媒体流的话,RTPcomponentID1,RTCP2.使用二者的agent,如果它主机有K个网络接口的话,那么它有2*K

候选者.


主机候选者的base是它自己.


服务器转向和中继候选,这些是可选的,至于去不去取它们的话,取决于ICE提供者的变动,一般来说是一份config文件.举个例子,在封闭的局域网中可能就不需要这些地址.以为使用中继的代价是很昂贵的,中继一般只使用于对称NAT的情况.

agent接下来将主候选者和配置好的STUN server 配对.目前这一份草案仅仅考虑到唯一一个STUN的情况.在这种特定的情况,Ta毫秒过后,agent选择另外一对这样子的配对,从主机候选者向STUN Server发送请求.如果agent使用转向和中继的地址.那么请求就是relay用法的STUN Allocate请求.如果agent only使用服务器转向候选者,这时候agent使用binding发现用法,发送一个STUN Binding请求.

Ta的值在ICE中推荐为20ms

这是第一个开始向外进行发送东西的STUN事物.重发规则以后再说.同样地,一个请求的重试取决于,可以恢复的错误比如说authentication challenge,是在timer Ta过去以前发生,并立即返回的.由于每一个候选者都需要时间,这就涉及到时间预算的问题,所以有必要限制收集的候选者的个数.

agent将接受一个STUN binding或是 Allocate 响应.一次成功的Allocate响应的话,将要提供agent一个转向地址(从 mapped 地址 attr获得).如果Allocate遭到拒绝的话,那么意味着服务器缺少资源.agent可以改发Binding请求来获得服务器转向地址,如果中继候选者和主机候选者有重复,那么丢弃这个中继候选者.


清除冗余的候选者

如果候选者的传输地址和另一个候选者一样,而且他们的base也一样,这种情况,请清除它.


计算Foundation

这个取决于 type,base有不同的IP地址,或者用以获得他们的STUN服务器的IP地址不同.


保持候选者存活

一旦,服务器转向和中继地址被分配,他们的存活期必须是整个ICE的过程.


将候选者按优先级排序

推荐的公式:priority = (2^24)*(type preference) +

              (2^8)*(local preference) +               (2^0)*(256 - component ID)

可以看pjnathICE代码.

使用的就是这个.


选择typelocal preference的方针

首先中继候选者和VPN网络接口的主机候选者,他们由于传送和接受数据存在中间人,这就增加了延迟和包丢失的概率.所以出于这种观念,type preference,host=126,server=100,

110=peer,0=relayed.而且如果agent有多个网络接口,VPN=0.

另外要考虑的local preferenceIP类型,安全,拓扑.


选择默认候选者

默认候选者就是可以接收从没有ICE的一方发来的媒体数据.推荐是relay,否则reflexive,否则host.



ICE 实现流程(2) SDP协议编码  

2012-10-17 16:19:16|  分类: 学习*路|字号 订阅

例子:

v=0

o=jdoe 2890844526 2890842807 IN IP4 10.0.1.1

s=

c=IN IP4 192.0.2.3

t=0 0

a=ice-pwd:asd88fgpdd777uzjYhagZg

a=ice-ufrag:8hhY

m=audio 45664 RTP/AVP 0

b=RS:0

b=RR:0

a=rtpmap:0 PCMU/8000

a=candidate:1 1 UDP 2130706178 10.0.1.1 8998 typ host

a=candidate:2 1 UDP 1694498562 192.0.2.3 45664 typ srflx raddr

10.0.1.1 rport 8998

m=<media> <port>/<number of ports> <transport> <fmt list>

agent希望使用的每一个媒体流都对应一个m-line,m-line的顺序ICE是关心的,因为这关系到ICE的连通性检查的顺序.所以最重要的媒体流要排在前面.

STUN对agent之间的连通性检查是利用短期的证书,证书在offer/answer的过程中被交换.

证书的username是从agent的username生成的.每一个agent提供密码用来检查它接收的请求的完整性.username也提供了二义性和正确性的检查.如果agent是轻量的实现,那么在它的SDP中必须包含一个”a=ice_lite”来标示.

默认候选者作为媒体的默认目标被加入SDP.对于基于RTP的流,那么可以把RTP候选者的ip和端口放在c和m行.agent使用RTCP的话,必须按照RF3605所说的使用a=rtcp的属性,如果没有使用RTCP,那么必须根据RFC3556使用b=RS:0 b=RR:0.


原创粉丝点击