Osip2和eXosip協議棧的簡析
Osip2是一個開放源代碼的sip協議棧,是開源代碼中不多使用C語言寫的協議棧之一,它具有短小簡潔的特點,專註於sip底層解析使得它的效率比較高。
eXosip是Osip2的一個擴展協議集,它部分封裝了Osip2協議棧,使得它更容易被使用。
一、介紹
Osip2是一個開放源代碼的sip協議棧,是開源代碼中不多使用C語言寫的協議棧之一,它具有短小簡潔的特點,專註於sip底層解析使得它的效率比較高。但缺點也很明顯,首先就是可用性差,沒有很好的api封裝,使得上層應用在調用協議棧時很破碎;其次,只做到了transaction層次的協議過程解析,缺少call、session、dialog
eXosip是Osip2的一個擴展協議集,它部分封裝了Osip2協議棧,使得它更容易被使用。eXosip增加了call、dialog、registration、subscription等過程的解析,使得實用性更強。但是eXosip局限於UA的實現,使得它用於registrar、sip server等應用時極其不容易。另外,它並沒有增加線程並發處理的機制。而且只實現了音頻支持,缺少對視頻和其它數據格式的支持。
綜合來說,Osip2加上eXosip協議棧仍然是個實現Sip協議不錯的選擇。當然需要根據不同的需求來增加更多的內容。
二、Osip2協議棧的組成
Osip2協議棧大致可以分為三部分:sip協議的語法分析、sip協議的過程分析和協議棧框架。
1、Sip協議的語法分析:
主要是osipparser2部分,目前支持RFC3261和RFC3265定義的sip協議消息,包括INVITE、ACK、OPTIONS、CANCEL、BYE、SUBSCRIBE、NOTIFY、MESSAGE、REFER和INFO。不支持RFC3262定義的PRACK。
遵循RFC3264關於SDP的offer/answer模式。帶有SDP的語法分析。
支持MD5加解密算法。支持Authorization
2、Sip協議的過程分析:
主要是osip2部分,基於RFC3261、RFC3264和RFC3265的sip協議描述過程,圍繞transaction這一層來實現sip的解析。
Transaction是指一個發送方和接收方的交互過程,由請求和應答組成。請求分為Invite類型和Non-Invite類型。應答分為響應型的應答和確認型的應答。響應型的應答是指這個應答僅代表對方收到請求。請求經過處理後都必須返回確認型的應答。響應型的應答有1xx,確認型的應答包括2xx、3xx、4xx、5xx和6xx。一個transaction由一個請求和一個或多個響應型應答、一個確認型應答組成。
Transaction根據請求的不同和發送/接收的不同可以分為四類:ict、nict、ist和nist。
Ict是指Invite client transaction,就是會話邀請的發起方。
Nict是指Non-Invite client transaction,是指非邀請會話的發起方。
Ist是指Invite server tranaction,是指會話邀請的接收方。
Nist是指Non-Invite server transaction,是指非邀請會話的接收方。
每種類型的transaction都有自己相應的狀態機,Osip2協議棧根據狀態機來處理所有的sip事件,所以這部分就是整個協議棧的核心。但是因為Osip2只做到transaction這一層,所以它可以忽略掉call、registration等應用的復雜性,顯得相當簡單,這就使得需要使用它的應用必須要自己處理應用的邏輯。必須註意的一點是,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協議棧的簡析