Nexpert SIP 3 - SIP method on RFC 3261

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

Overview

원문은 이곳<ref>http://www.nexpert.net/491</ref>에서 확인할 수 있다.

SIP 호 절차를 이해하기 위해서는 SIP 메시지에 포함된 SIP 헤더를 잘 알아야 한다. SIP 헤더에 대한 기본적인 내용만 알고 있어도 쉽게 호 절차를 분석할 수 있다. 특히, 이기종 장비간 SIP Trunk 연동이나 단말 연동 시 장애가 발생할 경우에 SIP 패킷을 수집하여 분석하는 과정을 거치게 된다. SIP 헤더를 알지 못하면, 수집된 패킷은 암호문일 뿐이다.

SIP 주소 체계

PSTN 전화망은 E.164 주소 체계를 사용하고, 인터넷 망은 IP 주소 체계를 사용한다. E.164 주소 체계는 사람이 인식하기 쉬운 주소지만, IP 주소 체계는 어렵다.

SIP에서의 통화를 위한 주소 체계는 다양한 형식의 주소 방식을 지원한다.

  • FQDN(Fully-Qualified Domain Names)
인터넷 서핑을 할 때 웹브라우저에 입력하는 도메인 주소 체계이다. 도메인의 앞 자리에 사용자명 또는 단말기명을 붙여서 사용한다.
ex) sip:bob.cisco.com
  • SMTP 와 같은 Domain Names (RFC 2368)
메일 주소와 같은 방식을 사용한다.
ex) sip:bob@cisco.com
  • E.164 와 같은 주소
사용자 이름 부분에 전화번호를 넣어서 사용한다.
ex) sip:14085551234@gateway.com; user=home

주요 SIP Header 분석

일반적으로 SI 헤더에 포함되는 정보는 다음과 같다.

 INVITE sip:bob@biloxi.com SIP/2.0
 Via: SIP/2.0/UDP 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>
 Content-Type: application/sdp
 Content-Length: 142

SIP 헤더의 내용을 대충 이해할 수만 있어도 위의 메시지가 엘리스가 밥에게 보내는 SIP INVITE 메시지로 통화 요청을 위해 생성되었음을 알 수 있다.

메시지의 첫 줄에는 Method 와 메시지를 수신하는 최종 단말의 주소와 버전이 명기되므로 메시지가 생성된 목적을 확인할 수 있다.
INVITE : 요청한 메소드
sip:bob@biloxi.com : Request URI
SIP2.0 : 버전
Request URI 는 일반적으로 To 필드의 URI 값을 이요하여 표시한다.
이 내용은 Biloxi.com 도메인에 속해 있는 밥에게 전화를 걸고 싶다는 의미이다.
  • Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Via 헤더는 요청에 대한 응답의 경로를 나타낸다. branch 는 시공간에서 유일한 값을 가지며, 트랜젝션 식별자이다. 트랜젝션은 호 설정 또는 호 종료와 같은 단위 작업을 의미하며, User Agent 간에 생성된다.
이 내용은 SIP INVITE 요청에 대한 응답인 200 OK 를 엘리스에게 바로 전송하지 말고 pc33.atlanta.com 을 경유할 것을 요청한다는 의미이다.
  • Max-Forwards: 70
시그널링 경로 상에 SIP 서버의 최대 홉 수를 나타낸다. IP 네트워크의 TTL(Time to live) 과 같다.
SIP 메시지의 출발지와 목적지를 나타내지만, 실제 메시지의 라우팅에는 사용되지 않으며, Display Name 의 의미를 나타낸다.
이 내용은 엘리스가 밥에게 세션 설립을 요청하는 다이얼로그라는 의미이다.
From 과 To 헤더는 현재 세션의 진행방향을 의미하는 것으로 현재 메시지의 발신자와 수신자를 의미하는 것이 아니다. 따라서 SIP INVITE 메시지의 응답인 200 OK 에서 From 과 To 헤더의 내용이 바뀌지는 않는다. From 과 To 의 값이 엉뚱하게 적혀있어도 SIP 프로토콜이 진행되는 데는 문제가 없지만, 요즘에는 SIP 보안이 강화가 되면서 From 과 To 헤더가 잘못 명기되면 호가 진행되지 않기도 한다.
  • Call-ID: a84b4c76e66710@pc33.atlanta.com
세션에 대한 global unique identifier 로 사용하며, 호스트 네임 또는 IP address 와 시간을 조합하여 생성된다. To/From/Call-ID 의 결합으로 엘리스와 밥 간의 Peer-to-peer SIP 관계를 정의한다.
Call-ID 가 같으면, 하나의 다이얼로그로 인식하므로 세션의 설립과 종료 사이의 모든 SIP 메시지는 동일한 Call-ID 를 가진다. SIP 호 분석 시에 다수의 호가 혼재되어 있어도, Call-ID 를 기준으로 개별 호에 대한 분석이 가능하다. 다이얼로그는 다수의 트랜잭션으로 이루어질 수 있으므로 트랜잭션의 식별은 Via 헤더의 branch 값으로 추적하고, 다이얼로그의 식별은 Call-ID 와 From 및 To 의 Tag 로 추적한다.
  • CSeq: 314159 INVITE
Command Sequence 또는 Sequence number 는 정소와 메소드의 이름으로 나타낸다. 새로운 요청을 생성할 때마다 1씩 증가한다. 이 요청에 대한 응답인 200 OK 에서도 같은 값을 확인할 수 있다.
하나의 요청과 응답은 같은 CSeq 값을 가진다.
SIP URI 포멧으로 되어 있으며, 요청을 보낸 사용자에 대한 직접적인 경로를 나타낸다.
일반적으로 FQDN(Fully Qualified Domain Name)나 IP 주소를 선호한다. Via 헤더 필드가 요청에 대한 응답 경로를 나타내고, Contact 헤더 필드는 미래의 요청을 보낼 경로를 말한다. 요청에 대한 응답은 Via 헤더 필드를 참조하며, 신규 요청을 생성할 경우는 Contact 헤더 필드를 참조한다는 것이다.
  • Content-Type: application/sdp
메시지 바디가 있을 경우 메시지 바디에 대한 설명이다. application/sdp 는 SIP 메시지 바디가 SDP 메시지로 구성되었다는 의미이다.
  • Content-Length: 142
메시지 바디의 크기를 옥텟(바이트)로 표시한다. 메시지 바디가 142 바이트로 구성되어 있다는 의미이다.

SIP 헤더 분석하기 - SIP Proxy 가 없는 경우

지금까지 살펴본 SIP 헤더를 기준으로 SIP 호 절차를 분석해보자. 실제 구현되는 일반적인 사례는 아니지만, SIP 메시지를 이해하기 쉽도록 SIP 전화기 두 대 사이에 SIP Proxy 가 존재하지 않고, 엘리스의 전화기는 밥의 전화기 IP 주소를 알고 있다고 가정하자.

Sip basic without proxy.png

INVITE

엘리스가 수화기를 들고 밥의 전화번호를 누르는 순간 아래와 같이 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>
 Content-Type: application/sdp
 Content-Length: 142

From 과 To 헤더를 보면 엘리스가 밥에게 보내는 INVITE 요청인 것을 확인할 수 있다.

또한, INVITE의 요청에 대한 응답은 Via 헤더에서 표시한 pc33.atlanta.com 을 경유하라고 표시되어 있으며, CSeq 를 보면 314159 번의 INVITE 메시지인 것을 확인할 수 있다.

그리고 Content-Type 헤더를 보면 SIP 메시지에 SDP 가 포함되어 있음을 알 수 있다.

200 OK

밥의 전화기는 INVITE 를 수신 후에 벨 소리를 재생한다. 밥의 수화기를 드는 순간 200 OK 메시지가 엘리스에게 전달된다.

 SIP/2.0 200 OK
 Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=10.1.3.33
 To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
 From: Alice <sip:alice@atlanta.com>;tag=1928301774
 Call-ID: a84b4c76e66710@pc33.atlanta.com
 CSeq: 314159 INVITE
 Contact: <sip:bob@192.168.10.20>
 Content-Type: application/sdp
 Content-Length: 131

From 과 To 헤더는 현재 메시지의 출발지와 목적지가 아닌 호의 진행방향을 나타내는 것으로 INVITE 메시지의 From 과 To 헤더와 동일하다.

CSeq 헤더는 314159 INVITE 요청에 대한 응답임을 나타낸다. 패킷 분석 시 여러 호가 동시에 진행될 때 어떤 호에 대한 응답인지를 판단할 때 CSeq 를 통해 확인한다.

ACK

엘리스의 전화기가 200 OK 를 수신하였음을 확인하는 ACK 를 전송한다.

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

CSeq 가 314159 이므로 앞의 200 OK 에 대한 ACK 임을 확인할 수 있다.

BYE

BYE 세션은 발신자와 수신자 누구나 생성할 수 있다. 수화기를 먼저 내리는 쪽에서 BYE 가 전송된다.

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

From 과 To 헤더를 보면 세션의 진행방향은 밥이 엘리스에게 요청하는 다이얼로그이므로 밥이 먼저 수화기를 내려놓았음을 알 수 있다.

200 OK

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

CSeq 를 보면 BYE에 대한 OK 임을 알 수 있다.

SIP 헤더 분석하기 - SIP Proxy 가 있는 경우

실제 SIP 망을 구성할 때는 SIP Proxy 서버나 IP PBX 가 항상 존재한다. IP PBX 는 제품에 따라 SIP Proxy 로 구현하거나 B2BUA 로 구현된다. 엘리스의 전화기는 밥의 전화기 주소를 알지 못하므로 INVITE 메시지를 SIP Proxy 로 전송하는 과정부터 살펴보자.

Sip basic with proxy.png

INVITE (엘리스가 SIP Proxy 서버로 보내는 것)

엘리스는 밥에게 전송할 INVITE 메시지를 SIP Proxy 서버로 전송한다.

INVITE sip:bob@biloxi.com/TCP 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>
 Content-Type: application/sdp
 Content-Length: 142

INVITE (SIP Proxy 서버가 밥에게 보내는 것)

SIP Proxy 서버를 경유한 INVITE 메시지는 다음과 같이 Via 헤더와 Max-Forwards 헤더에 변화가 생겼다.

INVITE sip:bob@192.168.10.20/TCP SIP/2.0
Via: SIP/2.0/TCP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=10.1.3.33
Max-Forwards: 69
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>
Content-Type: application/sdp
Content-Length: 142

첫 번째 Via 헤더는 SIP Proxy 서버가 삽입한 것으로 INVITE 요청에 관한 응답이 SIP Proxy 를 경유하도록 요청한다. Max-Forwards 헤더가 70 에서 69로 줄었다. 한 개의 SIP 서버를 지날 때마다 1 씩 줄어든다.

CSeq 와 Call-ID 가 SIP Proxy 를 지나가지만 변경되지는 않았다. SIP Proxy 서버는 제한적으로 메시지를 추가/삭제 할 수 있지만, 새로운 세션을 생성하지는 않는다는 것을 의미한다.

200 OK (밥이 SIP Proxy 서버로 보내는 것)

밥은 INVITE 의 Via 헤더를 그대로 복사하여 200 OK 에 포함하였으므로 200 OK 가 SIP Proxy 서버를 경유한다.

 SIP/2.0 200 OK
 Via: SIP/2.0/TCP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1 ;received=192.168.10.1
 Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=10.1.3.33
 To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
 From: Alice <sip:alice@atlanta.com>;tag=1928301774
 Call-ID: a84b4c76e66710@pc33.atlanta.com
 CSeq: 314159 INVITE
 Contact: <sip:bob@192.168.10.20>
 Content-Type: application/sdp
 Content-Length: 131

200 OK (SIP Proxy 서버가 엘리스로 보내는 것)

Via 헤더가 하나 줄었다. SIP Proxy 서버가 임의로 삽입한 Via 헤더는 엘리스의 전화기에는 필요가 없으므로 SIP Proxy 가 삭제한다.

 SIP/2.0 200 OK
 Via: SIP/2.0/TCP pc33.atlanta.com;branch=z9hG4bKnashds8 ;received=10.1.3.33
 To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
 From: Alice <sip:alice@atlanta.com>;tag=1928301774
 Call-ID: a84b4c76e66710@pc33.atlanta.com
 CSeq: 314159 INVITE
 Contact: <sip:bob@192.168.10.20>
 Content-Type: application/sdp
 Content-Length: 131

ACK

엘리스의 전화기는 밥의 200 OK 를 정확히 수신했음을 확인하는 ACK를 밥의 전화기로 바로 보낸다. ACK는 새로운 신규 요청이므로 다이얼로그 상의 Contact 헤더를 직접 전달된다.

모든 SIP 메시지를 SIP Proxy 서버를 경유하게 하기

Via 헤더를 통해 INVITE 대한 200 OK 는 SIP Proxy 서버를 경유하지만, ACK 이하의 모든 신규 요청 메시지는 Contact 헤더를 참조하여 단말끼리 직접 송/수신한다.

기업의 IP PBX 는 호의 상태를 관리 및 과금 데이터 생성을 위해 호 절차의 모든 시그널링 메시지가 IP PBX 를 경유하도록 한다. B2BUA 가 아닌 SIP Proxy 서버가 자신에게 등록된 모든 단말의 시그널링이 경유되도록 하기 위해서는 기존 SIP 헤더를 변경하거나 새로운 SIP 헤더가 필요하다.

Reference

<references/>