1. 程式人生 > >Osip2和eXosip協議棧的簡析

Osip2和eXosip協議棧的簡析

時序 發送 nis 角度 then 協議 script style 層次

Osip2是一個開放源代碼的sip協議棧,是開源代碼中不多使用C語言寫的協議棧之一,它具有短小簡潔的特點,專註於sip底層解析使得它的效率比較高。

eXosip是Osip2的一個擴展協議集,它部分封裝了Osip2協議棧,使得它更容易被使用。

一、介紹

Osip2是一個開放源代碼的sip協議棧,是開源代碼中不多使用C語言寫的協議棧之一,它具有短小簡潔的特點,專註於sip底層解析使得它的效率比較高。但缺點也很明顯,首先就是可用性差,沒有很好的api封裝,使得上層應用在調用協議棧時很破碎;其次,只做到了transaction層次的協議過程解析,缺少callsessiondialog

等過程的解析,這也增加了使用的難度;再次,缺少線程並發處理的機制,使得它的處理能力有限。

eXosipOsip2的一個擴展協議集,它部分封裝了Osip2協議棧,使得它更容易被使用。eXosip增加了calldialogregistrationsubscription等過程的解析,使得實用性更強。但是eXosip局限於UA的實現,使得它用於registrarsip server等應用時極其不容易。另外,它並沒有增加線程並發處理的機制。而且只實現了音頻支持,缺少對視頻和其它數據格式的支持。

綜合來說,Osip2加上eXosip協議棧仍然是個實現Sip協議不錯的選擇。當然需要根據不同的需求來增加更多的內容。

二、Osip2協議棧的組成

Osip2協議棧大致可以分為三部分:sip協議的語法分析、sip協議的過程分析和協議棧框架。

1、Sip協議的語法分析:

主要是osipparser2部分,目前支持RFC3261RFC3265定義的sip協議消息,包括INVITEACKOPTIONSCANCELBYESUBSCRIBENOTIFYMESSAGEREFERINFO。不支持RFC3262定義的PRACK

遵循RFC3264關於SDPoffer/answer模式。帶有SDP的語法分析。

支持MD5加解密算法。支持Authorization

www_authenticateproxy_authenticate

2、Sip協議的過程分析:

主要是osip2部分,基於RFC3261RFC3264RFC3265sip協議描述過程,圍繞transaction這一層來實現sip的解析。

Transaction是指一個發送方和接收方的交互過程,由請求和應答組成。請求分為Invite類型和Non-Invite類型。應答分為響應型的應答和確認型的應答。響應型的應答是指這個應答僅代表對方收到請求。請求經過處理後都必須返回確認型的應答。響應型的應答有1xx,確認型的應答包括2xx3xx4xx5xx6xx。一個transaction由一個請求和一個或多個響應型應答、一個確認型應答組成。

Transaction根據請求的不同和發送/接收的不同可以分為四類:ictnictistnist

Ict是指Invite client transaction,就是會話邀請的發起方。

Nict是指Non-Invite client transaction,是指非邀請會話的發起方。

Ist是指Invite server tranaction,是指會話邀請的接收方。

Nist是指Non-Invite server transaction,是指非邀請會話的接收方。

每種類型的transaction都有自己相應的狀態機,Osip2協議棧根據狀態機來處理所有的sip事件,所以這部分就是整個協議棧的核心。但是因為Osip2只做到transaction這一層,所以它可以忽略掉callregistration等應用的復雜性,顯得相當簡單,這就使得需要使用它的應用必須要自己處理應用的邏輯。必須註意的一點是,transaction的資源在Osip裏是由協議棧負責釋放的,但是在Osip2裏改成由使用的應用負責釋放。

下面簡單的用時序圖來描述四種transaction的狀態機,只著重於描述狀態間的轉換,忽略了調用的處理函數,也簡化了很多沒有狀態變換的事件。也就是說,每個狀態下定義的事件並沒有完整的表現在圖中,不要以為這些事件沒定義或在該狀態下沒有處理。

圖中方框裏的是狀態名,箭頭線上的是觸發狀態變換的事件名稱。同一個狀態下的事件並沒有時序關系。

Ict的狀態機如下:

(圖略)

Nict的狀態機如下:

(圖略)

Ist的狀態機如下:

(圖略)

Nist的狀態機如下:

(圖略)

3、協議棧框架:

框架並不是指代碼的某一部分,而是指它的構成形式。主要有三部分:底層套接字接收/發送,模塊間通信管道,上層調用api接口。

Osip2並不實現底層套接字的接收/發送,由eXosip實現,現在只支持UDP的鏈路連接。

模塊間的通信管道包括:transaction的消息管道、jevent的消息管道。Transaction的消息管道是驅動其狀態機的部件,通過不斷的接收來自底層套接字的遠端信令,或者來自上層調用的指令,根據上述的狀態機制來驅動這個transaction的運轉。Jevent的消息管道是eXosip實現的,用於匯報底層事件,使得調用程序能處理感興趣的事件。

上層調用的api接口大致有兩類:sip協議的調用接口和sdp協議的調用接口。EXosip封裝了大部分的sip協議調用接口,一般來說都不需要直接調用osip2的接口函數。接口函數很多,在這裏就不詳述了,函數定義請參照源代碼部分的註釋。

三、eXosip協議棧的分析

eXosip是Osip2協議棧的封裝和調用。它實現了作為單個sip終端的大部分功能,如register、call、subscription等。

EXosip使用UDP socket套接字實現底層sip協議的接收/發送。並且封裝了sip消息的解釋器。

EXosip使用定時輪循的方式調用Osip2的transaction處理函數,這部分是協議棧運轉的核心。透過添加/讀取transaction消息管道的方式,驅動transaction的狀態機,使得來自遠端的sip信令能匯報給調用程序,來自調用程序的反饋能通過sip信令回傳給遠端。

EXosip增加了對各個類型transaction的超時處理,確保所有資源都能循環使用,不會被耗用殆盡。

EXosip使用jevent消息管道來向上通知調用程序底層發生的事件,調用程序只要讀取該消息管道,就能獲得感興趣的事件,進行相關的處理。

EXosip裏比較重要的應用有j_calls、j_subscribes、j_notifies、j_reg、j_pub、osip_negotiation和authinfos。J_calls對應呼叫鏈表,記錄所有當前活動的呼叫。J_reg對應註冊鏈表,記錄所有當前活動的註冊信息。Osip_negotiation記錄本地的能力集,用於能力交換。Authinfos記錄需要的認證信息。

四、總結

本文是從使用的角度去闡述分析Osip2和eXosip協議棧,並不涉及很多的細節,需要進一步了解協議棧的結構和實現,可參考《osip》一文。

Osip2和eXosip協議棧的簡析