2008年3月11日 星期二

SIP Intro --- 第二部 (part 1)

SIP 第二部,我想以幾個examples帶出SIP的Message structure,並藉此更深入的了解SIP的運作細節,大概是這樣。此部將會以RFC3665為主要參考,RFC3216為輔(MSG structure)。因為內容真的很多,所以預計第三部將會是第二部的延續,並且會focus在Registration這個部分。

還未看過SIP第一部,可至下面連結觀看...
SIP Intro --- 第一部

(有一點要先聲名,在語句中常會穿插英文單字,因為實在翻成中文不太順,所以還多多見諒)
這篇過長了...
所以修改一下架構,SIP Intor第二部將分成兩個parts,1st part引出主題架構,2nd part從此架構下深入討論。


根據RFC3665,設定了幾個elements,如下


Element          Display Name    URI
--------------   --------------  ---------------------------
User Agent       Alice           alice@atlanta.example.com
User Agent       Bob             bob@biloxi.example.com
User Agent                      
Proxy Server                     ss1.atlanta.example.com
Proxy/Registrar                  ss2.biloxi.example.com
Proxy Server                     ss3.chicago.example.com
ALG                              alg1.atlanta.example.com


其IP依序為


Element          IP Address
--------------   -------------
User Agent       192.0.2.101
User Agent       192.0.2.201
User Agent       192.0.2.100
Proxy Server     192.0.2.111
Proxy/Registrar  192.0.2.222
Proxy Server     192.0.2.233
ALG              192.0.2.128


(User Agent在此我們設定為end-user)
以下的例子就會是依據以上設定來說明。

在第一部裡,已經有舉一個Alice想要與Bob通訊的例子,此例子為成功建立session的一個case,以下為其簡圖(取自RFC3665,右方為自己加的小註解)


Alice                  Bob
|                        |
|       INVITE F1        |
|----------------------->|   (送出邀請,詢問是否參與通訊)
|     180 Ringing F2     |
|<-----------------------|   (告知邀請者,我在考慮或處理中...)
|                        |
|        200 OK F3       |   (告知邀請者,我願意接受通訊)
|<-----------------------|
|         ACK F4         |
|----------------------->|   (告知受邀者,邀請者以確認妳的意願)
|   Both Way RTP Media   |
|<======================>|   (開始通訊囉!!)
|                        |
|         BYE F5         |   (有一方要結束通訊,並告知對方)
|----------------------->|
|       200 OK F6        |
|<-----------------------|   (回應結束方的告知)
|                        |
以上即為一個完整的session建立、通訊與結束。在此,我們來開始碰SIP封包吧! (若想要抓取SIP封包,可以用Ethereal來抓,filter設成sip即可。(Ethereal也是ㄧ個很好debug以及trace packet flow的軟體) 補充一點,圖中的F1,F2,....只是用來輔助說明是哪一個packet用的符號而已。看到此,或許已經開始有些疑問,Alice是怎麼找到Bob? 他們的通訊是用甚麼audio(video) codec? 怎麼知道對方有沒有自己的audio(video) codec? 這部分其實SIP在call setup這個階段就有偷偷在做溝通、協調了,這牽涉到RFC3264 (SDP),以後會再補充這部分(應該會再第四部或第五部說明)。 OK,第一個packet F1 INVITE Alice -> Bob INVITE sip:bob@biloxi.example.com SIP/2.0 Via: SIP/2.0/TCP client.atlanta.example.com:5060;branch=z9hG4bK74bf9 Max-Forwards: 70 From: Alice ;tag=9fxced76sl To: Bob Call-ID: 3848276298220188511@atlanta.example.com CSeq: 1 INVITE Contact: Content-Type: application/sdp Content-Length: 151 v=0 o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com s=- c=IN IP4 192.0.2.101 t=0 0 m=audio 49172 RTP/AVP 0 a=rtpmap:0 PCMU/8000 在這裡,因為SIP都有既定的格式(RFC3261裡有說明),所以內容我就不方便在做排版。好了,這裡首先碰到第一個麻煩事! 每一行代表什麼? 每一行中的keyword又代表什麼意義? 用途? 誰填的? 一堆問題開始冒出來! 因此,我們得先來看SIP的Message structure... SIP Message Structure是text-based,並且是使用UTF-8的format。在SIP Message的分類,主要分為兩類: Request 與 Response 也就是需求的要求方與回應方。而這兩類的Massage都是遵循下面的General Fomat:
generic-message = start-line
*message-header
CRLF
[ message-body ]
很簡單的format,三個部分:start-line、message-header以及optional的message-body,特別注意的是要有一個CRLF(carriage-return line-feed)也就是ㄧ個空行區分message-body與上面兩個sections。很明顯,optional的部分(message-body)是用來做功能擴充的、補充,這部分將在更後面來介紹。 第一個section ---> start-line,在SIP(RFC3261中)有定義其format,如下 start-line = Request-Line / Status-Line Request-Line的format [Request message的格式] Method Request-URI SIP-Version CRLF 在此,Method指的是Request的種類,有可能妳是要INVITE,也有可能妳是要註冊等等,都是在此欄位表明。Request-URI則是ㄧ個Identifier,含有標示requester的功能,詳細功能下面會再說明。最後兩個欄位(SIP-Version與CRLF)就不用說明了。以上為Request message第一行所要遵循的format。 針對Method,主要有下列幾種:
REGISTER
Provides a registrar service with contact address and the alias that can be used instead.
(User Agent註冊,這個部分以後會再開一個section討論)
INVITE
Call a user agent, transfer a call
(邀請對方通訊)
ACK
Confirm the call
(確認回覆)
CANCEL
End a call that hasn’t been OK’d yet.
(取消尚未回應的request)
BYE
End a call.
(結束通訊)
OPTION
Ask a user agent for its “capabilities”.
(詢問對方的通訊能力)
Status-Line的format [Response message的格式] SIP-Version Status-Code Reason-Phrase CRLF 第一個SIP-Version也就不用說明,Status-Code則是回應requester他的答覆,可能為200,也可能是180 等等。接著的欄位Reason-Phrase則是Status-Code的文字說明。如:OK、TRYING等。 針對Status-Code,SIP有下列六大分類。 1xx: Provisional – request received, continuing to process the request; (有"預先"回應的意思的status-code,也就是在真正處理結果出來前回應給requester說"我正在處理、或是其他狀態) 2xx: Success – the action was successfully received, understood, and accepted; (很明顯,處理結果的回應,有接受的意思) 3xx: Redirection – further action needs to be taken in order to complete the request; (需要再進一步處理的回應) 4xx: Client Error – the request contains bad syntax or cannot be fulfilled at this server; (有錯誤發生都定義在這個類別裡) 5xx: Server Error – the server failed to fulfill an apparently valid request; (Server-side的error) 6xx: Global Failure – the request cannot be fulfilled at any server. (任何server都無法處理的錯誤) 很好,到目前為止,我們理解了第一行的意義,再來就是message-header這部分,message-header fields真的不少,功能很多,而且並非每個header field都是必要的,所以會先大略帶過,以後再從例子再詳細說明。在2nd part中,我們將會繼續說明各個header field的功能,並真正開始介紹種種example,可以預期的,越往後面的例子,將不會著重在header field的說明,因為header fields將會在前1/3的例子中就說明完,後2/3將會看整個message flow,熟悉SIP的運作。 Part 1 end. 請接著看 SIP Intro --- 第二部 (part 2)

1 則留言:

匿名 提到...

thanks

搜尋此網誌