今天工作碰到了兩個裝置之間SIP包的抓取和分析,然後結合RFC3261的文檔說明,記錄下今天所理解的。
1.SIP協議:
SIP的詳細RFC文檔可見:rfc3261
Session Initiation(工作階段初始通訊協定),允許使用Internet端點(使用者代理程式)來尋找參與者並且允許建立一個可共用的會話描述。SIP允許建立基礎的 networkhosts(叫做Proxy 伺服器),並且允許終端使用者註冊上去,發出會話邀請,或者發出其他請求。可以用來建立,修改和終止會話,它獨立運作於通訊協議之下,並且
不依賴建立的會話類型。
SIP不是一個垂直整合的通訊系統。SIP可能叫做是一個組件更合適,SIP應該和其他的協議一起工作,才能提供完整的對終端使用者的服務。雖然基本的 SIP協議的功能組件並不依賴於這些協議。
SIP本身並不提供服務。但是,SIP提供了一個基礎,可以用來實現不同的服務。
2.SIP實施
每個SIP端點都有個使用者名稱,也即是表示其身份的ID號,通過其ID,可以呼叫對方.比如,在IP電話A中,可以用這個ID來表示對方裝置:sip: 0502004@192.168.2.30.前面表示電話號碼,後是其IP地址.
當然,以上ID的形式只是一種彼此規定的代號而已,完全可以用shi@web.com來表
示其ID.
SIP是基於一個類似HTTP協議的請求應答的通訊模式。每一個通訊都包含對某個功
能的請求,並且起碼需要一個應答。
比如,IP電話A在註冊SIP伺服器的過程中,就需要一個請求:Request: Register
192.168.2.13 (電話A->伺服器)
而SIP伺服器則必須給一個應答:Status: 200 OK (伺服器->電話A)
又比如,電話A如欲與電話B通話,則首先,電話A給SIP伺服器一請求,請求伺服器幫它接上電話B,則這時候又需要一個請求.
如:Request: INVITE sip :0502004@192.168.2.13 (電話A->伺服器)
伺服器又必須給其一個應答:Status: 100 Trying .(伺服器->電話A) 表示服務
器正在盡百分之百的力量幫它聯絡上.
這時候,伺服器找到電話B,就給電話B一個請求,告訴它,有人想找你.你有空嗎?
Request:INVITE sip: 015B0081587310007000D0000C578@192.168.2.40 (伺服器
->電話B)
這時候,如果電話B恰巧有空(非通話斷線狀態),則會答伺服器,說,空!請你
去叫一下他到我這兒來吧!
電話B會給出兩條應答給伺服器:Status: 100 Trying /Status: 180 Ring
伺服器收到應答後,再給電話A發發送一個應答.Status: 180 Ring ,這時候電話A
的狀態就表示響鈴.
當電話A一摘機,則電話A和電話B就有個通話,此時,電話B給伺服器一個條應答,
讓他傳到到電話A.
Status:200 OK
此時通話建立的所有準備工作完成,這時就只剩下RTP語音包在兩個電話之間傳
輸,當然,SIP包還會時不時的出來調解一下,看看有沒有異常狀態.
最後一方掛斷,則伺服器又出作調停工作,發送一個請求給另一方:
Request:BYE sip: 015B0081587310007000D0000C578@192.168.2.40
而另一方則回一個應答:Status: 200 OK
通話完成!
這些SIP訊息都是附在UDP包中完成傳輸的,通過ethereal截包工具,可以詳細的看到其狀態.
以下是一個請求串連的SIP包的圖例:
可以看到,SIP包有三個主要部分:Request-Line(表示是請求資訊),Message Header(SIP包的訊息頭哉),Message Body(SIP包的訊息主體).
其中有幾個要注意的: VIA域告訴大家本請求發送到哪裡並且應答到哪裡,Contract域告訴大家將來的請求將發送到哪裡. To和From分別表示這個包下一站到哪個主機上面,來自哪裡。
CALL-ID包含一個全域的唯一標誌,用來唯一標誌這個呼叫,通過隨機字串和softphone的自己名字或者IP抵制混和產生的。
通過TO TAG, FROM TAG和CALL-ID完整定義了兩端之間的端到端的SIP關係,並且表示這個是一個對話性質的關係。
至於訊息的主體。則會描述媒體的類型,codec,或者採樣速率。
3.一個具體的在正式通話前兩個電話所發出的SIP包。
ethereal: