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通话拒接抓包
osip状态机分析的更多相关文章
- openswan发送状态机分析
openswan发送状态机分析 1. 函数调用关系 2. 函数说明 如果按用户空间.内核空间划分的话,此部分代码更多是运行在内核空间的. 2.1 ipsec_tunnel_init_devices() ...
- Memcached 状态机分析
worker线程拿到了这个连接之后,就应该是分配给这个连接一个结构体,包括这个连接所有的状态,都写buf等,这个结构体就是conn,然后这个worker线程会在它自己的event_base加入对这个新 ...
- Thrift线程和状态机分析
目录 目录 1 1. 工作线程和IO线程 1 2. TNonblockingServer::TConnection::transition() 2 3. RPC函数被调用过程 3 4. 管道和任务队列 ...
- capwap协议重点分析
一. CAPWAP概述 CAPWAP由两个部分组成:CAPWAP协议和无线BINDING协议. (1)CAPWAP协议是一个通用的隧道协议,完成AP发现AC等基本协议功能,和具体的无线接入技术 ...
- [RM 状态机详解4] RMNode状态机详解
摘要 RMNode状态机是ResourceManager的四个状态机(RMApp,RMAppAttempt,RMContainer,RMNode)中最简单的一个,状态机如图1所示.RMNode是Res ...
- [RM 状态机详解1] RMApp状态机详解
概述 Apache Hadoop 2.0在Hadoop 1.0基础上做了许多的重构工作,代码上的重构最大的变化在于引入状态机处理各个角色的状态与变迁,使用状态机是得代码结构更加清晰,方便异步处理各种操 ...
- eXosip和osip详解
文档 可以查看exosip osip的在线文档 http://www.antisip.com/doc/ 在线文档 一般先看mainpage 会有库的一个整体说明. 其次看看 modules 会有一些使 ...
- 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...
- Memory及其controller芯片整体测试方案(下篇)
{ 第三部分 } DDR总线的设计.调试和验证 在计算机架构中,DDR作为程序运算的动态存储器,面对如高性能计算.图形计算.移动计算.工业应用等领域的要求,发展出DDR4,以及用于图形计算的G ...
随机推荐
- Hive_初步见解,安装部署与测试
一.hive是什么东东 1. 个人理解 hive就是一个基于hdfs运行于MapReduce上的一个java项目, 这个项目封装了jdbc,根据hdfs编写了处理数据库的DDL/DML,自带的 二进制 ...
- PHP执行系统命令
<?phpexec("ping www.baidu.com -n 1",$output,$status);var_dump($output);var_dump($status ...
- smarty入门
1 2 3 4 首先要有3个文件夹configs.templates.templates_c,在configs文件夹中有一个配置文件:test.conf,代码: title = Welcome t ...
- Flex HTTPService json
import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService; i ...
- C#中判断字符是否大写
在C#中,通常判断一个字符是否为大写字母,有些人可能会第一时间想到用正则表达式,那除了正则表达式,是否还有其他方式呢? 答案是肯定的,先一睹为快,具体代码如下: using System; using ...
- Extjs 图片的自动缩放
function resizeImage(obj) { var width = Ext.getCmp('welcome').getWidth(); //welcome 为一Panel的id 分割线下的 ...
- Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略
在项目中,之前公司是使用IIS 7.0官方的URL重写模块,官方的使用说明请参见官方URLRewrite ,添加伪静态支持,后来经理问我有没有涉及伪静态,我说之前项目中我一直是用Intelligen ...
- LeetCode Strobogrammatic Number
原题链接在这里:https://leetcode.com/problems/strobogrammatic-number/ 题目: A strobogrammatic number is a numb ...
- 【转】Linux下怎样检查、如何查看某软件包是否已经安装?
因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了.总结起来就是这样几类: 1.rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm -qa ...
- 设计模式之 -- 状态模式(State)
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...