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 ...
随机推荐
- Odoo 中group domain的优化应用
首先一个前提是 odoo 默认情况下 一个menu 只能绑定一个action 而这个action中只有一个domain,而我们的需求是需要点击菜单,然后根据用户所属的组的不同而选择不同的action, ...
- Address already in use:JVM_Bind
1.原因:端口被占用 2.解决方式: 方式一:重启电脑 方式二:方式一不行执行方式二 双击Tomcat server 将Ports下HTTP/1.1对应的Port Number 改为其他值 备注: ...
- Js分页插件,支持页面跳转
这里先给出API: 你只需要提供一个对象涉及以下几项属性,你来设置属性值,通过jq对象链式调用page()以参数形式来加载这个对象,按照参数要求会自动生成分页功能, 参数中pageEvent是可以让你 ...
- Js练笔——用循环和递归实现追踪对象深度(循环引用关系不考虑)
function reobs(obj){ //返回对象中对象属性组成的数组 var a=[]; var b=[]; for(it in obj){ a.push(it); } for(var i=0; ...
- c#语句 随堂练习2
1.方程ax²+bx+c=0是一元二次方程,求根. 2.输入一个年份 ,判断是不是闰年.(能被4整除但不能被100整除的年份是闰年,有的世纪年也是闰年) 3.标准体重:男士体重=身高-100±3:女士 ...
- bzoj3991: [SDOI2015]寻宝游戏--DFS序+LCA+set动态维护
之前貌似在hdu还是poj上写过这道题. #include<stdio.h> #include<string.h> #include<algorithm> #inc ...
- Vim 常见操作
1.复制所有内容 按照此顺序敲即可:gg(光标定位到文件头) V(选中该行) G(选中该行开始到最后一行结尾) y(复制选中内容) 2.粘贴所有内容 正常模式下,敲p即可,如果遇到粘贴内容不全,需要 ...
- TOMCAT启动时报错:the CATALINA_HOME environment variable is not defined correctly
运行tomcat/bin目录下的startup.bat时报错:the CATALINA_HOME environment variable is not defined correctly 碰到这个问 ...
- 程序中的@Override是什么意思
@Override是Java5的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记 @Override是伪代码,表示重写( ...
- Eclipse创建java web工程配置Tomacat和JDK 【转】
在学习AJAX过程中,还用Intellij就有点老旧了,这是后装个Eclipse时,发现这个配置也很头疼,现在就叫你如何创建一个web工程,同时叫你配置Eclipse. 一.创建一个web工程 1.打 ...