zoukankan      html  css  js  c++  java
  • 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通话拒接抓包

  • 相关阅读:
    卫星星下点轨迹Matlab仿真
    ARM反汇编学习
    NS 2.35 柯志亨书实验3笔记TCP UDP模拟 ——计算FTP不同参数:时延、抖动、吞吐率、丢包率awk代码
    NS 2.35 柯志亨书实验4笔记随机数产生
    摄像头驱动学习
    一次输出8bit_n4_m序列Simulink仿真Verilog实现
    NS 2.35 柯志亨书实验3笔记TCP UDP模拟
    FFT2 图像二维FFT含义解释
    有限元FEM求解一维电磁场问题 Rits法 Galerkin法
    python3+pygame实现的2048,非常完整的代码
  • 原文地址:https://www.cnblogs.com/baiduboy/p/6089202.html
Copyright © 2011-2022 走看看