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