2008年3月19日 星期三

SIP Intro 第三部

SIP Intro 第三部...

最近還是忙,但還是先起個頭,這一部想介紹Registration,也是一樣從例子開始入手,再一一其內容、結構與流程,因為有了一、二部的基礎,我想在這一部會開始往旁邊發展,也就是說會牽扯比較多一點的東西。

ps.實在對一些網誌高手不好意思,本人第一次寫,而且向來超不會寫文章...還請多多指教、包含!

下面是之前的SIP Intro 一二部,有興趣的可以參考!
SIP Intro --- 第一部
SIP Intro --- 第二部(part 1)
SIP Intro --- 第二部(part 2)
SIP Intro --- 第二部 (part 3)

進入正題!

為何要REGISTER呢? 因為若不向SIP server註冊,那別人怎麼能知道你在哪裡,又怎麼跟妳通訊呢? 所以我們每個User都要向SIP server至少註冊一個號碼,如此,當別人要跟這個號碼做通訊時,才找的到位置。

而一筆(號碼)註冊的資訊,我們又稱之為Address of Record,裡面包含了IP、號碼等等資訊。而註冊的流程有如何呢?以下先來看一個例子,下面這個例子是在表示一個user要註冊一筆新的資訊的流程。

Bob               SIP Server
| |
| REGISTER F1 | (向SIP server發送一個註冊的Msg)
|-------------------->|
| 401 Unauthorized F2 | (SIP server會要求認證)
|<--------------------|
| REGISTER F3 | (重新發送一次,並加入認證資訊)
|-------------------->|
| 200 OK F4 | (若成功,則會回OK給user)
|<--------------------|
| |



F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact:
Content-Length: 0


第一個packet裡

F2 401 Unauthorized SIP Server -> Bob
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=1410948204
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="atlanta.example.com",qop="auth",nonce="ea9c8e88df84f1cec4341ae6cbe5a359",opaque="",stale=FALSE,algorithm=MD5
Content-Length: 0


F3 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92
Max-Forwards: 70
From: Bob ;tag=ja743ks76zlflH
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact:
Authorization: Digest username="bob",realm="atlanta.example.com",nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",uri="sips:ss2.biloxi.example.com",response="dfe56131d1958046689d83306477ecc"
Content-Length: 0


F4 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92 ;received=192.0.2.201
From: Bob ;tag=ja743ks76zlflH
To: Bob ;tag=37GkEhwl6
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact: ;expires=3600
Content-Length: 0



下一個例子,是在表示user想要對他註冊的Address of Record做更新的operation。

   Bob                        SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 200 OK F2 |
|<------------------------------|
| |


F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact: mailto:bob@biloxi.example.com
Authorization: Digest username="bob",realm="atlanta.example.com",qop="auth", nonce="1cec4341ae6cbe5a359ea9c8e88df84f",opaque="",uri="sips:ss2.iloxi.example.com", response="71ba27c64bd01de719686aa4590d5824"
Content-Length: 0


F2 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=34095828jh



再來這個例子是user要求現有的註冊資訊。
   Bob                        SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 200 OK F2 |
|<------------------------------|
| |


F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Authorization: Digest username="bob",realm="atlanta.example.com",nonce="df84f1cec4341ae6cbe5ap359a9c8e88",opaque="",uri="sips:ss2.biloxi.example.com",response="aa7ab4678258377c6f7d4be6087e2f60"
Content-Length: 0


F2 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201



接下來這個例子是取消註冊。


   Bob                         SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 200 OK F2 |
|<------------------------------|
| |



F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Expires: 0
Contact: *
Authorization: Digest username="bob", realm="atlanta.example.com",nonce="88df84f1cac4341aea9c8ee6cbe5a359", opaque="",uri="sips:ss2.biloxi.example.com",response="ff0437c51696f9a76244f0cf1dbabbea"
Content-Length: 0


F2 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=1418nmdsrf
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Content-Length: 0



最後是ㄧ個註冊不成功的例子,這只是其中之一,因為不成功的可能原因太多了,所以只列一個。

   Bob                        SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 401 Unauthorized F2 |
|<------------------------------|
| REGISTER F3 |
|------------------------------>|
| 401 Unauthorized F4 |
|<------------------------------|
| |


F1 REGISTER Bob -> SIP Server


REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact:
Content-Length: 0


F2 Unauthorized SIP Server -> Bob
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=1410948204
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="atlanta.example.com", qop="auth",nonce="f1cec4341ae6ca9c8e88df84be55a359", opaque="", stale=FALSE, algorithm=MD5
Content-Length: 0


F3 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92
Max-Forwards: 70
From: Bob ;tag=JueHGuidj28dfga
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact:
Authorization: Digest username="bob", realm="atlanta.example.com",nonce="f1cec4341ae6ca9c8e88df84be55a359", opaque="",
uri="sips:ss2.biloxi.example.com",
response="61f8470ceb87d7ebf508220214ed438b"
Content-Length: 0


F4 401 Unauthorized SIP Server -> Bob
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92;received=192.0.2.201
From: Bob ;tag=JueHGuidj28dfga
To: Bob ;tag=1410948204
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
WWW-Authenticate: Digest realm="atlanta.example.com", qop="auth",nonce="84f1c1ae6cbe5ua9c8e88dfa3ecm3459",opaque="", stale=FALSE, algorithm=MD5
Content-Length: 0




8 則留言:

匿名 提到...

I really like when people are expressing their opinion and thought. So I like the way you are writing

路人甲 提到...

不好意思請教一下
您在你文章內提到的四種 Register
註冊 更新 取得資訊 登出 請問這四種message 有何不同呢?? 我比對很久看不出有什麼大差異

另外您文章下面所提到的註冊失敗
請問第二次的401 會出現的原因是?? 不是有回傳Authenticate
如果是笨問題 還請您見諒
謝謝你的回覆

路人甲 提到...

不好意思請教一下
您在你文章內提到的四種 Register
註冊 更新 取得資訊 登出 請問這四種message 有何不同呢?? 我比對很久看不出有什麼大差異

另外您文章下面所提到的註冊失敗
請問第二次的401 會出現的原因是?? 不是有回傳Authenticate
如果是笨問題 還請您見諒
謝謝你的回覆

BreadRD 提到...

對於第一個問題,不好意思,應該是我沒說明,
那個例子是在更新Address of lists,
下面這一行
Contact: mailto:bob@biloxi.example.com
所以造成的結果有可能是INVITE會轉送至此新的Address。
實際上的效果各家server、各家SIP Stack都各有不同。

第二個問題,是個很好的問題。
原rfc想表得的意思是說當register失敗會有甚麼樣的情況,而失敗與否則是比對回傳的response值是否有誤。
簡單的來說是如此沒錯,然而實際上追究其原因,如我之前所說卻有很多很多。
以下我舉幾個
1.server的Authenticate機制錯誤,造成client端怎麼認證都是錯的。

2.client端的號碼、密碼錯誤,造成算出來的response是錯的。

3.CSeq錯誤,造成server認為client端傳出的第二次Authenticate packet不是他在等的packet,所以又送了一次401錯誤給client。

以上,希望我的回答您能滿意。

p.s.最近再忙skype的東西,一直沒把這部分寫下去、修正,如有錯誤還請多多指教。 謝謝你囉!

路人甲 提到...

謝謝你回覆
不好意思再打擾了

請問 SIP 第四第五部 在短時間內還會寫嗎??
最近剛好要用 sip 作一個 video call
而之前對網路程式沒有太深入的接觸
遇到最大的問題是明明就按照規定送出去
可是回來的訊息卻跟書上寫得不一樣
就要一直找資料....

因為我對 Call,Dialog,Session,Transaction 的概念,還是一知半解
Subscribe 和 Contact的功用也不清楚

如果你有空的話 還請你繼續寫下去阿
謝謝你造福人群 XDD
感謝

BreadRD 提到...

SIP的東西真的很多...>_<
第四部之後會寫...但我的空閒時間不多

用sip作一個video call,看起來這件是的複雜度很高,如果server和client兩端都要從頭弄起的話....

還是老話一句RFC要k熟...(雖然我也沒有很熟~XDDD)

還有自己一定要有一套server & client來讓你try RFC的東西,這很重要~

有問題盡量問,沒關係。小的才疏學淺會盡力回答或幫你找線索~ ︿︿

路人甲 提到...

真的很謝謝你的熱心
我就不好意思問一下了 xd

因為我對 Call,Dialog,Session,Transaction 的概念,還是一知半解
和 Contact的功用也不清楚
因為我是在用別人寫好的 SIP API 來用
再寫程式時一堆變數型態 不知道他們彼此的從屬關係

你知道哪邊有關於這些名詞的定義嗎
謝謝你!!

BreadRD 提到...

RFC3261看過了嗎?

搜尋此網誌