SIP FAQ2

来源:互联网 发布:淘宝客服好干吗 编辑:程序博客网 时间:2024/05/16 10:45

 

SIP里的用户号码和认证名有什么区别

 
认证名用来认证(由特定的认证算法,如MD5),注册名用来注册(会体现在报文中)


举个例子:  "kkk"<sip:6000@realm.com>,


kkk就是Display name,这个可以由用户自由更改,好比QQ呢称


6000就是username 注册时用的名字
认证的用户名在这里体现不出来,他只出现在含有认证信息的请求报文中,一般是与username保持一致,也可以不一致.比如注册时返回401,那么你在进行重新注册时会在www_authxxxxx里面写上认证用户名

 


关于Request-URI和To字段中的URI

 
Request URI和To可以不一样,AS以及Proxy可以加以限制。
应答消息的原则上是不改变from,to,recordRoute,Route等头域,还要加上toTag,contact,以及其它的扩展头域。然后按照via 来返回。

 

Transaction与dialog有什么区别

 
Transaction:维护hop to hop状态,包括一个请求和其触发的所有响应,包括若干暂时响应和一个最终响应。生命周期从请求产生到收到最终响应。
Dialog:维护peer to peer状态,目前只有invite和subscribe请求会触发dialog。其生命周期贯穿一个端到端会话的始终。

 


PUBLIC和NOTIFY有什么不一样

 
Notify是服务器发送给客户端的,可能客户端在启动时并没有状态;
Publish是客户端发送给服务器端的,是将一些状态报告给服务器端。

 

sip dialog和session之间的区别和联系

 
session有两种含义,一种是传统意义上的RTP会话,一种是信令意义上的会话。SIP中的会话指后一种,在层次上它在dialog之上,也就是dialog可以看成session的组成单元。二者的分别主要基于目前出现的subscription应用,对于session和subscription可以共享一个dialog,dialog由基本的会话标识组成,如Call-ID,From-Tag,To-Tag,以及一些目的target等共性单元组成。而session除了具备这些单元外,包含INVITE建立起的会话其他内容,例如INVITE引起的状态机处理内容、PRACK处理记录等内容。


有一个最为重要的区别是:Session是完成了SDP的Offer-Answer过程,也就是此时双方可以进行双向的RTP传输了。而Dialog只是双方建立了联系,这个联系是通过Dialog Context来记录的。在Dialog状态下双方不一定可以作双向的RTP传输。所以必定是Dialog在前,而Session在后,但两者可以同时一起建立。


再补充一句:Session是基于SDP Message的交互。没有SDP的交互,就没有Session。而Dialog是基于请求消息中的Header Field进行交互。因此两者在层次上也是不一样的。


RFC3261 第12 dialog,有对dialog的定义,一个dialog描述的是两个代理之间的一种端对端的关系,持续一定时间。所以,只要端到端的代理的请求与应答之间存在相互联系的关系,就能构成一个dialog;而Session,SIP(即Session Initiation Protocol)既然整个sip协议就是会话初始化协议,我认为,sip建立连接的整个过程是一个Session,就包括代理之间对传输参数的协商,可以用SDP,也可以是其它的。
    同时请教,dialog ID,在有些情况,没有出现From_Tag或者To_tag,怎么判断Bye结束的是哪一个会话???一个会话的判断,只有通过dialog ID吗 ???

 


Record_route与via的区别

 
Record-Route是proxy在请求中增加的,用来强制会话中的后续请求经过本proxy。via描述请求当前经历的路径,并且给出了应答所应当经过的路径,简单点说就是,请求发送到哪里,应答返回到哪里


举个例子说吧。假设有两个UA:A和B,两个Proxy:P1和P2,SIP URI/地址分别记为Addr[A]、Addr[B]、Addr[P1]和Addr[P2]。当A向B发送一个INVITE请求时需要依次经过P1和P2。下面通过几个步骤来说明via:
1、A向P1发送INVITE请求,此时via:Addr[A];P1收到请求后返回100trying,此时via:Addr[P1]
2、P1向P2转发INVITE请求,此时via:Addr[A],Addr[P1];P2收到请求后向P1返回100Trying,此时via:Addr[P2]
3、P2向B转发INVITE请求,此时via:Addr[A],Addr[P1],Addr[P2];B收到请求后先向P2返回200OK,此时via:Addr[B]
4、P2将200OK应答转发给P1,此时via:Addr[B],Addr[P2]
5、当A收到200Ok应答时via:Addr[B],Addr[P2],Addr[P1]
从这里可以看到Via的功能是记录路径。
6、当B收到A返回的ACK,建立了语音会话之后。假设某一时刻,B希望通过发送一个BYE请求来结束这次通话,在一般情况下B会将BYE请求发送到先前INVITE请求中的Contact域中的目的地址,但是此时B发现先前的INVITE请求中有一个record-route域,且值为Addr[P1](假设该域的值是P1添加的),则B必须将该BYE请求直接发送到Addr[P1](请注意:不是把该地址赋给TO域,该请求的TO域还是A的URI)。
7、倘若该次会话结束以后,则该Record-Route域失效。


(上面说法我认为是错误的)


我觉得在步骤2中p1发100 trying时并不会在该信息中添加via:Addr[P1],仍然是via:Addr[A],当p1向p2发出Invite请求时才增加via:Addr[p1],p2收到请求后向P1返回100Trying,它也不会添加via:Addr[P2],它向B发出Invite请求时才增加via:Addr[p2],
    步骤5中,当Invite消息到达B时,B收到的Invite消息中应该有三个via字段:via:Addr[A],via:Addr[P1],via:Addr[P2],B返回200Ok消息并不会添加via:Addr[B]字段,仍然是那三个via字段,当200Ok经过p2时,p2把via:Addr[P2]去掉,经过p1时,p1把via:Addr[P1]字段去掉,最后200OK到达A,消息中的via就只剩下via:Addr[A]了


Via,是从dialog建立过程里,每个SIP请求事件从发起者到达目的者时:记录了所有经过的SIP服务器标记和发起者本身的"ip地址(域名):端口号;branch ID";信息发起者的via在最底层,以后每经过一个SIP服务器,SIP 服务器将自己的地址堆叠到via信息最上面,最靠近目的者的via在最上面,比较象数据结构里所说"先进后出"的堆栈;比如,INVITE. 然后对于该请求事件的回复(provisional/final response),就沿着via所指的地址进行"递归",比如:180 ringing, 200 ok.


Record-route:是SIP协议消息包所经过的路由节点,一个路由节点可能有多个SIP服务器,在RFC2543里只定义了严格路由,RFC3261为了回避某个节点出现故障,SIP协议消息不能通过该接点进行传递的问题,提出了松散路由的概念。

 


什么是SIP Outbound Server
 
Outbound Proxy:可以算是一个二传手,也就是传递SIP 的URI,通常以outbound命名: 要同过这个地址才可以联系到Registrar Server(通常称为SIP Proxy).至于realm的话,在一个庞大的网络罗,一般会用域名还带替IP地址,一是方便记忆,二是服务器可以做到多级热冗余,这样某个IP所对应的服务器故障了,待命的服务器就可以接替工作;因为outbound ,SIP服务器的信息要写入到终端里的,如果这时在某个IP地址的服务器出故障了,那么终端也就不能提供服务了(为了避免这个问题,有的终端厂家就加了个Second Server的变量,这是终端的折中的做法;当然,这样做,终端就可以有双倍的服务器地址或是域名).


在来说outbound Proxy 和SIP server(也叫SIP Proxy, SIP registar);处于网络安全IP地址缺乏的原故,有些NGN的解决方案里有个Outbound Server,一般SIP的核心平台(registrar server, redirect server,Policy server, Provisioning Sever, Heartbeat Sever, Database, billing server, Trunk Gateway)都是至于一个有安全保护的网络环境里.终端必须通过Outbound Server才能联系到里面.另外,终端处于NAT/Firewall后面时,Outbound会记忆终端的公网IP地址及对应的UDP端口号,还有其虚拟地址及端口;同时按一定的时间间隔(30秒以内,因为NAT/FW只会将一个没有数据通过的TCP或UDP端口保留最长30秒)发送一个心跳消息给终端,防止终端出来的UDP端口被NAT/firewall关闭.(当然很多终端也能定时的上发心跳消息给服务器端,及时告诉上边自己出去的公网IP地址及对应的UDP端口号,还有虚拟地址及端口).


 所以起用了outbound server 的消息是这样传送的:


 SIP报文: SIP URI "SIP_userID@SIP_Proxy/Registrar:port" 直接发向 outbound 这个地址,而不是直接发向SIP proxy/registrar这个地址.如果没有Outbound, 那么SIP报文SIP URI "SIP_userID@SIP_Proxy/Registrar:port" 一般直接发往SIP Proxy/Registrar地址的.
 

原创粉丝点击