brunch

You can make anything
by writing

C.S.Lewis

by 라인하트 Dec 13. 2018

11장. SIP CANCEL의 이해

1.  CANCEL의 개요 

발신자가 전화번호를 잘못 누르거나 통화 중에 직장 상사가 불러서 통화시도를 중지하는 경우가 있습니다. 즉, INVITE 요청에 대한 200 OK를 수신하기 전에 수화기를 내려놓을 때 SIP 프로토콜은 CANCEL 메쏘드를 이용합니다. CANCEL 메쏘드는 기존의 요청을 취소하기 위해 사용합니다. CANCEL은 상대방이 응답을 전송하기 전에 사용합니다. 만일 INVITE 요청에 대해 200 OK 응답을 수신하면 정상적인 호 진행이므로 CANCEL 이 아닌 BYE를 이용합니다.  



CANCEL의 메시지를 분석해 보겠습니다. 


      

1) CANCEL

INVITE 요청에 대한 200 OK 응답 전에 CANCEL을 밥에게 전송합니다.


CANCEL sip:bob@192.168.10.20 SIP/2.0
Via: SIP/2.0/TCP 10.1.3.33;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 10197 CANCEL
Contact: <sip:alice@atlanta.com>
Reason: SIP ;cause=486 ;text=“Busy Here”
Content-Length: 0


CANCEL 요청은 앨리스가 밥에게 보내는 것이므로 앨리스가 전화를 걸다가 갑자기 다른 사람의 전화가 와서 받아야 하는 상황입니다. CANCEL 메쏘드는 반드시 Reason 헤더를 포함합니다. Reason 헤더는 취소의 이유를 명기합니다. 여기서 'Reason: 486 Busy Here' 이므로 다른 사람으로부터 전화를 받은 것이라 가정하였습니다.   


2) 200 OK

엘리스의 CANCEL 요청을 밥이 정상 처리하였음을 통지하기 위한 200 OK 응답입니다. 


SIP/2.0 200 OK
Via: SIP/2.0/TCP 10.1.3.33
From: Alice <sip:alice@atlanta.com>;tag=1928301774
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 10197 CANCEL
Content-Length: 0


200 OK 응답이 INVITE에 대한 것인지 CANCEL에 대한 것인지를 알 수 있는 거은 CSeq 헤더입니다. 



2. 응답을 받지 못한 요청에 대한 처리 

SIP는 Client/Server 프로토콜이면서 요청과 응답 (Request / Response) 프로토콜입니다. CANCEL의 트랜잭션은 요청과 응답으로 정상 처리가 되었지만, INVITE의 트랜잭션은 요청 후 아무런 응답을 받지 못했습니다. SIP는 이렇게 마무리될 수 없으므로 INVITE 요청에 대한 200 OK 가 아닌 다른 응답이 전송되어야 합니다.

<그림 11-2> 487 응답


밥의 전화기는 CANCEL 요청에 의해 취소된 INVITE 요청에 대한 응답으로 '487 Request Terminated'를 발행합니다. 앨리스의 전화기는 200 OK를 정상적으로 수신했다는 의미의 ACK를 전달합니다. SIP 프로토콜은 4xx 응답에 대한 수신 확인을 위해 ACK를 발행합니다. 


      

1) 487 Request Terminated

밥의 전화기는  CANCEL 요청을 수신한 후에 200 OK를 송신한 후 기존의 INVITE 세션 요청에 대한 처리를 중지하고 487 응답을 발행합니다. 


SIP/2.0 487 Request Terminated
Via: SIP/2.0/TCP 10.1.3.33
From: Alice <sip:alice@atlanta.com>;tag=1928301774
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Content-Length: 0


CSeq 헤더는 INVITE에 대한 응답이라고 알려줍니다.  


2) ACK

엘리스는 487 응답을 정상 수신하였음을 통지하기 위해 ACK를 발행합니다.  


ACK sip:bob@192.168.10.20 SIP/2.0
Via: SIP/2.0/TCP 10.1.3.33;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 ACK
Content-Length: 0



3. 200 OK 발행한 후에 CANCEL을 수신하는 문제   

밥은 INVITE에 대한 200 OK가 발행하는 순간 CANCEL이 수신될 수 있습니다. 멀리 떨어진 전화기간에 이루어지는 통신이므로 발생 가능성은 낮지만 충분히 예상할 수 있는 시나리오입니다. 이 상황의 문제점은 CANCEL 요청은 200 OK 응답 전에 발행되어야 한다는 전제를 위배한 것입니다. SIP 프로토콜은 절차적 당위성을 획득하기 위해 기존의 호 설립과 종료 절차를 그대로 활용합니다.


<그림 11-3> 200 OK 발행하는 순간 CANCEL 요청을 받는 경우


엘리스의 전화기는 CANCEL을 발행한 후에 INVITE에 대한 200 OK를 수신하지만 당황하지 않고 200 OK를 정상 수신했음을 통지하기 위해 ACK를 발행합니다.  밥의 전화기도 당황하지 않고 CANCEL에 대한 200 OK를 발행합니다. 엘리스의 전화기와 밥의 전화기는 CANCEL 트랜잭션과 INVITE 트랜잭션을 완료합니다. 그리고, INVITE / 200 OK / ACK로 인해 연결된 세션을 자동으로 종료하기 위해 BYE / 200 OK로 정상 종료 처리를 합니다. 따라서, 모든 요청과 응답이 정상적으로 처리합니다.  



4. Call Forking 의 경우에 효율적인 CANCEL 요청 

사용자는 하나의 전화번호나 URI주소를 공유하는 다수의 전화기나 단말을 보유합니다. 다시 말해서, 하나의 AoR은 다수의 Contact Address를 가집니다. 따라서, 하나의 전화번호로 호출된 통화 시도를 여러 개의 전화기로 전파하여 벨을 울리게 하는 Call Forking 기능이 필요합니다.


<그림 11-4> Call Forking 에서 CANCEL 메쏘드의 활용 


밥에게 통화를 요청하는 INVITE를 수신한 biliox.com의 SIP Proxy는 AoR과 바인딩된 모든 단말에 INVITE를 송신합니다. 밥은 3 개의 전화기 중에 한 대로 200 OK 응답을 회신합니다. SIP Proxy 서버는 나머지 두 대의 전화기에 INVITE 요청을 CANCEL 요청으로 취소하여 벨이 울리는 것을 중단시킵니다. 3 개의 INVITE는 Via헤더의 서로 다른 branch 값을 가집니다. Call Forking 은 시간 간격을 두고 벨을 울리게 하는 순차적인 방법과 동시에 벨을 울리게 하는 방법이 있습니다.  


1) CANCEL

CANCEL 메시지는 벨소리를 중단시키기 위해 SIP Proxy 서버가 200 OK 응답을 전달하지 않은 다른 두 대의 전화기로 발행합니다. 

CANCEL sip:bob@192.168.10.20 /TCP SIP/2.0
Via: SIP/2.0/TCP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Server10 <sip:server10.biloxi.com>;tag=1928301774
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 6187 CANCEL
Contact: <sip:server10.biloxi.com>
Reason: SIP ;cause=200 ;text=”call completed elsewhere”
Content-Length: 0


CANCEL 메쏘드에서 핵심 헤더는 두 개입니다. 하나는 취소 사유를 명기하는 Reason 헤더이고, 다른 하나는 어떤 요청을 취소하는 지를 알 수 있는 Cseq 헤더입니다. 여기서 Reason 헤더의 값이 200 "Call completed elsewhere"이므로 다른 전화기가 응답하였기에 취소한다고 명시합니다.  




'엔지니어를 위한 인터넷 전화와 SIP의 이해'를 책으로 만들다


https://brunch.co.kr/@linecard/188


매거진의 이전글 10 장. SIP REGISTER의 이해
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari