SIP REFER

From 탱이의 잡동사니
Jump to: navigation, search

Overview

원문은 이곳[1]에서 확인할 수 있다.

REFER 는 SIP 메소드로써, FERFER 를 받는 수신측은 Request 에 제시되는 리소스를 참조하도록 한다. 많은 어플리케이션에서 사용될 수 있으며, Call Transfer와 같은 서비스가 대표적인 사용 예이다. 쉽게, 하나의 UA가 다른 UA에게 직접 INVITE를 요청하도록 하는 것이다. REFER 메소드를 받는 수신측은 INVITE/200 OK/ACK 를 제 삼자와 통신한 후 NOTIFY 메소드를 통해 REFER 전송자에게 보고하도록 되어 있다. 또한, REFER 에 대한 응답 202 Accepted 를 사용한다.

Call Transfer preparation

Sip refer call transfer.png

통화중에 밥은 앨리스를 캐롤과 통화하도록 연결해 주고자 한다. 밥은 앨리스에게 "잠시만, 캐롤과 통화하도록 해줄께"라고 말하고 Hold 버튼을 선택한다.

Hold(통화중 대기)는 앨리스가 잠시 대기하도록 하는 것이다. 간단하게 설명하자면 reINVITE with SDP 가 앨리스에게 전달되고, SDP 에는 a=sendonly, c=0.0.0.0 이라고 표시가 된다. 200 OK with SDP 가 밥에게 전달되고, SDP 에는 a=recvonly 라고 표시 된다. 만일 MoH(Music on Hold)가 사용된다면, c=0.0.0.0 이 특정 서버의 IP address 를 가리킬 것이다.

Call Transfer with blind

Sip refer call transfer 2.png

위의 그림을 보면, Hold를 한 후 Carol 의 정보를 REFER 를 통해 보내게 된다. REFER 을 수신한 앨리스는 INVITE를 직접 Carol 에게 요청한다. 앨리스와 캐롤간에 통화로가 설정되고 나서 앨리스는 밥에게 현재의 상황을 NOTIFY 메소드를 통해 Bob 에게 보고한다. 동시에 BYE 메소드를 밥에게 전송하며 앨리스와 밥 사이의 호는 종료되고, 앨리스와 캐롤간에 통화 후 종료하게 된다. 위의 상황을 본다면, Blind Transfer 가 된다.

밥이 앨리스에게 보낸 REFER 메시지는 다음과 같다.

REFER sip:alice@atlanta.com SIP/2.0
Via: SIP/2.0/UDP swp34.biloxi.com;branch=z9hG4bKna9
Max-Forwards: 70
To: <sip:alice@atlanta.com>;tag=a6c85cf
From: <sip:bob@biloxi.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 10187 REFER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, UPDATE
Supported: replaces
Refer-To: <sip:carol@chicago.com>
Contact: <sip:bob@swp34.biloxi.com>
Content-Length:0

잠시 Refer-To 헤더를 살펴보자. REFER 메시지에 반드시 포함되어야 하며, 앨리스가 INVITE 를 생성한 후 보낼 정확한 목적지가 명시된다. REFER 의 다양한 응용을 위해서는 Refer-To 헤더에 다양한 양식의 URI 입력이 가능해야 할 것이다. 다음은 RFC 3515 에 나타난 예제이다.

Refer-To: sip:alice@atlanta.example.com

Refer-To: <sip:bob@biloxi.example.net?Accept-Contact=sip:bobsdesk.biloxi.example.net&Call-ID%3D55432%40alicepc.atlanta.example.com>

Refer-To: <sip:dave@denver.example.org?Replaces=12345%40192.168.118.3%3Bto-tag%3D12345%3Bfrom-tag%3D5FFE-3994>

Refer-To: <sip:carol@cleveland.example.org;method=SUBSCRIBE>

Refer-To: http://www.ietf.org

또한, NOTIFY 메시지는 다음과 같다. Event: refer 를 통해 이 NOTIFY 는 REFER 의 이벤트에 의해 생성됨을 확인할 수 있다.

NOTIFY sip:bob@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9922ef992-25
To: <sip:bob@biloxi.com>;tag=1928301774
From: <sip:alice@atlanta.com>;tag=a6c85cf
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 1993402 NOTIFY
Max-Forwards: 70
Event: refer
Subscription-State: active;expires = (depends on Refer-To URI)
Contact: sip:alice@atlanta.example.com
Content-Type: message/sipfrag;version=2.0
Content-Length: 20

SIP/2.0 200 OK

To, From, Call ID 가 정확하게 REFER 와 매치가 되어야 한다. 또한 메시지 바디에 message/sipfrag 가 명시되어야 하며, 이는 REFER 에 의한 이벤트의 상태를 나타낸다. 여기에서는 SIP/2.0 100 Trying 이라고 되어 있다. 이는 다음과 같은 의미이다.

  • SIP/2.0 100 Trying
현재 REFER에 의해 요청된 이벤트가 처리중임
  • SIP/2.0 200 OK
현재 REFER에 의해 요청된 이벤트가 성공적으로 처리되었음
  • SIP/2.0 503 Service Unavailable
현재 REFER에 의해 요청된 이벤트가 실패했음
  • SIP/2.0 603 Declined
현재 REFER에 의해 요청된 이벤트를 수신했지만, 거절되었음

Subscription-State 헤더를 통해 Carol 이 Active 임을 통지한다. 그리고, 마지막 NOTIFY 가 전송될 때는 Subscription-State:Terminated;reason=noreasource 가 반드시 명시되어야 한다.

Call transfer with consultantive

밥이 캐롤과 통화 후 캐롤에게 "잠시만 앨리스 전화 돌려줄께"하고 Transfer 버튼을 누르게 된다.

Sip refer call transfer with consultantive.png

앨리스와 밥이 통화 후, 밥은 앨리스를 Hold 시킨 후, 밥이 캐롤과 통화한다. 그리고, 밥은 앨리스에게 REFER 를 전송하여 앨리스가 캐롤에게 직접 INVITE를 전송하도록 한다. 앨리스는 캐롤과 세션이 연결되자마자 NOTIFY 로 밥에게 보고한다. 이 상태에서 밥은 앨리스와의 통화와 캐롤과의 통화 모두를 종료하게 되는 것이다.

3-way conference

REFER 를 이용한 또 다른 응용 서비스로 다음과 같은 삼자 통화를 들 수 있다.

Sip refer 3 way conference.png

Call transfer 와 3자 통화의 차이라면, 앨리스가 캐롤과 호를 설립하고 나서, NOTIFY 를 밥에게 전송한다는 것이다.

밥은 앨리스에게 reINVITE를 전송하여 기존의 Hold 상태의 세션을 양방향 통신 상태로 전환한다. 즉, Call transfer 에서는 BYE 로 기존 세션을 종료한 것과 달리 앨리스가 호를 유지하게 되고, 앨리스는 밥과 캐롤의 목소리를 믹싱하여 밥과 앨리스에게 전송해야 한다. 따라서, DSP 가 바쁘게 움직일 것이다.

아래는 일반적인 삼자 통화 이다.

Sip refer 3 way conference normal.png

밥이 앨리스와 통화 중에 앨리스를 통화중 대기 시킨 후 다시 캐롤과 통화하게 되고 두개의 호를 밥이 Join 하여 Ad-hoc Conference 를 하게 되는 것이다. 삼자 통화는 Refer 를 이용할 수도 이용하지 않을 수도 있다는 것을 이해하면 된다.

3-way conference with MCU

만일, 통화자가 서로 다른 코덱을 사용하게 되면, 어쩔 수 없이 외부 리소스를 사용해야 한다.

Sip refer 3 way conference with mcu.png

외부 리소스를 사용하여 삼자 통화를 하는 예제이다.

Reference

  1. http://www.nexpert.net/151