[sip protocol] SIP Intro --- REFER method
dracularking
2008-12-25
SIP Intro --- REFER method
R EFER method 講到這個method,就開始有點複雜了! 因為要有以前講過的觀念,然後加上REFER與Subscrib的概念。整個例子的流程會很大、Msg的量也會增加很多! 但是,又因為有了之前的基礎,因此可以省略很多個Msg的說明,所以我就可以把整個REFER這個例子的流程簡化了很多! 首先,REFER是用在CALL Transfer上面。以下就來說明一個例子吧,假設有A,B,C三個人,A打給B,然後HOLD B,再打給C,然後把B轉接給C。最後B與C結束通訊。 A INVITE B A HOLD B A INVITE C A HOLD C A REFER B TO C B INVITE C C BYE A A BYE B ... C BYE B (or B BYE C) 而CALL Transfer又不只一種形式,其中有兩種較為常見,一種是Attended transfer,另一種為Blind transfer。前者為轉接者(發REFER的UA),在接通兩方電話後,再做Transfer,上面的例子就是Attended transfer。而後者為先接通一方電話,再發送REFER要求對方去CALL第三方。 在此先不探討CALL Transfer的方式,我將focus在REFER這個method的使用,以及其相關概念。 下面的CALL flow是一個在Dialog外的REFER,因此其To不會有tag。而在Dialog外或內也何差異?主要差異在於在Dialog內的REFER不會有Fork的產生,但在Dialog外的REFER則允許有Fork的產生。Fork有分支的意思,在此先簡單瞭解一下,當一個Event package允許使用Fork時,就會產生數個SUBSCRIBE requests,因而就能產生multiple subscriptions,就如同分支一樣,所以才稱之為Fork。(SUBSCRIBE概念會在另一篇說明) 先來看這個session外REFER的例子。再看後面的例子的時候,可以注意一下幾個Header fields的值~ Call-ID: CSeq: Event: Subscription-State: 以下是在A與B建立好通訊之後的情況 Agent A Agent B | | | F1 REFER | |----------------------->| | F2 202 Accepted | |<-----------------------| | F3 NOTIFY | |<-----------------------| | F4 200 OK | |----------------------->| | | | | | |-------> | | (whatever) | |<------ | | | F5 NOTIFY | |<-----------------------| | F6 200 OK | |----------------------->| | | | | Message One (F1) REFER sip:b@atlanta.example.com SIP/2.0 Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223 To: From: ;tag=193402342 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 93809823 REFER Max-Forwards: 70 Refer-To: (whatever URI) Contact: sip:a@atlanta.example.com Content-Length: 0 Message Two (F2) SIP/2.0 202 Accepted Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223 To: ;tag=4992881234 From: ;tag=193402342 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 93809823 REFER Contact: sip:b@atlanta.example.com Content-Length: 0 Message Three (F3) NOTIFY sip:a@atlanta.example.com SIP/2.0 Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9922ef992-25 To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993402 NOTIFY Max-Forwards: 70 Event: refer Subscription-State: active;expires=(depends on Refer-To URI) Contact: sip:b@atlanta.example.com Content-Type: message/sipfrag;version=2.0 Content-Length: 20 SIP/2.0 100 Trying Message Four (F4) SIP/2.0 200 OK Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9922ef992-25 To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993402 NOTIFY Contact: sip:a@atlanta.example.com Content-Length: 0 Message Five (F5) NOTIFY sip:a@atlanta.example.com SIP/2.0 Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9323394234 To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993403 NOTIFY Max-Forwards: 70 Event: refer Subscription-State: terminated;reason=noresource Contact: sip:b@atlanta.example.com Content-Type: message/sipfrag;version=2.0 Content-Length: 16 SIP/2.0 200 OK Message Six (F6) SIP/2.0 200 OK Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9323394234 To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993403 NOTIFY Contact: sip:a@atlanta.example.com Content-Length: 0 以下為接續上面的例子,情況為在A在現有的Dialog裡,發送第二次REFER。(第一次REFER是在Dialog外) Agent A Agent B | | | F7 REFER | |----------------------->| | F8 202 Accepted | |<-----------------------| | F9 NOTIFY | |<-----------------------| | F10 200 OK | |----------------------->| | |-------> | | (something different) | |<------ | | | F11 NOTIFY | |<-----------------------| | F12 200 OK | |----------------------->| | | | | Message Seven (F7) REFER sip:b@atlanta.example.com SIP/2.0 Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK9390399231 To: ;tag=4992881234 From: ;tag=193402342 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 93809824 REFER Max-Forwards: 70 Refer-To: (some different URI) Contact: sip:a@atlanta.example.com Content-Length: 0 Message Eight (F8) SIP/2.0 202 Accepted Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK9390399231 To: ;tag=4992881234 From: ;tag=193402342 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 93809824 REFER Contact: sip:b@atlanta.example.com Content-Length: 0 Message Nine (F9) NOTIFY sip:a@atlanta.example.com SIP/2.0 Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9320394238995 To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993404 NOTIFY Max-Forwards: 70 Event: refer;id=93809824 Subscription-State: active;expires=(depends on Refer-To URI) Contact: sip:b@atlanta.example.com Content-Type: message/sipfrag;version=2.0 Content-Length: 20 SIP/2.0 100 Trying Message Ten (F10) SIP/2.0 200 OK Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9320394238995 To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993404 NOTIFY Contact: sip:a@atlanta.example.com Content-Length: 0 Message Eleven (F11) NOTIFY sip:a@atlanta.example.com SIP/2.0 Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK2994a93eb-fe To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993405 NOTIFY Max-Forwards: 70 Event: refer;id=93809824 Subscription-State: terminated;reason=noresource Contact: sip:b@atlanta.example.com Content-Type: message/sipfrag;version=2.0 Content-Length: 16 SIP/2.0 200 OK Message Twelve (F12) SIP/2.0 200 OK Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK2994a93eb-fe To: ;tag=193402342 From: ;tag=4992881234 Call-ID: 898234234@agenta.atlanta.example.com CSeq: 1993405 NOTIFY Contact: sip:a@atlanta.example.com Content-Length: 0 source: http://uniq-uniq.blogspot.com/2008/03/sip-intro-refer-method.html |