Osip2和eXosip協(xié)議棧的簡介
Osip2是一個開放源代碼的sip協(xié)議棧,是開源代碼中不多使用C語言寫的協(xié)議棧之一,它具有短小簡潔的特點,專注于sip底層解析使得它的效率比較高。
eXosip是Osip2的一個擴(kuò)展協(xié)議集,它部分封裝了Osip2協(xié)議棧,使得它更容易被使用。
一、介紹
Osip2是一個開放源代碼的sip協(xié)議棧,是開源代碼中不多使用C語言寫的協(xié)議棧之一,它具有短小簡潔的特點,專注于sip底層解析使得它的效率比較高。但缺點也很明顯,首先就是可用性差,沒有很好的api封裝,使得上層應(yīng)用在調(diào)用協(xié)議棧時很破碎;其次,只做到了transaction層次的協(xié)議過程解析,缺少call、session、dialog等過程的解析,這也增加了使用的難度;再次,缺少線程并發(fā)處理的機(jī)制,使得它的處理能力有限。
eXosip是Osip2的一個擴(kuò)展協(xié)議集,它部分封裝了Osip2協(xié)議棧,使得它更容易被使用。eXosip增加了call、dialog、registration、subscription等過程的解析,使得實用性更強。但是eXosip局限于UA的實現(xiàn),使得它用于registrar、sipserver等應(yīng)用時極其不容易。另外,它并沒有增加線程并發(fā)處理的機(jī)制。而且只實現(xiàn)了音頻支持,缺少對視頻和其它數(shù)據(jù)格式的支持。
綜合來說,Osip2加上eXosip協(xié)議棧仍然是個實現(xiàn)Sip協(xié)議不錯的選擇。當(dāng)然需要根據(jù)不同的需求來增加更多的內(nèi)容。
二、Osip2協(xié)議棧的組成
Osip2協(xié)議棧大致可以分為三部分:sip協(xié)議的語法分析、sip協(xié)議的過程分析和協(xié)議??蚣?。
1、Sip協(xié)議的語法分析:主要是osipparser2部分,目前支持RFC3261和RFC3265定義的sip協(xié)議消息,包括INVITE、ACK、OPTIONS、CANCEL、BYE、SUBSCRIBE、NOTIFY、MESSAGE、REFER和INFO。不支持RFC3262定義的PRACK。
遵循RFC3264關(guān)于SDP的offer/answer模式。帶有SDP的語法分析。
支持MD5加解密算法。支持Authorization、www_authenticate和proxy_authenticate。
2、Sip協(xié)議的過程分析:
主要是osip2部分,基于RFC3261、RFC3264和RFC3265的sip協(xié)議描述過程,圍繞transaction這一層來實現(xiàn)sip的解析。
Transaction是指一個發(fā)送方和接收方的交互過程,由請求和應(yīng)答組成。請求分為Invite類型和Non-Invite類型。應(yīng)答分為響應(yīng)型的應(yīng)答和確認(rèn)型的應(yīng)答。響應(yīng)型的應(yīng)答是指這個應(yīng)答僅代表對方收到請求。請求經(jīng)過處理后都必須返回確認(rèn)型的應(yīng)答。響應(yīng)型的應(yīng)答有1xx,確認(rèn)型的應(yīng)答包括2xx、3xx、4xx、5xx和6xx。一個transaction由一個請求和一個或多個響應(yīng)型應(yīng)答、一個確認(rèn)型應(yīng)答組成。
Transaction根據(jù)請求的不同和發(fā)送/接收的不同可以分為四類:ict、nict、ist和nist。
Ict是指Inviteclienttransaction,就是會話邀請的發(fā)起方。
Nict是指Non-Inviteclienttransaction,是指非邀請會話的發(fā)起方。
Ist是指Inviteservertranaction,是指會話邀請的接收方。
Nist是指Non-Inviteservertransaction,是指非邀請會話的接收方。
每種類型的transaction都有自己相應(yīng)的狀態(tài)機(jī),Osip2協(xié)議棧根據(jù)狀態(tài)機(jī)來處理所有的sip事件,所以這部分就是整個協(xié)議棧的核心。但是因為Osip2只做到transaction這一層,所以它可以忽略掉call、registration等應(yīng)用的復(fù)雜性,顯得相當(dāng)簡單,這就使得需要使用它的應(yīng)用必須要自己處理應(yīng)用的邏輯。必須注意的一點是,transaction的資源在Osip里是由協(xié)議棧負(fù)責(zé)釋放的,但是在Osip2里改成由使用的應(yīng)用負(fù)責(zé)釋放。
下面簡單的用時序圖來描述四種transaction的狀態(tài)機(jī),只著重于描述狀態(tài)間的轉(zhuǎn)換,忽略了調(diào)用的處理函數(shù),也簡化了很多沒有狀態(tài)變換的事件。也就是說,每個狀態(tài)下定義的事件并沒有完整的表現(xiàn)在圖中,不要以為這些事件沒定義或在該狀態(tài)下沒有處理。
圖中方框里的是狀態(tài)名,箭頭線上的是觸發(fā)狀態(tài)變換的事件名稱。同一個狀態(tài)下的事件并沒有時序關(guān)系。
3、協(xié)議??蚣埽?/strong>
框架并不是指代碼的某一部分,而是指它的構(gòu)成形式。主要有三部分:底層套接字接收/發(fā)送,模塊間通信管道,上層調(diào)用api接口。
Osip2并不實現(xiàn)底層套接字的接收/發(fā)送,由eXosip實現(xiàn),現(xiàn)在只支持UDP的鏈路連接。
模塊間的通信管道包括:transaction的消息管道、jevent的消息管道。Transaction的消息管道是驅(qū)動其狀態(tài)機(jī)的部件,通過不斷的接收來自底層套接字的遠(yuǎn)端信令,或者來自上層調(diào)用的指令,根據(jù)上述的狀態(tài)機(jī)制來驅(qū)動這個transaction的運轉(zhuǎn)。Jevent的消息管道是eXosip實現(xiàn)的,用于匯報底層事件,使得調(diào)用程序能處理感興趣的事件。
上層調(diào)用的api接口大致有兩類:sip協(xié)議的調(diào)用接口和sdp協(xié)議的調(diào)用接口。EXosip封裝了大部分的sip協(xié)議調(diào)用接口,一般來說都不需要直接調(diào)用osip2的接口函數(shù)。接口函數(shù)很多,在這里就不詳述了,函數(shù)定義請參照源代碼部分的注釋。
三、eXosip協(xié)議棧的分析
eXosip是Osip2協(xié)議棧的封裝和調(diào)用。它實現(xiàn)了作為單個sip終端的大部分功能,如register、call、subscription等。
EXosip使用UDPsocket套接字實現(xiàn)底層sip協(xié)議的接收/發(fā)送。并且封裝了sip消息的解釋器。
EXosip使用定時輪循的方式調(diào)用Osip2的transaction處理函數(shù),這部分是協(xié)議棧運轉(zhuǎn)的核心。透過添加/讀取transaction消息管道的方式,驅(qū)動transaction的狀態(tài)機(jī),使得來自遠(yuǎn)端的sip信令能匯報給調(diào)用程序,來自調(diào)用程序的反饋能通過sip信令回傳給遠(yuǎn)端。
EXosip增加了對各個類型transaction的超時處理,確保所有資源都能循環(huán)使用,不會被耗用殆盡。
EXosip使用jevent消息管道來向上通知調(diào)用程序底層發(fā)生的事件,調(diào)用程序只要讀取該消息管道,就能獲得感興趣的事件,進(jìn)行相關(guān)的處理。
EXosip里比較重要的應(yīng)用有j_calls、j_subscribes、j_notifies、j_reg、j_pub、osip_negotiation和authinfos。J_calls對應(yīng)呼叫鏈表,記錄所有當(dāng)前活動的呼叫。J_reg對應(yīng)注冊鏈表,記錄所有當(dāng)前活動的注冊信息。Osip_negotiation記錄本地的能力集,用于能力交換。Authinfos記錄需要的認(rèn)證信息。
【編輯推薦】