博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sip学习

Posted on 2012-02-13 10:37  小新786  阅读(430)  评论(0编辑  收藏  举报

INVITE:

INVITE 方法被用来建立UA之间的media会话。在电话来说,类似于在ISDN上设置消息或是在ISUP上初始化地址消息。INVITE请求的响应总是发送一个ACK方法。

 INVITE通常有一个包含呼叫者的media 信息的消息体。消息体通常包含其他的会话信息,比如Qos或安全信息,如果INVITE不包含media信息,ACK中包含UAC的媒体信息。如果ACK中包含的media信息不可以接受,被调用方发送BYE来取消这个会话。不可以使用CANNEL是因为会话已经建立咯。INVITE成功以后,就在两个UA之间建立了一个对话,直到两者之一发送BYE来结束这个会话。

  UAC发起INVITE建立一个对话,同时在这次call的持续过程中为其分配了全局唯一的Call-ID,同时CSeq被初始化,对于相同的Call-ID的新请求增加CSeq。To和From字段分别定位于远程和本地地址。INVITE中From字段中包含tag,在任意回应中UAS在To中也包含tag。例如:在对INVITE的200OK回应中,To包含tag。在ACK中二者都有tag,两个tag和Call-ID唯一确定了一个dialog。

一个INVITE发往同一个Dialog的叫做re-INVITE,re-INVITE被用来改变会话的特性,或是刷新对话的状态。CSeq在re-INVITE中被增加,所以可以用re-INVITE来区分两者。

  如果re-INVITE被拒绝或是失败,会话仍然继续。直到初始INVITE的最终响应被接受,UAC不需要再发送re-INVITE请求。而UPDATE请求可以在这个时候被发送。在UA同时发送re-INVITE给对方的情况。这种情况在Retry-After中被处理。

  例子:

INVITE sip:411@salzburg.at;user=phone SIP/2.0
     Via: SIP/2.0/UDP salzburg.edu.at:5060;branch=z9hG4bK1d32hr4
     Max-Forwards:70
     To: <sip:411@salzburg.at;user=phone>
     From: Christian Doppler <sip:c.doppler@salzburg.edu.at>
       ;tag=817234
     Call-ID: 12-45-A5-46-F5@salzburg.edu.at
     CSeq: 1 INVITE
     Subject: Train Timetables
     Contact: sip:c.doppler@salzburg.edu.at
     Content-Type: application/sdp
     Content-Length: 151

     v=0
     o=doppler 2890842326 2890844532 IN IP4 salzburg.edu.at
     s=Phone Call
     c=IN IP4 50.61.72.83
     t=0 0
     m=audio 49172 RTP/AVP 0
     a=rtpmap:0 PCMU/8000

NOTIFY:
 NOTIFY 方法是UA用来传达某一个特殊事件发生的信息的.NOTIFY总是在订阅者和通知者之间的SUBSCRIPTION存在的时候在一个会话之内被发送的.然而,订阅不一定要通过SUBSCRIBE来建立的,比如REFER也可以建立隐式订阅.
 NOTIFY请求包含一个EVENT字段用来标示package.一个Subscription-State字段来标示当前的订阅状态.它们可以是active,pending,terminated三者的其中之一。
 例如:
     NOTIFY sip:tyoung@parlour.elasticity.co.uk SIP/2.0
     Via SIP/2.0/UDP cartouche.rosettastone.org:5060
      ;branch=z9hG4bK3841323
     Max-Forwards: 70
     To: Thomas Young <sip:tyoung@elasticity.co.uk>;tag=1814
     From: <sip:ptolemy@rosettastone.org>;tag=5363956k
     Call-ID: 452k59252058dkfj34924lk34
     CSeq: 3 NOTIFY
     Contact: <sip:Ptolemy@cartouche.rosettastone.org>
     Event: dialog
     Subscription-State: active
     Allow-Events: dialog
     Content-Type: application/xml+dialog
     Content-Length: ...

 

MESSAGE

     MESSAGE方法被用来传输IM。实际的消息内容作为MIME附件的形式放在消息体中,所有的支持MESSAGE方法的UA一定支持plain/text格式,他们也支持message/cpim,text/html等。

    一个MEASSAGE请求可以在Request-URI中使用im URI样式。尽管一个client试图解析一个sip或是 sips。

   MESSAGE  在SIP中也可以用完全模拟的方式来实现。INVITE可以建立一个会话,然后在SDP中描述instant message.

例如:

     MESSAGE sip:editor@rcs.org SIP/2.0
     Via SIP/2.0/UDP lab.mendeleev.org:5060;branch=z9hG4bK3
     Max-Forwards: 70
     To: <editor@rcs.org>
     From: "D. I. Mendeleev" <dmitry@mendeleev.org>;tag=1865
     Call-ID: 93847197172049343
     CSeq: 5634 MESSAGE
     Subject: First Row
     Contact: <sip:dmitry@lab.mendeleev.org>
     Content-Type: text/plain
     Content-Length: 5
INFO

    INFO方法被UA用来发送呼叫信令信息到另一个UA,来建立一个media session.她和re-INVITE的不同之处在于它没有改变呼叫的media特性。这个请求是end-to-end的。一个代理总是转发INFO请求,一直到UAS检查是否对话有效为止。对未知对话的INFO请求将会导致481 Transaction/Dialog Does not Exist的错误。

    INFO请求通常包括消息体,其内容可以是媒体消息,midcall 事件,其他因素。

 例如:

     INFO sip:poynting@mason.edu.uk SIP/2.0
     Via: SIP/2.0/UDP cavendish.kings.cambridge.edu.uk
      ;branch=z9hG4bK24555
     Max-Forwards: 70
     To: John Poynting <sip:nting@mason.edu.uk> ;tag=3432
     From: J.C. Maxwell <sip:james.maxwell@kings.cambridge.edu.uk>
      ;tag=432485820183
     Call-ID: 18437@cavendish.kings.cambridge.edu.uk
     CSeq: 6 INFO
     Content-Type: message/isup
     Content-Length: 16