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