[RFC 3261]Session Initiation Protocol (Header)

=================================== Keyword ======================================

Header : Accept, Accept-Encoding, Accept-Language, Alert-Info, Allow, Authentication-Info, Authorization, Call-ID, Call-Info, Contact, Content-Disposition, Content-Encoding, Content-Language, Content-Length, Content-Type, CSeq, Date, Error-Info, Expires, From, In-Reply-To, Max-Forwards, Min-Expires, MIME-Version, Organization, Priority, Proxy-Authenticate, Proxy-Authorization, Proxy-Require, Record-Route, Reply-To, Require, Retry-After, Route, Server, Subject, Supported, Timestamp, To, Unsupported, User-Agent, Via, Warning, WWW-Authenticate

=================================== Overview ======================================
이번 챕터는 SIP Protocol에서 사용하는 Header들에 대한 설명이다.
SIP에서는 Header에 대한 개념이 없다면 거의 모르는 것이라고 봐야 할 정도로 중요한 내용이다.
Header들이 호처리를 위한 모든 정보를 표현하기 때문이다.

=================================== Table of Contents ==============================
    20         Header Fields .......................................  159
   20.1       Accept ..............................................  161
   20.2       Accept-Encoding .....................................  163
   20.3       Accept-Language .....................................  164
   20.4       Alert-Info ..........................................  164
   20.5       Allow ...............................................  165
   20.6       Authentication-Info .................................  165
   20.7       Authorization .......................................  165
   20.8       Call-ID .............................................  166
   20.9       Call-Info ...........................................  166
   20.10      Contact .............................................  167
   20.11      Content-Disposition .................................  168
   20.12      Content-Encoding ....................................  169
   20.13      Content-Language ....................................  169
   20.14      Content-Length ......................................  169
   20.15      Content-Type ........................................  170
   20.16      CSeq ................................................  170
   20.17      Date ................................................  170
   20.18      Error-Info ..........................................  171
   20.19      Expires .............................................  171
   20.20      From ................................................  172
   20.21      In-Reply-To .........................................  172
   20.22      Max-Forwards ........................................  173
   20.23      Min-Expires .........................................  173
   20.24      MIME-Version ........................................  173
   20.25      Organization ........................................  174
   20.26      Priority ............................................  174
   20.27      Proxy-Authenticate ..................................  174
   20.28      Proxy-Authorization .................................  175
   20.29      Proxy-Require .......................................  175
   20.30      Record-Route ........................................  175
   20.31      Reply-To ............................................  176
   20.32      Require .............................................  176
   20.33      Retry-After .........................................  176
   20.34      Route ...............................................  177
   20.35      Server ..............................................  177
   20.36      Subject .............................................  177
   20.37      Supported ...........................................  178
   20.38      Timestamp ...........................................  178
   20.39      To ..................................................  178
   20.40      Unsupported .........................................  179
   20.41      User-Agent ..........................................  179
   20.42      Via .................................................  179
   20.43      Warning .............................................  180
   20.44      WWW-Authenticate ....................................  182

=================================== 내용 정리 ===================================
SIP Protocol에서 Header는 호처리에 대한 모든 정보를 표현하며, 이 값들을 이용하여 호의 성립, 추가 기능 제공, 호 종료에 이용된다.
Header는 사용에 관해서 여러가지 주의점이 있다. 
최대길이 : 한 Header의 최대 길이는 1000 character를 넘을수 없다는 것 또한 주의 해야 한다. (RFC 2822 Section 2.1.1 Line Length)
멀티라인 : 멀티라인으로 표현되는 Header는 연속되어 있어야 한다. 한개만 사용할 수 있는 Header들도 존재 함으로, 사용에 주의 해야 한다.
사용 가능정보 : 사용할 수 있는 Message Type, Method등으 정의 되어 있다. 각 Header별로 그 사용할 수 있는 범위가 정의 되어 있으므로 사용에 주의 해야 한다.

== 사용정보 ==

Header는 Message Type(Request/Response)에따라, 혹은 Method에 따라 혹은 Response Code에 따라 사용여부가 다 다르다. 따라서 다음의 값을 알고 있어야 추가 Header들의 사용 가능 정보를 파악하기 용의할 것이다.
사용 가능 정보표현은 "where", "proxy", "method" 3가지 영역으로 나뉜다. 
 
----------------------------  Where 사용 정보 --------------------------
R : 오직 Request Message에서만 사용할 수 있는 Header
r : 오직 Response Messag에서만 사용할 수 있는 Header
2xx, 4xx, etc : 지정된 Response Code 영역에서만 사용할 수 있는 Header
c : Request Message에서 값을 복사해서 Response에 사용해야 하는 Header

표시가 없으면 모든 Request, Response에서 사용이 가능한 Header를 의미한다.
------------------------------------------------------------------------
----------------------------  Proxy 사용 정보 --------------------------
a : Proxy에서 추가 가능한 Header
m : Proxy에서 변경만 할 수 있는 Header
d : Proxy에서 삭제만 할 수 있는 Header
r : Proxy에서 읽을수만 있는 Header
------------------------------------------------------------------------
----------------------------  Method  사용 정보 -------------------------
c : 조건에 따라 사용이 가능한 Header (Conditional)
m : 반드시 들어가야 하는 Header (Madatory)
m* : 사용할 수 있으나 UAC/UAS모두 Message에 이 Header가 존재하지 않아도 처리 할 수 있어야 한다.
o : 넣어도 되고 안넣어도 되는 Header (Optional)
t : m*와 동일하다. 하지만 TCP같은 Stream-based Protocol을 사용하는 Stack이라면 반드시 사용되어야 한다.
* : 이 Header들은 SIP Message Body가 존재한다면 반드시 사용되어 한다.
- : 적절치 못한 Header (사용하지 말라는 뜻, 사용하면 Fail Response 가 올 것이다.)
------------------------------------------------------------------------

위의 정보표현을 사용하여 각 Header별로 사용정보를 표현한 Table은 RFC 3261의 "Page 162" 부터 참고하면 된다.


== Accept Header ==

받아 들일 수 있는 Body Type을 표현한다. Optional이기에 Accept Header가 존재 하지 않는다면 UAS는 Default값인 "application/sdp"를 받을 수 있는 것으로 판단한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Accept                  R                    -     o      -     o     m*  o
      Accept                 2xx                  -     -      -     o     m*  o
      Accept                 415                   -     c      -    c     c     c
------------------------------------------------------------------------
---------------------------- Header  ABNF -----------------------------
Accept       = "Accept" ":" #( media-range [ accept-params ] )
media-range      = ( "*/*" | ( type "/" "*" ) | ( type "/" subtype ) )
                        *( ";" parameter )
parameter     = attribute "=" value
attribute     = token
value         = token | quoted-string
accept-params    = ";" "q" "=" qvalue *( accept-extension )
accept-extension = ";" token [ "=" ( token | quoted-string ) ]
qvalue         = ( "0" [ "." 0*3DIGIT ] ) | ( "1" [ "." 0*3("0") ] )
ex = "Accept : application/sdp, text/plain"
------------------------------------------------------------------------


== Accept-Encoding Header ==

받아 들일 수 있는 Body의 Encoding Type을 표현한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Accept-Encoding         R             -       o      -    o      o     o
      Accept-Encoding        2xx           -       -      -    o      m*   o
      Accept-Encoding        415            -       c     -    c      c      c
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Accept-Encoding  = "Accept-Encoding" ":" #( content-coding )
content-coding   = token
ex = "Accept-Encoding : gzip"
------------------------------------------------------------------------


== Accept-Language Header ==

받아들일 수 있는 Reason phrases, Session Descriptions(SDP), Response의 Body등의 Language를 표현한다.
Header가 없다면 UAS는 UAC에서 모든 Language들을 받아 들일 수 있는 것으로 판단한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Accept-Language        R             -       o      -    o      o     o
      Accept-Language       2xx           -       -      -    o      m*   o
      Accept-Language       415            -       c     -    c      c      c
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q" "=" qvalue ] )
language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
ex = "Accept-Language : da, en-gb;q-0.8
------------------------------------------------------------------------


== Alert-Info Header ==

INVITE에 있으면 UAS에서 Ring에, 180 Response에 있으면 UAC에서 Ring back tone에 사용할 음원정보를 표현한다.
하지만 실제로 이것을 사용하는 것은 본적이 없다.
일반적으로 단말은 일반적인 Signal 처리만 하고, 기반 망에 있는 MS (Media Server)에서 음원을 송출하는 형태를 보았다.
우리나라 최초의 MRBT Service 부터 특정 서버가 음원을 송출하도록 설계되어있다. (내가 모를 망에서는 사용할 지 모르지만..)

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Alert-Info              R           ar       -      -      -     o     -     -
      Alert-Info             180          ar      -       -     -      o     -     -
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Alert-Info     =  "Alert-Info" ":" # ( "<" URI ">" *( ";" generic-param ))
generic-param  =  token [ "=" ( token | host | quoted-string ) ]
ex = "Alert-Info : <http://www.example.com/sounds/moo.wav>"
------------------------------------------------------------------------


== Allow Header ==

UA가 받아 들일 수 있고, 처리할 수 있는 Method의 List를 표현한다. 다른 SIP Element들과 통신 할 경우 처리가 불가능한 Method는 보내지 않도록 하는 예외처리 할 때 사용할 수 있다.
예를 들어 Session-Timer를 사용하려고 할 때, UPDATE가 Allow Header에 없다면 Re-INVITE를 사용하고, UPDATE가 있다면, UPDATE를 사용하여 Session Refrash를 할 수 있도록 하는 방법이다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Allow                    R                    -      o      -    o     o      o
      Allow                   2xx                  -      o      -    m*   m*   o
      Allow                    r                     -      o      -    o     o      o
      Allow                   405                   -      m     -    m    m    m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Allow  =  "Allow" ":" 1#Method
Method            =  "INVITE" | "ACK" | "OPTIONS" | "BYE"
                          | "CANCEL" | "REGISTER" | extension-method
ex = "Allow : INVITE, ACK, CANCEL, BYE"
------------------------------------------------------------------------


== Authentication-Info Header ==

HTTP Digest로 상호인증을 할 때 사용된다. UAS에서 Reqeust의 Authorization Header field 값을 기본으로 Digest 인증에 성공한다면 2xx Response때 이 Header Field를 넣어야 한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
 Authentication-Info      2xx                 -      o      -     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Authentication-Info = "Authentication-Info" HCOLON ainfo *(COMMA ainfo) 
ainfo = nextnonce / message-qop / response-auth / cnonce / nonce-count  
nextnonce = "nextnonce" EQUAL nonce-value 
response-auth = "rspauth" EQUAL response-digest 
response-digest = LDQUOT *LHEX RDQUOT
ex = "Authentication-Info : nextnonce="468761df3s4df54sd51f351"
------------------------------------------------------------------------


== Authorization Header ==

인증처리를 위한 정보를 갖는다. 이 헤더의 특징은 멀티라인 룰과 싱글라인 룰을 따르지 않는다는 것이다.(??)

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     Authorization           R                   o      o      o     o     o    o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Authorization    =  "Authorization" ":" "pgp" # pgp-response
pgp-response     =  realm | pgp-version | pgp-signature
                             | signed-by | nonce
realm        =  "realm" "=" realm-value
realm-value      =  quoted-string
pgp-signature    =  "signature" "=" quoted-string
signed-by        =  "signed-by" "=" <"> URI <">
ex = "Authorizaation : Digest username="Alice", realm="atlanta.com", nonce="846a4sdf84sd", response="54as65df46"
------------------------------------------------------------------------


== Call-ID Header ==

Call을 구분지을 때 사용하는 Header이다. 이 값을 이용해서 각 Dailog를 구분하는데 사용하는데, Unique한 값을 사용해야한다.
하지만 이값이 항상 Unique하다는 것은 아니다. 생각 해보라 모든 단말기, 서버등이 자체적으로 만들어 내는데 어떻게 Unique하게 하겠는가? 그래서 Dialog나 Transaction을 찾을 때는, 이 값 이외에 Via branch, To/From Value와 Tag, CSeq값등을 사용하여 찾는다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     Call-ID                     c          r      m      m    m    m    m    m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Call-ID = ( "Call-ID" / "i" ) HCOLON callid
callid = word [ "@" word ]
ex = "Call-ID: 923u5oijasdp9ufpoj@xxx.com"
------------------------------------------------------------------------


== Call-Info Header ==

Call-Info Header는 Callre나 Callee에 대한 추가적인 정보를 제공하기 위해 사용된다. (아직 망에서 특정용도로 사용해본적은 없다.)

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
    Call-Info                              ar      -      -       -    o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Call-Info   =  "Call-Info" ":" # ( "<" URI ">" *( ";" info-param) )
info-param  =  "purpose" "=" ( "icon" | "info" | "card" | token ) |   generic-param
ex = "Call-Info: <http://example.com/alice/photo.jpg>;purpose=icon,<http://example.com/alice/>;purpose=info"
------------------------------------------------------------------------


== Contact Header ==

Contact Header는 호를 위한 여러가지 정보를 갖는다.
 - 호가 성립된 이후 자신이 받아 들일 수 있는 접속정보 (INVITE 등)
 - 등록상태가 만료 되는 유지 시간 정보 (REGISTER)
 - 자신이 지원하는 미디어 정보 (REGISTER, INVITE 등)

호가 성립될 때 각각의 UA는 자신의 접속정보를 Contact Header에 보내야 하며,
성립된 이후에는 각각의 UA는 상대방의 접속정보인 Contact Header Field값의 정보를 기억해야 한다.
하지만 망마다, 또는 단말 마다 아래 Header사용정보대로 지키지 않는 곳들이 있기 때문에(Contact Header가 없으면 Fail을 주는 곳이 있다.) 망에 맞추어 사용해야 된다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Contact                 R                    o     -      -     m     o    o
      Contact                 1xx                 -     -      -     o      -    -
      Contact                 2xx                 -     -      -     m     o    o
      Contact                 3xx        d       -     o      -     o      o    o
      Contact                 485                 -     o      -     o      o    o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Contact           = ( "Contact" | "m" ) ":"
                    ("*" | (1# (( name-addr | addr-spec )
                    *( ";" contact-params ) )))
name-addr         = [ display-name ] "<" addr-spec ">"
addr-spec         = SIP-URL | URI
display-name      = *token | quoted-string
contact-params    = "q" "=" qvalue |
                    "action" "=" "proxy" | "redirect" |
                    "expires" "=" delta-seconds | <"> SIP-date <"> |
                    contact-extension
qvalue            = ( "0" [ "." 0*3DIGIT ] ) | ( "1" [ "." 0*3("0") ] )
contact-extension = generic-param
generic-param     = token [ "=" ( token | host | quoted-string ) ]
ex = "Contact: "JS.Song <SIP:JS.SOng@xxx.com>;expires=3600"
------------------------------------------------------------------------


== Content-Disposition Header ==

Content-Disposition Header는 Message Body가 어떠한지 묘사한다.
예를 들어 "session"이라는 Type값이 있다면, Body가 Session용 이라는 것을 말한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Content-Disposition                      o     o     -       o    o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Content-Disposition   =  "Content-Disposition" ":" disposition-type *( ";" disposition-param )
disposition-type      =  "render" | "session" | "icon" | "alert" | disp-extension-token
disposition-param     =  "handling" "=" ( "optional" | "required" | other-handling ) |   generic-param
other-handling        =  token
disp-extension-token  =  token
ex = "Content-Disposition : session"
------------------------------------------------------------------------


== Content-Encoding Header ==

Content-Encoding Header는 Body의 압축형태에 대해 묘사한다.
일반적인 호의 Body는 망에서는 최대 500~600 Byte를 넘지 않고, 비압축 하여 사용되기 때문에 이 Header는 사용되지 않는다. 아마 MMS나 이미지 전송같은데 사용되기 위해서 정의 된 것 같은데, 아직 본적은 없다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Content-Encoding                        o      o     -     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Content-Encoding  =  ( "Content-Encoding" | "e" ) ":" 1#content-coding
content-coding   = token
ex = "Content-Encoding : gzip"
------------------------------------------------------------------------


== Content-Language Header ==

권고안에서는 H14.12절을 보라고만 명시 되어 있다.
Accept-Language Header는 받아 들일 수 있는 Language를 표현한다고 설명했다. 이 Header는 실제 Body의 Language를 표현한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Content-Language                       o     o       -     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Content-Language  = "Content-Language" ":" 1#language-tag
language-tag  = primary-tag *( "-" subtag )
primary-tag   = 1*8ALPHA
subtag        = 1*8ALPHA
ex = "Content-Language : fr"
------------------------------------------------------------------------


== Content-Length Header ==

Content-Length Header는 Message Body의 길이를 표현한다.
주의점은 이 Header는 TCP같은 Stream-base Protocol 에서는 반드시 존재 해야 한다는 것이다.
UDP같은 Protocol에서는 Body가 없을 때는 이 Header가 메시지에 없어도 무방하게 처리 되어야 한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Content-Length                  ar       t       t      t      t      t      t
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Content-Length  =  ( "Content-Length" | "l" ) ":" 1*DIGIT
ex = "Content-Length : 341"
------------------------------------------------------------------------


== Content-Type Header ==

Content-Type Header는 Body Type을 표현한다.
이 Header는 Body가 존재한다면 반드시 Message 내에 존재 해야 한다.
Body가 없다면 없어도 무방하다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Content-Type                               *     *     -     *      *     *
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Content-Type  =  ( "Content-Type" | "c" ) ":" media-type
media-type    = type "/" subtype *( ";" parameter )
type          = token
subtype       = token
parameter     = attribute "=" value
attribute     = token
value         = token | quoted-string
ex = "Content-Type: application/sdp"
------------------------------------------------------------------------


== CSeq Header ==

CSeq Header는 현재 메시지의 Sequence Number와 Method의 정보를 표현한다.
이 값을 이용하여 Transaction과 Dialog를 판별하며, 루핑같이 뒤늦게 들어오는 Message를 Discard하는 등의 정보로 사용된다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      CSeq                       c         r      m     m     m     m   m   m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
CSeq     =  "CSeq" ":" 1*DIGIT Method
ex = "CSeq: 1290481 INVITE"
------------------------------------------------------------------------


== Date Header ==

Date Header는 날짜와 시간을 표현한다. 각각의 UA끼리 동기를 맞추기 위해 사용된다는데..
호처리에 영향을 주는 것도 아니고, 실제로 잘 사용하지 않는 Header이다.
Media는 RTCP로 동기화 하고, Signal은 그렇게 시간과 상관없고.. 과금같은 경우는 NTP를 사용해서 처리도 가능하니..
과연, 어떠한 경우에 유용하게 사용되는지 모르겠다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Date                                   a      o       o     o     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
 Date      =  "Date" ":" SIP-date
SIP-date  =  rfc1123-date
* RFC 1123 
5.2.14  RFC-822 Date and Time Specification: RFC-822 Section 5
          The syntax for the date is hereby changed to:
           date = 1*2DIGIT month 2*4DIGIT

* RFC 822
date-time   =  [ day "," ] date time 
day         =  "Mon"  / "Tue" /  "Wed"  / "Thu" /  "Fri"  / "Sat" /  "Sun"
date        =  1*2DIGIT month 2DIGIT
month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr"
                /  "May"  /  "Jun" /  "Jul"  /  "Aug"
                /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"
time        =  hour zone                    ; ANSI and Military
hour        =  2DIGIT ":" 2DIGIT [":" 2DIGIT]   ; 00:00:00 - 23:59:59
zone        =  "UT"  / "GMT" / "EST"/ "EDT" / "CST"/"CDT" /"MST"/ "MDT" / "PST"/ "PDT"/ 1ALPHA 
                   / ( ("+" / "-") 4DIGIT ) 
ex = "Date: Sat, 13 Nov 2010 23:29:00 GMT"
------------------------------------------------------------------------



== Error-Info Header ==

Error-Info Header는 error status response의 추가적인 정보를 표현하기 위하여 정의 되었다.
하지만, 망에서는 이 Header보다 이후에 정의된 Reason을 주로 사용한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Error-Info           300-699      a       -      o      o    o      o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Error-Info  =  "Error-Info" ":" # ( "<" URI ">" *( ";" generic-param ))
generic-param     = token [ "=" ( token | host | quoted-string ) ]\
ex = "Error-Info: <sip:not-in-service-recording@atlanta.com"
------------------------------------------------------------------------


== Expires Header ==

Expires Header는 Message가 Expires 되는 시간을 표현한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Expires                                       -      -     -     o      -     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Expires  =  "Expires" ":" ( SIP-date | delta-seconds )
ex = "Expires : 60"
------------------------------------------------------------------------


== From Header ==

From Header는 Message의 발송자를 표현한다.
Caller, Callee를 의미 하는 것이 아닌 현재 메시지의 Request를 생성 및 발송한 UA를 표현 하는 것이므로,
호의 시작인 INVITE와 성립된 이후의 메시지에서 From의 값이 다를 수 있다는 것을 기억해야 한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      From                      c           r      m     m    m    m    m    m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
From        =  ( "From" | "f" ) ":" ( name-addr | addr-spec ) * ( ";" from-param )
from-param  =  tag-param | generic-param
tag-param   =  "tag" "=" token
ex = "From: <sip:JS.Song@xxx.com>;tags=sadfi21x"
------------------------------------------------------------------------


== In-Reply-To Header ==

In-Reply-To Header를 이용하여 여러개의 Call-ID값을 Cache하고, 이 값으로 Call을 Filtering하는데 사용한다고 하는데..
하직 사용해 본적도, 요구하는 망의 FLow도 없었기에.. 정확한 사용용도는 모르겠다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     In-Reply-To              R                  -     -      -     o     -     -
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
In-Reply-To  =  "In-Reply-To" ":" 1# callid
ex = "In-Reply-To: 70710@saturn.bell-tel.com, 17320@saturn.bell-tel.com"
------------------------------------------------------------------------


== Max-Forwards Header ==

Max-Forwards Header는 SIP Message가 최대 Forward되는 횟수를 표현한다.
이 값을 이용하여 Looping을 방지하는데 사용되는데 각 Server는 Forward 할 때 마다 값을 확인하고,
1씩 감소한 값으로 변경해야 한다.
값의 범위는 0 ~ 255이지만 일반적으로 70부터 시작한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     Max-Forwards            R      amr    m    m     m    m   m     m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Max-Forwards : "Max-Forwards" HCOLON 1*DIGIT
ex = "Max-Forwards : 70"
------------------------------------------------------------------------


== Min-Expires Header ==

Min-Expires Header는 Refresh Interval의 최소 값을 표현한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     Min-Expires            423                 -      -     -      -     -    m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Min-Expires : "Min-Expires" HCOLON 1*DIGIT
ex = "Min-Expires : 70"
------------------------------------------------------------------------


== MIME-Version Header ==

권고안에서는 H19.4.1절을 보라고만 명시 되어 있다.
MIME-Version Header는 Message의 MIME-formatted를 표현한다.
아직 사용해 본적은 없다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     MIME-Version                              o      o      -    o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
MIME-Version = "MIME-Version" HCOLON 1*DIGIT "." 1*DIGIT
ex = "MIME-Version : 1.0"
------------------------------------------------------------------------


== Organization Header ==

Organization Header는 일반적으로 SIP Eelement의 개발한 곳의 정보를 표현한다.
즉, 회사명이 보통 들어간다. 호 처리 하고는 전혀 상관없다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Organization                      ar       -      -      -     o     o    o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Organization : "Organization" HCOLON [TEXT-UTF8-TRIM]
ex = "Organization: SIP Stack by JS.SONG"
------------------------------------------------------------------------


== Priority Header ==

Priority Header는 SIP Message의 우선순위등을 표현하여 긴급한 메시지표현 할 때 사용한다고 한다.
예가 있기는 한데.. 정확히 어느 시점에 사용해야 하는지.. 모르겠다.. 
아직 망에서 보지 못했다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
      Priority                    R          ar     -      -      -     o     -    -
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Priority = "Priority" HCOLON priority-value
priority-value = "emergency" / "urgent" / "nomal" / "non-urgent" / other-priority
other-pritority = token
ex = "Priority: nomal"
------------------------------------------------------------------------


== Proxy-Authenticate Header ==

Proxy-Authenticate Header는 인증처리를 하는 Proxy를 위하여 사용되는 Header이다.
Proxy-Authorization Header와 연계하여 사용된다.
아직 망에서 Proxy마다 인증처리를 요구하는 Header를 아직 본적이 없다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      ___________________________________________________________
     Proxy-Authenticate    407      ar      -     m     -      m   m    m
     Proxy-Authenticate    401      ar      -      o     o      o    o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Proxy-Authenticate = "Proxy-Authenticate" HCOLON challenge  
challenge = ("Digest" LWS digest-cln *(COMMA digest-cln)) / other-challenge 
other-challenge = auth-scheme / auth-param *(COMMA auth-param) 
digest-cln = realm / domain / nonce / opaque / stale / algorithm
                  / qop-options / auth-param 
realm = "realm" EQUAL realm-value 
realm-value = quoted-string 
domain = "domain" EQUAL LDQUOT URI *( 1*SP URI ) RDQUOT 
URI = absoluteURI / abs-path 
opaque = "opaque" EQUAL quoted-string 
stale = "stale" EQUAL ( "true" / "false" ) 
qop-options = "qop" EQUAL LDQUOT qop-value *("," qop-value) RDQUOT 
qop-value = "auth" / "auth-int" / token
ex = "Proxy-Authenticate: Digest realm="atlanta.com",
       domain="sip:ss1.carrier.com", qop="auth",
       nonce="f84f1cec41e6cbe5aea9c8e88d359",
       opaque="", stale=FALSE, algorithm=MD5"
------------------------------------------------------------------------


== Proxy-Authorization Header ==

Proxy-Authorization Header는 Proxy에서 인증을 요구 하는경우 Client에서 생성하여 전달하는 Header이다.
인증에 관련된 정보가 이 Header에 값으로 사용된다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
    Proxy-Authorization    R        dr       o      o      -    o     o    o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Proxy-Authenticate = "Proxy-Authenticate" HCOLON challenge  
challenge = ("Digest" LWS digest-cln *(COMMA digest-cln)) / other-challenge 
other-challenge = auth-scheme / auth-param *(COMMA auth-param) 
digest-cln = realm / domain / nonce / opaque / stale / algorithm
                  / qop-options / auth-param 
realm = "realm" EQUAL realm-value 
realm-value = quoted-string 
domain = "domain" EQUAL LDQUOT URI *( 1*SP URI ) RDQUOT 
URI = absoluteURI / abs-path 
opaque = "opaque" EQUAL quoted-string 
stale = "stale" EQUAL ( "true" / "false" ) 
qop-options = "qop" EQUAL LDQUOT qop-value *("," qop-value) RDQUOT 
qop-value = "auth" / "auth-int" / token
ex = "Proxy-Authenticate: Digest realm="atlanta.com",
       domain="sip:ss1.carrier.com", qop="auth",
       nonce="f84f1cec41e6cbe5aea9c8e88d359",
       opaque="", stale=FALSE, algorithm=MD5"
------------------------------------------------------------------------


== Proxy-Require Header ==

Proxy-Require Header는 Proxy가 지원하고 사용하고자 하는 기능들을 표현하고자 할 때 사용된다.
동작방법 Require Header를 참조하면 된다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
    Proxy-Require            R         ar      -     o     -      o     o    o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Proxy-Require = "Proxy-Require" HCOLON option-tag * (COMMA option-tag)
ex = "Proxy-Require : foo"
------------------------------------------------------------------------


== Record-Route Header ==

Record-Route Header는 Routing 정보를 UA에게 알려주기 위하여 사용된다.

Bob                       A (Proxy)                  B (Proxy)                  Allice

         ---- INVITE --->
                                    ----- INVITE  ---->
                                    (Record-Route :  A )
                                                                   ----- INVITE  ---->
                                                                  (Record-Route :  A, B )
                                                                   <---- 200 Ok  -----
                                                                  (Record-Route :  A, B )
                                    <---- 200 Ok  -----
                                    (Record-Route :  A, B )
          <---- 200 Ok  -----
          (Record-Route :  A, B )

이 때 주의 할 점은 UAS(Allice)는 Recored-Route의 값의 순서대로 이 Header값을 기억하면 되지만,
UAC(Bob)은 역순으로 이 Header값을 기억해야 한다.
그리고, ACK나 CANCEL Request Message는 Proxy에서 이 값과 관계없이 Down Stream을 기억하고 같은 곳으로 전달 해야 한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
   Record-Route            R          ar      o      o     o      o    o     -
   Record-Route         2xx,18x    mr      -      o     o     o     o     -
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Record-Route = "Record-Route" HCOLON rec-route * (COMMA rec-route)
rec-route = name-addr * (SEMI rr-param)
rr-param = generic-param
ex = "Record-Route: sip:JS.SONG@Proxy_1.com;lr, sip:JS.SONG@Proxy_2.com"
------------------------------------------------------------------------


== Reply-To Header ==

Reply-To Header는 From Header와 다른 URI값을 갖는다.
이 Header의 값을 이용하여 다른 URI정보를 넘기는데 사용된다.
망에서 가끔 발신자 정보를 변경하기 위하여 사용되기도 한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
   Reply-To                                        -     -      -     o     -     -
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Reply-To = "Reply-To" HCOLON rplyto-spec
rplyto-sepc = (name-addr / addr-spec) * (SEMI rplyto-param)
rplyto-param = generic-param
ex = "Reply-To: JS.SONG <sip:JS.SONG@xxx.com>
------------------------------------------------------------------------


== Require Header ==

Require Header는 UAC와 UAS간에 사용하고자 하는 기능을 option-tag를 이용하여 표현한다.
이 때, 지원하지 않는 기능을 요구할 때는 Fail Response를 수신하게 된다.
따라서 Supported로 지원되는 기능을 UAC에서 UAS에게 전달하여, 기능을 사용하고자 하던지,
또는 OPTIONS를 이용하여 미리 지원되는 기능을 판단후에 Request Header에 사용하는 것이 좋다.
대표적은 예로 PRACK을 사용하고자 하는 100rel option-tag다

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
   Require                                 ar      -      c      -     c     c    c
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Require = "Require" HCOLON option-tag * (COMMMA option-tag)
option-tag = token
ex = "Require : 100rel"
------------------------------------------------------------------------


== Retry-After Header ==

Retry-After Header는 UAS에 요청한 Message에 대해서 UAS에서 일정시간후 재 시도 하라는 정보를 알려주고자 할 때 사용된다.
SIP Protocol의 주는 호연결 이고, 주체는 사람이므로, 자주 사용되는 Header는 아니다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
       Retry-After      404,413,480,            -     o     o     o    o      o
       Retry-After      486,500,503             -     o     o     o    o      o
       Retry-After      600,603                   -     o     o     o   o      o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Retry-After = "Retry-After" HCOLON delta-seconds [comment] * (SEMI retry-param)
retry-param = ("duration" EQUAL delta-seconds) / generic-param
ex = "Retry-After: 18000;duration=3600"
------------------------------------------------------------------------


== Route Header ==

Route Header는 Request Message가 가야할 Routing정보를 담고 있다. 이 정보와 Request-URI값을 이용하여 Proxy가 Next Hop을 결정하여 Message를 전달한다. Message를 전달 할때는 자신의 정보를 삭제하고 전달 해야 한다.
이때 이해해야 할 부분이 Strict-Routing과 Loose-Routing인데 이는 Proxy 에서 기술 하겠다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
       Route                      R       adr     c      c      c    c     c     c
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Route = "Route" HCOLON route-param * (COMMA route-param)
route-param = naem-addr * (SEMI rr-param)
ex = "Route: sip:JS.SONG@Proxy_1.com;lr, sip:JS.SONG@Proxy_2.com"
------------------------------------------------------------------------


== Server Header ==

Server Header는 UAS의 software의 정보를 표현하는데 사용된다.
호처리하고는 전혀 상관없는 Header이다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
      Server                      r                  -      o     o     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Server = "Server" HCOLON server-val * (LWS server-val)
server-val = product / comment
product = token [SLASH product-version]
product-version = token
ex = "Serve : JS.SONG Stack Ver.2"
------------------------------------------------------------------------


== Subject Header ==

Subject Header는 호의 정보를 표현하기 위해 사용된다.
망에서 이 Header를 특별한 의미로 사용하는 것은 아직 본적이 없다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
      Subject                    R                 -      -      -     o     -    -
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Subject = ( "Subject" / "s" ) HCOLON [TEXT-UTF8-TRIM]
ex = "Subject: Go Home"
------------------------------------------------------------------------


== Supported Header ==

Supported Header는 지원하는 추가 기능을 상대측에 알려주기 위하여 사용된다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
     Supported                 R                  -     o     o     m*   o     o
     Supported                2xx                -     o     o     m*   m*   o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Supported = ("Supported" / "k") HCOLON [option-tag * (COMMA option-tag)]
ex = "Supported : 100rel"
------------------------------------------------------------------------


== Timestamp Header ==

Timestamp Header는 UAC가 UAS에게 Request보낸 때를 표현하기 위해 사용된다.
실제 사용하는 망은 보지 못했다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
     Timestamp                                   o     o      o    o     o      o    
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Timestamp = "Timestamp" HCOLON 1*(DIGIT) ["." *(DIGITI)] [LWS delay]
delay = *(DIGIT) ["." *(DIGITI]
------------------------------------------------------------------------


== To Header ==

To Header는 UAS를 표현한다. 이 값의 형태는 From Header와 동일 하다.
다른 점은 From Header는 UAC에서 tag를 생성하여 전달 하지만, To Header의 tag는 UAS에서 추가한다.
이 tag값은 호가 종료되는 시점까지 변경되지 않는다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
     To                         c(1)        r      m    m     m    m    m    m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
To        =  ( "To" | "t" ) ":" ( name-addr | addr-spec ) *( ";" to-param )
to-param  =  tag-param | generic-param
ex = "To: sip:JS.SONG@xxx.com;tag=s98ufijx"
------------------------------------------------------------------------


== Unsupported Header ==

Unsupported Header는 지원되지 않는 기능을 UAC에서 요구할 때 UAS에서 이를 알려주기 위해 사용된다.
지원하지 않는 기능을 Require Header를 이용하여 UAC에서 사용하자고 알려온다면,
UAS는 Fail Response에 Unsupported Header에 지원하지 않는 기능들을 알려줄 수 있다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
     Unsupported            420                 -     m    -     m    m    m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Unsupported = "Unsupported" HCOLON option-tag *(COMMA option-tag)
ex = "Unsupported: 100rel"
------------------------------------------------------------------------


== User-Agent Header ==

User-Agent는 UAC의 정보를 표현하기 위해 사용된다. 
호에 영향을 주지 않는다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
     User-Agent                                   o     o     o     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
User-Agent = "User-Agent" HCOLN server-val *(LWS server-val)
ex = "User-Agent: Softphone Beta 1.5"
------------------------------------------------------------------------


== Via Header ==

Via Header는 Request 메시지가 거처간 SIP Element의 정보를 가지며, 이 값을 사용하여 Response가 Routing될 정보로 사용된다. 추가적으로 Transaction을 판단하는데 이 Header의 Branch Tag가 사용되며, 그 외에도 여러 용도로 사용되는 중요 Header중에 하나이다.
중요한 점은 Brach의 값이 magic cookie "z9hG4bK"로 시작해야 한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
      Via                         R        amr    m    m     m    m    m   m
       Via                        rc        dr      m    m     m    m    m   m
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Via          =   ( "Via" | "v" ) ":" 1#( sent-protocol sent-by *( ";" via-params ) [comment] )
sent-protocol    =   protocol-name "/" protocol-version "/" transport
protocol-name    =   "SIP" | token
protocol-version =   token
transport        =   "UDP" | "TCP" | token
sent-by      =   ( host [":" port] ) | ( concealed-host )
concealed-host   =   token
via-params       =   via-hidden | via-ttl | via-maddr | via-received |
                            via-branch | via-extension
via-hidden       =   "hidden"
via-ttl      =   "ttl" "=" ttl
via-maddr        =   "maddr" "=" maddr
via-received     =   "received" "=" host
via-branch       =   "branch" "=" token
via-extension    =   generic-param
generic-param    =   token ["=" ( token | quoted-string )]
comment      =   "(" *( ctext | quoted-pair | comment ) ")"
quoted-pair      =   " \ " CHAR
ex = "Via: SIP/2.0/UDP JS.SONG.proxy.com;brach=z9hG4bKa7c6a8dlze"
------------------------------------------------------------------------


== Warning Header ==

Waring Header도 Response의 추가적인 정보를 제공하고자 사용한다.
하지만, 잘 사용하지 않는 Header이다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
     Warning                     r                  -     o      o     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
Warning = "Warning" HCOLON warning-value *(COMMA warning-value)
warning-value = warn-code SP warn-agent SP warn-text 
warn-code = 3DIGIT 
warn-agent = hostport / pseudonym 
warn-text = quoted-string 
pseudonym = token
ex = Warning : 301 isi.edu "Incompatible network address type 'E.164'"
------------------------------------------------------------------------


== WWW-Ahthenticate Header ==

WWW-Authenticate Header는 인증관련된 정보를 표현한다.

----------------------------  Header  사용 정보 -------------------------
      Header field          where   proxy ACK BYE CAN INV OPT REG
      __________________________________________________________
   WWW-Authenticate      401       ar      -     m     -     m    m    m
   WWW-Authenticate      407       ar      -     o      -     o     o     o
------------------------------------------------------------------------
----------------------------  Header  ABNF -----------------------------
WWW-Authenticate = "WWW-Authenticate" HCOLON challenge  
 ex = "WWW-Authenticate: Digest realm="atlanta.example.com", 
                            qop="auth", nonce="84f1c1ae6cbe5ua9c8e88dfa3ecm3459", opaque="",
                            stale=FALSE, algorithm=MD5 "
------------------------------------------------------------------------

by 소걸음 | 2009/09/11 09:50 | [SIP] | 트랙백 | 덧글(0)

트랙백 주소 : http://lukiji.egloos.com/tb/3208737
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지                    다음 페이지 ▶