brunch

You can make anything
by writing

C.S.Lewis

by 라인하트 Dec 17. 2018

19장. SIP PRACK의 이해

1. 응답의 두 가지 유형

기본 SIP Call Flow는 INVITE / 200 OK / ACK의 3 way Handshake입니다. 실제 통화에서는 옵션 메시지인 100 Trying과 180 Ringing이 추가됩니다. 

<그림 19-1> 일반적인 SIP Call Flow


RFC 3261에 따르면, 신뢰할 수 있는 응답과 신뢰할 수 없는 응답이 있습니다.  

 

Final Response (최종 응답)
요청(Request)에 대한 처리의 결과로써 생성
요청에 대한 응답으로 동작하므로 신뢰할 수 있는 응답 제공
예) INVITE에 대한 200 OK와 200 OK에 대한 ACK 


Provisional Response (임의 응답)
요청(Request)에 대한 처리 중인 정보를 제공
전달 후에 응답을 기다리지 않으므로 신뢰할 수 없는 응답
예) 100 Trying과 183 Session Progress  



2. 아직 설립되지 않은 세션에 신뢰할 수 있는 응답이 필요한 이유 

UAS 전화기는 100 Trying 또는 183 Session Progress와 같은 메시지를 200 OK Response 이전에 전송하면서 필요한 정보를 전달합니다. UAC 전화기는 INVITE 요청을 송신한 후 ACK 메쏘드 전까지는 정보를 전달할 방법이 없습니다. 즉, UAC는 200 OK 이전에 신뢰할 수 있는 응답을 제공하기 위해서는 기본적인 SIP호 프로시저와 다른 방법이 필요합니다. 


그렇다면 왜 200 OK 이전에 신뢰할 수 있는 응답을 제공해야 할까요? 200 OK 전에 Early Media Session을 위한 SDP 협상이 완료되기 위해 필요하기 때문입니다. UAS가 100 Trying에 SDP Offer를 싣을 경우에 UAC의 즉각적인 응답을 기대할 수 없습니다. UAC는 상대방이 수화기를 들고 200 OK를 보내주어야만 응답할 수 있는 ACK에 SDP Answer를 싣을 수 있습니다. 그래서, 200 OK이전에 언제든지 SDP Offer에 즉각적인 SDP Answer를 제공할 수 있는 방안이 필요합니다.  


또한, 임의 응답 (Provisional Response)인 180 Ringing에 대한 신뢰할 수 있는 응답을 받아야 할 경우에도 PRACK은 유용합니다.   



3. PRACK의 이해

PRACK은 Provisional Response ACKnowledgement의 약어로 RFC 3262 Reliability of Provisional Responses in the SIP에서 정의합니다. PRACK은 아직 설립되지 않은 세션에 대한 신뢰할 수 있는 응답을 제공하는 Provisional ACK입니다.  PRACK은 일반적인 요청과 마찬가지로 200 OK 응답을 받습니다. 


PRACK은 INVITE에 대한 100 Trying 이외의 101부터 199 Response에 대해서 신뢰할 수 있는 응답을 제공합니다. 100 Trying은 hop-by-hop으로 이루어지는 것으로 end-to-end 메커니즘이 아닙니다. hop-by-hop 은 100 Trying 이 INVITE의 최종 수신자인 밥에 의해 생성되는 것이 아니라 중간의 SIP Proxy 서버가 생성한다는 의미입니다.


<그림 19-2> PRACK


PRACK은 INVITE에 대한 200 OK 최종 응답(Final Response) 전에 UAC에 의해 생성되며 183 Session Progress라는 Provisional Resopse에 대한 응답이 PRACK에 포함됩니다. SIP 호 절차에 따른 메시지를 분석해 보겠습니다.      


1) 앨리스의 INVITE (SDP Offer)

앨리스는 밥에게 SDP Offer를 포함한 INVITE 요청을 발행합니다.

INVITE sip:bob@192.168.10.20 SIP/2.0
Via: SIP/2.0/TCP pc33.atlanta.com;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 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Requires: 100rel
Content-Type: application/sdp
Content-Length: 142

(SDP 정보는 생략) 

 

Requires 헤더는 100rel 메시지를 포함합니다. 100rel은 Provisional Response에 대한 신뢰성을 제공하기 위한 Option Tag입니다. UA들은 신뢰할 수 있는 Provisional Response 주고받을 수 있습니다.



2) 밥의 183 Session Progress (SDP Answer)

183 Session Progress는 임의 응답(Provisional Response)입니다.

SIP/2.0 183 Session Progress
Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bK776asdhds
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
RSeq: 813520
Contact: <sip:alice@pc33.atlanta.com>
Content-Type:application/sdp
Content-Length: 235

(SDP 정보 생략) 


Provisional Response는 Rseq 헤더로 squence number를 제공합니다. 만일, UAS가 100rel을 지원하지 않는다면, 420 Bad Extension 응답으로 거절하고 Unsupported 헤더에 사유를 명기합니다.




3) 앨리스의 PRACK (183 Session Progress)

PRACK 메쏘드는 183 Session Progress 응답에 대한 신뢰할 수 있는 응답을 나타냅니다. 즉, 183 Session Progress를 수신했음을 통지합니다. 


PRACK sip:bob@192.168.10.20 SIP/2.0
Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bK776asi98JK
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
RAck: 813520 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Length: 0


183 Session Progress의 Rseq 헤더의 값은 813520으로 PRACK의 RAck 헤더 값과 동일합니다. 즉, PRACK 요청은 183 Session Progress 헤더에 신뢰할 수 있는 응답을 제시하는 ACK를 의미합니다.



4) 200 OK (PRACK)

PRACK 요청에 대한 처리 결과로 신뢰할 수 있는 응답을 제공하는 200 OK입니다


200 OK sip:bob@192.168.10.20  SIP/2.0 
Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bK776asi98JK ;received=10.1.3.33
To: Bob <sip:bob@biloxi.com>; tag=a6c85e3
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID:a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 PRACK
Contact: <sip:alice@pc33.atlanta.com>
Content-Length: 0



4. PRACK을 통해 신뢰할 수 있는 SDP 협상하기

SDP Early Offer로 Early Media를 협상한다면 INVITE에서 SDP Offer가 발행하고 180 Ringing이나 183 Session Progress에서 SDP Answer를 합니다. PRACK은 200 OK 최종 응답(Final Response) 이전에 세션 파라미터에 대한 협상을 위해 사용합니다. PRACK은 183 Session Progress와 함께 전달된 SDP Answer가 정상적으로 전달되었음을 확인하여 주었으므로 3- way Handshake를 완료합니다.  


Delayed Offer로 Early Media를 협상한다면 180 Ringing이나 183 Session Progress에서 SDP Offer를 발행하고 PRACK에서 SDP Answer 합니다. PRACK에 대해서는 200 OK가 전달되면서 3- way Handshake를 완료합니다. 


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


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


매거진의 이전글 18장. Early Media를 위한 SIP 헤더
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari