osip状态机分析「建议收藏」

osip状态机分析「建议收藏」OSIP的核心是系统状态机,在不同情况下,系统处于不同的状态,在某一状态下当系统发生某一个动作后(如接受或者发送了消息),状态机做相应的跳转。的状态机在不同的状态下,对某一动作的响应也是不一样的。由于SIP的复杂性,为了降低代码实现难度,也为了能够保证代码的模块化,Osip把整个SIP的实现分成了四个状态机,分别是:      (1)ICT(带invit事件的out处理)

大家好,又见面了,我是你们的朋友全栈君。

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事件函数没有添加,需要了解的请自己查阅文件。

osip状态机分析「建议收藏」

                                           图1 ICT状态机                                                                                    

osip状态机分析「建议收藏」

图2 sip完整通话抓包

osip状态机分析「建议收藏」

图3 sip通话拒接抓包

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148355.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号