osip状态机分析「建议收藏」
OSIP的核心是系統(tǒng)狀態(tài)機,在不同情況下,系統(tǒng)處于不同的狀態(tài),在某一狀態(tài)下當系統(tǒng)發(fā)生某一個動作后(如接受或者發(fā)送了消息),狀態(tài)機做相應(yīng)的跳轉(zhuǎn)。的狀態(tài)機在不同的狀態(tài)下,對某一動作的響應(yīng)也是不一樣的。
由于SIP的復雜性,為了降低代碼實現(xiàn)難度,也為了能夠保證代碼的模塊化,Osip把整個SIP的實現(xiàn)分成了四個狀態(tài)機,分別是:
(1)ICT (帶invit事件的out處理)
(2)IST (帶invit事件的in處理)
(3)NCT(不帶invit事件的out處理)
(4)NST(不帶invit事件的in處理)
實際上,1和2是一隊連接,1負責一個callout,2負責一個相應(yīng)的callin,3和4也是一樣,不同之處是他們負責的是不帶invite的請求,比如NOTIFY,SUBSCRIBE等等。下面對這些狀態(tài)機做說明。
(1)ICT callout的狀態(tài)機,當系統(tǒng)make a call out的時候,系統(tǒng)處于這個狀態(tài)機,這個狀態(tài)機處理1xx,2xx,3xxx等消息,圍繞這些消息,系統(tǒng)的狀態(tài)機切換狀態(tài)。
(2)IST callin的狀態(tài)機,當系統(tǒng)接收到一個invite請求后,系統(tǒng)處于這個狀態(tài)機下,在這個狀態(tài)機下,系統(tǒng)發(fā)送1xx,2xx消息。可以看到,狀態(tài)機1和2負責電話呼叫流程的控制,而3和4負責其它的非呼叫的狀態(tài)控制。
(3)NCT 無invite的out請求的狀態(tài)機,實際上就是初了invit呼叫的其它狀態(tài)處理,比如NOTIFY等等。
(4)NST無invite的in請求的狀態(tài)機,和上面的對應(yīng),沒什么好講。
這四個狀態(tài)機的實現(xiàn)是基本一致的,你理解了其中一個,理解其他三個就沒有任何問題了,在這里我詳細的將第一個,其它的您可以舉一反三。如果看這些東西有困難,建議您先看下RTC3261,熟悉下SIP呼叫流程,這也許對您理解OSIP狀態(tài)機有幫助。
狀態(tài)機ICT(Invite client callout)說明
1、說明:
本文件的作用是解釋終端callout的時候的狀態(tài)控制,它是osip中的四個狀態(tài)機中最重要的一個,處理callout的各種事件,比如180,200,timeout等等。文件中的函數(shù)是系收發(fā)消息的核心處理函數(shù),為狀態(tài)機切換服務(wù)。其它三個狀態(tài)機和此類似。
包含文件:fsm.h、ict_fsm.c、ist_fsm.c、ict.c、ist.c。
狀態(tài)五種狀態(tài)機:
ICT_PRE_CALLING
ICT_CALLING
ICT_PROCEEDING
ICT_COMPLETED
ICT_TERMINATED
ICT_PRE_CALLING:
呼叫前的狀態(tài),系統(tǒng)處于準備狀態(tài)。系統(tǒng)調(diào)用osip_transaction_init函數(shù)后,系統(tǒng)初始化,處于這個狀態(tài)。在這個狀態(tài)下,系統(tǒng)調(diào)用ict_snd_invite,發(fā)送invte請求出去后,系統(tǒng)跳轉(zhuǎn)到ICT_CALLING狀態(tài)。
ICT_CALLING:
已經(jīng)成功發(fā)送invit請求,但還沒有收到遠方的任何響應(yīng)的時候,系統(tǒng)處于此狀態(tài)。在這個狀態(tài)下,當timeouta時間到達后,系統(tǒng)會沖發(fā)消息,以確保對方可以收到請求包。當timeb時間到達后,系統(tǒng)認為對方無響應(yīng),狀態(tài)直接跳到ICT_TERMINATED狀態(tài),釋放資源完成此次呼叫。
當系統(tǒng)在此狀態(tài)下接收到1xx消息后,認為對方有響應(yīng),則系統(tǒng)跳到ICT_PROCEEDING狀態(tài)。
ICT_PROCEEDING:
當系統(tǒng)發(fā)送invite后,接收到對方的響應(yīng)(100 trying),系統(tǒng)跳到此狀態(tài)。正常接收到200 OK后,系統(tǒng)跳到ICT_TERMINATED,認為完成一次請求。如果接收到3456xxx等請求,系統(tǒng)跳到ICT_COMPLETED,發(fā)送ACK給對方(有些不需要發(fā)送ACK),設(shè)置timeoutd時間,等待D時間到來。
ICT_COMPLETED:
當系統(tǒng)接收到3456xx的時候,系統(tǒng)發(fā)送ACK給對方,系統(tǒng)處于此狀態(tài),當timeoutd時間到達后,系統(tǒng)跳到ICT_TERMINATED狀態(tài),完成一次呼叫。
ICT_TERMINATED:
完成一次呼叫,這是狀態(tài)機的必經(jīng)的最后一個狀態(tài)。狀態(tài)到達這里,就表示了一個狀態(tài)機的完結(jié),也就表示了一個呼叫的完結(jié),無論成功于否,最后都會到達這個終結(jié)狀態(tài)。
系統(tǒng)狀態(tài)切換的函數(shù)見狀態(tài)圖,圖中其它幾個timout事件函數(shù)沒有添加,需要了解的請自己查閱文件。
圖1 ICT狀態(tài)機
圖2 sip完整通話抓包
圖3 sip通話拒接抓包
總結(jié)
以上是生活随笔為你收集整理的osip状态机分析「建议收藏」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python性能分析工具_Python
- 下一篇: 苹果电脑怎么安装Win10系统 苹果电脑