osip源代码框架详解
OSI参考模型体系
传输层
传输层负责建立和维护端到端的连接,确保数据的可 靠传输。
输入 标题
详细描述
传输层的主要功能包括建立连接、管理数据流量和控 制数据传输等。它还提供诸如可靠传输和不可靠传输 等传输服务。
总结词
总结词
传输层通过使用诸如TCP和UDP等传输协议来提供可 靠的传输服务。这些协议通过确认机制、重传机制和
表示层的主要任务是处理数 据的表示和转换。
详细描述
表示层通过使用各种表示协 议(如MIME和TLS)来处 理数据的表示和转换。此外, 表示层还负责数据的加密和 解密以及压缩和解压缩等任 务,以确保数据的机密性和 完整性。
应用层
总结词
详细描述
总结词
详细描述
应用层是OSI参考模型的最 顶层,负责处理用户的具体 应用需求。
会话层通过使用各种会话协议 (如RPC和SQL)来管理会话连 接,并确保通信的同步性。此 外,会话层还负责管理对话控 制,以确保通信的正确性和可 靠性。
表示层
总结词
表示层负责数据的表示、编 码和加密等任务。
详细描述
总结词
表示层的主要功能包括数据 的表示、编码和解码、加密 和解密以及压缩和解压缩等。 它还负责转换上层的数据格 式以适应下层的协议要求。
传输效率。
OSI参考模型在网络安全中的应用
安全策略制定
安全风险评估
利用OSI参考模型,可以对网络系统进行全面的安 全风险评估,识别潜在的安全威胁和漏洞。
OSI参考模型提供了多层安全策略制定的框 架,包括物理层、数据链路层、网络层和应 用层的安全策略。
安全事件响应
OSI参考模型有助于安全事件响应团队快速 定位问题所在层,采取相应的措施进行处置 。
OSI参考模型与TCPIP五层网络架构详解
OSI参考模型与TCPIP五层⽹络架构详解OSI七层模型OSI的来源OSI(Open System Interconnect),即开放式系统互联。
⼀般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的⽹络互连模型。
ISO为了更好的使⽹络应⽤更为普及,推出了OSI参考模型。
其含义就是推荐所有公司使⽤这个规范来控制⽹络。
这样所有公司都有相同的规范,就能互联了。
OSI七层模型的划分OSI定义了⽹络互连的七层框架(物理层、数据链路层、⽹络层、传输层、会话层、表⽰层、应⽤层),即ISO开放互连系统参考模型。
见下表OSI参考模型各层的解释应⽤层为应⽤程序提供服务表⽰层数据格式转换,数据加密会话层建⽴,管理和维护会话传输层建⽴,管理和维护端到端的链接⽹络层IP选址及路由选择数据链路层提供介质访问和链路管理物理层以⼆进制数据的形式在物理媒体上传输数据每⼀层实现各⾃的功能和协议,并完成相邻层的接⼝通信。
OSI的服务定义详细说明了各层所提供的服务。
某⼀层的服务就是该层及其下各层的⼀种能⼒,它通过接⼝提供给更⾼⼀层。
各层所提供的服务与这些服务是怎么实现的⽆关。
各层功能定义详解应⽤层OSI参考模型中最靠近⽤户的⼀层,是为计算机⽤户提供应⽤接⼝,也为⽤户直接提供各种⽹络服务。
我们常见应⽤层的⽹络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。
表⽰层表⽰层提供各种⽤于应⽤层数据的编码和转换功能,确保⼀个系统的应⽤层发送的数据能被另⼀个系统的应⽤层识别。
如果必要,该层可提供⼀种标准表⽰形式,⽤于将计算机内部的多种数据格式转换成通信中采⽤的标准表⽰形式。
数据压缩和加密也是表⽰层可提供的转换功能之⼀。
会话层会话层就是负责建⽴、管理和终⽌表⽰层实体之间的通信会话。
该层的通信由不同设备中的应⽤程序之间的服务请求和响应组成。
传输层传输层建⽴了主机端到端的链接,传输层的作⽤是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。
网络OSI七层参考模型
网络OSI七层参考模型一、OSI参考模型在整个参考模型中,下层是为上层提供服务。
二、TCP/IP常见的协议(一)应用层为应用软件提供接口,使应用程序能够使用网络服务,应用层协议指定相应的传输层协议,以及传输层所使用的端口等。
应用层的PDU被称为Data(数据)。
Telnet:端口号23,使用传输层TCP协议,远程接入协议,提供远程管理服务,通过Telent客户端程序连接到服务器,用户在客户端中输入命令,这些命令在服务器端运行。
FTP:端口号20、21,使用传输层TCP协议,文件传输协议,主要用于文件的下载和上传,采用C/S((主机/服务器)结构。
TFTP:端口号69,使用传输层UDP协议,简单的文件传输协议SNMP:网络管理协议,一般用在管理平台,可将交换机、路由器等一些设备信息上传到网管平台HTTP:端口号80,使用传输层TCP协议,超文本传输协议,提供浏览网页服务。
SMTP:端口号25,使用传输层TCP协议,邮件传输协议DNS:域名解析协议,将域名翻译成IP地址进行访问网址DHCP:动态主机配置协议,自动匹配IP地址(二)传输层传输层协议接受来自应用层协议的数据,封装上相应的传输层头部,帮助其建立端到端的连接。
端口号的取值范围:0-655350-1023:知名端口号,发送过程中会在发送端随机匹配一个端口号,并且是在1023之外未使用的。
传输层的PDU被称为Segment(段)1.TCP一种面向连接的、可靠的传输层通信协议。
在传输前先建立连接,之后才可以传输,传多少接收多少,丢包之后重传确保全部收到。
使用场景在文件传输或者文档传输中使用。
(1)TCP的建立-三次握手A.主机1向主机2进行syn(查询B.主机2向主机1进行syn查询,ACK确定C.主机1进行ACK确定----------TCP连接建立--------------(2)TCP四次挥手A.主机1向主机2发送FIN请求断开连接B.主机2向主机1发送ACK确认C.主机2向主机1发送FIN请求断开连接D.主机1向主机2发送ACK确认----------TCP连接断开--------------(3)TCP序列号与确认序列号序列号:对包进行排序,根据序列号确认序列号:对收到的包进行确认A.主机1向主机2发送3000的数据包,最大数值需要1500包,进行分段传输,0-1499,1500-2999B.主机2收到包后向主机1进行发送确认序列号,未收到或者丢包,主机2会向主机1再次发送所丢失的包进行重传。
osi模型的组成 概述及解释说明
osi模型的组成概述及解释说明1. 引言1.1 概述在计算机网络领域中,Open Systems Interconnection(OSI)模型是一个被广泛使用的标准,用于定义和描述计算机网络中不同层级之间的通信协议。
通过将整个通信过程分为不同的抽象层级,OSI模型提供了一种结构化的方法来处理网络通信。
1.2 文章结构本文将对OSI模型进行详细的解释说明,包括其组成和各个层级的功能。
首先,我们将讨论OSI模型整体的概述,以及其作为一个框架所起到的作用。
然后,我们会逐一介绍每一层级,并详细解释它们在通信过程中扮演的角色和提供的功能。
最后,在结论部分我们将总结主要要点,并讨论OSI模型在现实世界中的重要性和应用,并展望未来发展趋势与挑战。
1.3 目的本文旨在向读者介绍OSI模型并解释其组成及各层级功能。
通过阅读本文,读者将能够深入理解OSI模型,并更好地理解计算机网络通信过程中各个层级之间的关系和交互。
同时,本文也旨在探讨OSI模型在实际应用中的重要性和应用前景,并提供展望未来发展趋势与挑战的观点。
通过阅读本文,读者将能够获得关于OSI模型的全面知识,并对计算机网络通信有更深入的理解。
2. OSI模型的组成2.1 OSI模型概述OSI模型(Open Systems Interconnection Model)是一种将计算机网络通信过程划分为7个不同层次的概念框架。
每个层次负责特定的功能,通过分层的方式实现了网络通信的可靠性和互操作性。
2.2 第一层:物理层物理层是OSI模型中最底层的一层。
它主要负责传输基本的比特流,将数字数据转化为电子信号并在物理介质上进行传输。
在这一层,我们关注的是数据如何通过传输介质(例如电缆、光纤等)从一个设备发送到另一个设备。
2.3 第二层:数据链路层数据链路层位于物理层之上,主要解决相邻节点之间可靠地传输数据的问题。
它将原始比特流转化为有意义的帧,并通过帧起始和结束字符标示出帧的界限。
OSI模型解析
OSI模型解析OSI模型是计算机网络体系结构中的重要概念,它将网络通信的过程划分为七个不同的层次。
每一层都有自己的功能和任务,共同协作完成数据传输。
本文将对OSI模型进行详细解析,深入探究每一层的作用和相互关系。
第一层 - 物理层物理层是OSI模型的最底层,主要负责将数据转换为传输所需的电信号,并通过物理媒介进行传输。
它关注的是数据的传输单位是比特(bit),包括传输介质、电缆规范、编码方式等。
物理层主要作用是确保数据的可靠传输,例如通过传输介质的选择和电平控制来实现数据的传输。
第二层 - 数据链路层数据链路层负责在直连的节点之间提供可靠的数据传输。
它将原始数据分割成数据帧,并通过物理层提供的物理媒介进行传输。
数据链路层有两个子层,即逻辑链路控制(LLC)子层和介质访问控制(MAC)子层。
LLC子层主要处理数据帧的逻辑连接控制,而MAC 子层则处理数据的访问控制和媒介争用的问题。
第三层 - 网络层网络层是OSI模型的第三层,主要负责数据包的路由和转发。
它将数据分割成较小的数据包,并通过路由器进行传输。
网络层的主要功能是将数据从源节点发送到目标节点,通过确定最佳路径和设置优先级来实现数据的高效传输。
此外,网络层还处理数据包的片段、拥塞控制等问题。
第四层 - 传输层传输层负责提供端到端的数据传输服务。
它通过端口号来标识不同的应用程序,并通过传输协议(如TCP和UDP)来实现数据的可靠传输。
传输层提供了数据的分段、重组、流量控制和错误恢复等功能,确保数据的完整性和可靠性。
第五层 - 会话层会话层负责在不同计算机之间建立、管理和终止会话。
它通过提供会话控制机制和同步功能来实现进程之间的通信。
会话层允许应用程序在不同计算机之间建立连接,并提供同步点以确保数据的顺序和完整性。
第六层 - 表示层表示层负责对数据进行编码和解码,以确保不同系统之间的数据交换的兼容性。
它处理数据的格式转换、数据加密和解密、数据压缩和解压缩等任务。
osip源代码框架详解
Osip协议源代码框架详解Prepared by Mao minghua Date 2009.09.25 Reviewed by DateApproved by DateRevision HistoryVersion Author Reviewed By Comments Issued Date 0.1Mao minghua 描述osip协议栈的源代码框架目录1符号及缩写 (4)2整体描述 (4)3OSIP包的源代码框架解析 (5)3.1 OSIP的TRANSACTION的EVENT的产生 (5)3.1.1 定时器事件的产生过程 (6)3.1.2 报文触发的事件 (7)3.2 OSIP 的TRANSACTION的EVENT处理流程 (7)3.2.1 ICT的处理流程 (8)3.2.2 IST的处理流程 (9)3.2.3 NICT的处理流程 (9)3.2.4 NIST的处理流程 (9)3.3 O SIP报文的解析 (10)3.3.1 sip协议报文的解析整理流程 (10)3.3.2 Osip报文头的解析 (12)3.3.3 uri的解析 (14)3.3.4 添加一个新的协议header字段 (15)3.4 OSIP的TRANSACTION的管理 (16)3.5 OSIP中DIALOG的管理 (18)4EXOSIP包的源代码框架解析 (19)4.1 L IB库的初始化和销毁 (20)4.2 L IB库的主处理线程 (23)4.2.1 2xx应答的重发处理机制 (24)4.2.2 Exosip_execute执行流程 (24)4.2.2.1 Exosip_read_message的处理 (26)4.2.2.2 eXosip_process_response_out_of_transaction的处理流程: (29)4.2.3 eXosip_automatic_action处理流程 (29)4.3 C ALL的处理 (30)4.3.1 创建Call的第一个INVITE (30)4.3.2 INVITE的ACK应答的创建和发送 (32)4.3.3 dialog内的请求的创建和发送 (33)4.3.4 Dialog内answer的创建和发送 (34)4.4 R EGISTER的处理 (35)4.4.1 向一个服务器第一次注册 (35)4.4.2 调整一个注册的注册超时时间 (35)4.4.3 发送一个register注册 (36)Osip源代码框架详解1符号及缩写缩写英文全称中文名称ICT Invite Client Transaction Invite类型的客户端事务IST Invite Server Transaction Invite类型的服务端事务NICT Not Invite Client Transaction 非Invite类型的客户端事务NIST Not Invite Server Transaction 非Invite类型的服务端事务IMS IP Multimedia Subsystem IP多媒体子系统PSVT Packet service video telephony 分组域可视电话SIP Session Initiation Protocol 会话初始协议UDP User Datagram Protocol 用户数据报协议URL Uniform Resource Locator 统一资源定位器2整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。
osi参考模型的3个主要概念
OSI参考模型的3个主要概念是什么?在今天的网络世界中,OSI参考模型是一个非常重要的概念。
它是一个框架,用于描述和理解计算机网络通信的各个方面。
本文将会分别介绍OSI参考模型的3个主要概念,帮助读者更好地理解和应用这个概念。
1. 层次结构OSI参考模型的第一个主要概念是层次结构。
OSI参考模型将计算机网络通信划分为7个层次,每个层次负责不同的功能。
这些层次按照功能从低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
每个层次都有特定的功能和责任,但是它们之间又相互关联,协同工作。
通过层次结构,OSI参考模型将复杂的网络通信问题分解为相对简单的部分,使得网络设计、实现和调试更加科学和有效。
2. 分层协议OSI参考模型的第二个主要概念是分层协议。
为了实现层次结构,每个层次都需要使用相应的协议来完成特定的功能。
OSI参考模型中定义了各个层次的协议标准,这些标准通常被称为协议栈。
每个协议栈都包含多个协议,这些协议协同工作,完成特定层次的功能。
当一个计算机发送数据时,这些数据会经过每个层次的协议,分别添加相应的信息和处理方式。
而接收端的计算机则按照相反的顺序,逐层处理数据,最终将数据转化为应用层的信息,供应用程序使用。
3. 模块化设计OSI参考模型的第三个主要概念是模块化设计。
由于OSI参考模型采用了层次结构和分层协议,它使得计算机网络设计成为可能。
这种模块化的设计使得网络技术可以分为不同的领域,并且每个领域可以专门研究和发展。
物理层可以研究网络传输介质和信号编码方式,数据链路层可以研究MAC位置区域和帧格式,网络层可以研究IP位置区域和路由协议。
在实际的网络实现中,每个层次的技术和设备也变得更加专业和高效。
这种模块化的设计也为网络通信的标准化和互操作性提供了基础,推动了网络技术的发展和应用。
OSI参考模型的3个主要概念是层次结构、分层协议和模块化设计。
这些概念为计算机网络通信提供了理论基础,使得网络技术得以规范和发展。
OSI参考模型讲解
OSI参考模型的结构
物理层:负责传输原始 比特流,定义物理特性 如电压、线缆规范等。
数据链路层:负责将比 特流组合成帧,控制数 据传输的流程,如流量
控制和差错控制。
网络层:负责数据包的 路由和转发,处理数据 包的逻辑地址寻址和路
径选择。
传输层:负责提供端到 端的通信服务,处理数 据包的分段和重组,保 证数据的顺序和完整性。
网络层的功能和特点
网络层的主要功能是处理分组交换,负责路由和逻辑寻址。 网络层负责建立和维护通信子网,实现网络连接的建立、维持和释放。 网络层使用IP协议,负责将数据包从源地址发送到目的地址。 网络层还提供拥塞控制和差错控制功能,以确保数据传输的可靠性和效率。
传输层的功能和特点
传输层的功能:提供端到端的数据传输服交互,实现端到端通信。
OSI参考模型的应用和发展趋 势
OSI参考模型的应用场景
远程教育 电子商务 物联网 云计算
OSI参考模型的优缺点
优点:提供了 一种标准化的 网络体系结构, 使得不同厂商 的设备和系统 能够相互通信。
缺点:层次过 多,导致协议 复杂、实现成 本高、传输效
率低。
OSI参考模型的发展趋势和未来展望
云计算和虚拟化技术的普及,使得OSI参考模型的应用更加广泛。 物联网和5G技术的快速发展,将推动OSI参考模型向更高层次的应用。 随着网络安全问题的日益突出,OSI参考模型的安全性将得到更广泛的关注和应用。 人工智能和机器学习技术的应用,将为OSI参考模型的发展带来新的机遇和挑战。
THANK YOU
表示层的功能和特点
表示层主要负责对数据进行编码和格式化,以确保数据在传输过程中具有正确的语法和语义。 表示层还负责对数据进行加密和解密,以确保数据在传输过程中的安全性。 表示层还负责对数据进行压缩和解压缩,以减少数据传输所需的带宽。 表示层还负责对数据进行校验和计算,以确保数据在传输过程中没有发生错误。
oSIP协议栈(及eXoSIP、Ortp等)使用入门
一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。
第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。
同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。
这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。
处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#include <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:/Program Files/Microsoft Visual Studio/VC98/Include。
osip源代码框架详解
Osipणᩲ⑤ҷۅḚᶊ᪪ᢧPrepared by Mao minghua Date2009.09.25Reviewed by DateApproved by DateRevision HistoryVersion Author Reviewed By Comments Issued Date 0.1Mao minghuaᦣẴosipֲᔩ৪োঞ෭ݭ4Ẵ4OSIP ࣙՈ⑤ᵤ53.1osip Ոtransaction Ոevent Ոѻ53.1.1ᯊ఼Ոѻẋ࣏63.1.2থՈџ73.2osip Ոtransaction Ոevent ˊ⌕73.2.1ICT Ո໘ˊ⌕83.2.2IST Ո໘ˊ⌕93.2.3NICT Ո໘ˊ⌕93.2.4NIST Ո໘ˊ⌕93.3Osip Ոᢧᵤ103.3.1sip णᩲՈᢧᵤᭈˊ⌕103.3.2Osip Ոᢧᵤ123.3.3uri Ոᢧᵤ143.3.4ϾᮄՈणᩲheader153.4osip Ոtransaction Ոˊ163.5osip Ёdialog Ոˊ18EXOSIP ࣙՈ⑤ᵤ194.1Lib Ո߱࣪⏄204.2Lib ՈЏˊඃ234.2.12xx ᑨਘՈₑথ໘ˊᴎࠊ244.2.2Exosip_execute 244.2.2.1Exosip_read_message Ո໘ˊ264.2.2.2eXosip_process_response_out_of_transaction Ո໘ˊ⌕˖294.2.3eXosip_automatic_action ˊ⌕294.3Call Ո໘ˊ304.3.1Call ՈৰϾINVITE 304.3.2INVITE ՈACK ᑨਘՈ߯থễ324.3.3dialog ݙՈ᪻Ո߯থễ334.3.4Dialog ݙanswer Ո߯থễ334.4Register Ո໘ˊ344.4.1Ͼ᳡ࡵ఼354.4.2Ͼ⊼Ո⊼ᯊᯊⒸ354.4.3থễϾregister35Osip⑤ҷۅḚᶊ᪪ᢧ෭ݭЁ᭛ICT Invite Client Transaction ,QYLWHିIST Invite Server Transaction ,QYLWHିNICT Not Invite Client Transaction ☢,QYLWHିNIST Not Invite Server Transaction ☢,QYLWHିIMS IP Multimedia Subsystem IPPSVT Packet service video telephony SIP Session Initiation Protocol UDP User Datagram Protocol URLUniform Resource LocatorՈosipणᩲЎϸϾ⑤ࣙˈᭈϾणᩲϬlibՈᔶˈݙᾬϬࠄӏࡵˈ₋ϢTCP/IPणᩲՈਚˈ᠔ҹՓϬϞˊӏࡵָϬlibՈষDŽЎLib ݙᾬϬࠄڣᯊ఼ǃথễՈӏࡵˈ໐ৠᯊ◄Ϭࠄᅮᯊ఼ˈ᠔ҹlib ՈݙᾬϬḲՈᮍϡذՈẔᰃ৺ᯊ఼ᯊˈẝᶤCPUՈܕᯊⒸDŽৠᯊᭈϾlibɴњᇍcall, notifyՈˊˈЎњɴₑܹˈᑨϬਃϬՈᴵϟˈݙᾬϬՈֵোₓ⏅ՈՓϬˈϟ☦ՈߚᵤЁϡ⍝ঞࠄֵোₓ⏅ࠊDŽLibsipणᩲՈሖЎϸϾlibࣙˈᑩՈosip libࣙᅲɴᇍऩϾ᪻ǃᑨਘǃACK Ո໘ˊˈࣙᣀmessageՈᢧᵤǃᣐǃݙᆍset getˈऩϾ᪻Ոtransactionּ᪡ҹঞỞᔶՈϔϾdialogՈ᪡DŽLibՈexosip libᑩosip libՈᅲɴˈᅲɴᇍsipणᩲˊỿՈˊDŽExosipՈᰃsipणᩲՈϮࡵ⌕ˈࣙᣀcallՈᭈˊˈnotifyՈᭈˊˈpublishՈˊˈregisterՈˊˈoptionՈˊˈreferՈˊsubscriptionՈˊˈ݊Ё᳔ՈЎcall registerՈˊˈẝϸϾЎsipणᩲɴՈᾬˈϾࡳ࿁ЎsipणᩲDŽҢẝϾϮࡵՈˊ⌕থˈϮࡵՈᑩϬࠄּԐՈϔѯࡳ࿁ˈབ⊼Ոᩨˈথễmessageˈmessageˈ↣Ͼ᪻ᑨਘᔶՈtransactionˈϾtransaction໐៤ՈdialogDŽmessageՈ໘ˊᮍˈৃҹߚЎϸˈϔЎথễՈmessageˈЎᰃЏথễˈ᠔ҹϞˊሖᰃҔՈmessage ˈlibষկϬDŽϔЎࠄՈmessageˈЎϡکᰃાˈ᠔ҹ◄ᵤߎᴹՈmessageՈֵᙃᴹẟᜐˊˈẝᾬՈ໘ˊudp.cЁDŽϾlibՈ߱࣪exOsipЁҟDŽ Osip Ո⑤osipࣙЁ᳔ՈࣙᣀmessageՈּ݇᪡ˈ݊Ё᳔ₑᡅՈЎmessageՈᢧᵤˈेҢቻࠄՈϔϾmessageЁᢧᵤϣϾ࿁ˊՈmessage᭄ᵘˉüosip_message_tDŽϢmessageᵘּ݇Ո᪡ࣙᣀmessage᭄ᵘՈֵᙃᅝsipणᩲϾmessage৪І˗messageᵘՈ߱࣪₎˗messageᵘՈᣋ᪡˗ҹঞҢmessageᵘЁቻᵤՈ៤Ոؐ᪂าϾ៤ՈؐDŽmessageՈᢧᵤᾬˈ┨њmessageՈ༈ˈẜࣙᣀbodyՈᢧᵤˈ⍝ঞࠄsdpणᩲˈࣙᣀᇍ↣Ͼsdp ՈᢧᵤDŽosipࣙЁˈ᪂ϾϢৠϔϾּ᪻݇Ո᠔᳝messageՈ▊transaction ˈথễࠄϔϾᮄՈ᪻ՈᯊϾtransactionˈ݊ЁACKCANCEL ᰃ↨ṇĽ⅞Ոˈᇍ2xxᑨਘՈACK߱INVITEᰃৠϔϾtransaction Ոˈ໐ᇍ2xxՈ᪻ᰃՈtransactionՈˈ᠔ҹ݊ₑ᪡ϵUACᴹࠊˈ໐ϡINVITEՈtransactionݙᾬẟᜐࠊDŽCANCELՈ᪻┨њᴀᵯϾtransaction ˈḍणᩲCANCELՈ᪻Ոtransaction ˈབࡳӮCANCELּᑨՈtransactionDŽosipࣙЁৠḋdialogּ݇᪡ˈࣙᣀdialogՈᓎˈdialogᙃՈᄬˈdialogՈঞ┨᪡DŽ݊ᅗˈࣙᣀЁՓϬࠄՈ⏅ֵোₓঞֵোˈݙᾬϬࠄՈˈϬՈⓣ(ẟ)ˈϔѯՈˈᅮᯊ఼ҹঞՈᅮDŽẝᾬ↨ṇˈ໐ᰃ᳔ߑ᭄ˈָϬሖDŽ .1osip Ոtransaction Ոevent ՈѻtransactionՈ࣪ᰃϵᴹՈˈᔧtransactionᯊˈḍՈᔧࠡtransactionՈᴹ໘ˊ᪩eventDŽTransactionՈџЎϸ˖ϔЎᅮᯊ఼ˈ᪂Ոᅮᯊ఼ᯊᯊӮּᑨՈᅮᯊ఼˗ЎџˈབথễϾ᪻ǃᑨਘࠄϔϾ᪻ǃᑨਘˈথễϾACKࠄϔϾACKˈेᰃϵՈџDŽ .1.1ᯊ఼Ոѻẋ࣏ICT ǃIST ǃNICT NISTՈᅮᯊ఼ՈџˈᇍϾtransactionˈ݊ᅮᯊᰃ᳝ՈˈICTЁTIMEOUT_B ՈˈTIMEOUT_Bᯊ఼থˈӮথkill transactionՈ᪡DŽᔧtransactionffЁ᳝ˊՈџᯊˈϡ໘ˊᅮᯊ఼ˈָಲˈ᠔ҹtransactionffЁՈџՈ᭄ₓᰃϡՈDŽ᠔᳝Ոᅮᯊ఼ߑ᭄᫇ϬᑩৠϔϾᅮᯊ఼ߑ᭄__osip_transaction_need_timer_x_event DŽ᪩ߑ᭄Ӯ᪩ᯊ఼ᰃ৺ˈЎ(timer->tv_sec == -1)ˈབˈẔᔧࠡᯊⒸᰃ৺ẋᅮᯊ఼Ё᪂ՈᯊⒸˈབᰃˈ߭Ոᅮᯊ఼DŽЎᅮᯊ఼ϾऩՈӏࡵˈ᠔ҹᰃ₋Ոᮍᰃ৺Ոᅮᯊ఼ˈ໐ϡᰃḍᯊЁẟᜐˈ↨ṇऴϬிDŽᯊ఼ՈਃϬষosip_gettimeofday add_gettimeofdayDŽᯊ఼Ո᱉ᯊᯊⒸˈे᪂ϾᮄՈᅮᯊ఼DŽপϾᅮᯊ఼ˈᯊ఼Ոtimer->tv_sev Ў-1DŽ .1.2থՈџࣙᣀϾᮄՈinvite ǃresponse ǃackՈথễˈ┨њᇍ2xxՈᑨਘackˈ݊ՈᑨਘϾᮄՈtransactionˈϾᮄՈsipeventDŽ .2osip Ոtransaction Ոeventsip णᩲЁЎњՈ໘ˊtransactionˈḍणᩲՈᦣẴˈЎϡৠՈtransactionˈߚЎICT ǃIST ǃNICT NISTDŽϡৠՈtransactionϡৠՈ໘ˊ⌕ˈҹঞՓϬࠄϡৠՈᅮᯊ఼DŽICT ǃIST ǃNICT NISTՈߑ᭄໘ˊᮍˈЎˊՓϬ⊼ߑ᭄ˈ⑤ЁՓϬњϾܼˊϡৠିtransactionՈ˖ict_fsmǃist_fsm ǃnist_fsm nist_fsmDŽosipᵘབϟ˖struct osip {void *application_context;/**< User defined Pointer *//* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions;/**< list of ict transactions */osip_list_t osip_ist_transactions;/**< list of ist transactions */osip_list_t osip_nict_transactions;/**< list of nict transactions */osip_list_t osip_nist_transactions;/**< list of nist transactions */ĂĂ}ˊ⌕བϟ˖ 5-1˖transactionՈevent.2.1ICTՈ໘ˊ⌕བϞˈICT ˊᯊ˖3)osipˊᵘЁՈosip_ict_transactionsˈབˈָಲOSIP_SUCCESS5)ЁϾ᭄ˈᄬtransactionࠄᯊ᭄ඈ10)᠔᳝transaction ˈosip_fifo_trygetϾtransactionЁՈџˈ᫇Ϭosip_transaction_executeˊ↣Ͼџˈָࠄ᠔᳝transactionЁՈ᠔᳝ˊˈಲDŽOsip_transacton_execute ᯊˈḍՈ᭄osip_transaction_t * transactionЁՈtransactionde ࠄՈܼˊবict_fsmˈevent ՈtypetransactionՈϬfsm_callmethod᭛fsm_misc.cˈᰃߑ᭄ՈষüࠄeventՈ໘ˊߑ᭄ˈϬ໘ˊߑ᭄ẟᜐeventՈ໘ˊDŽICTՈּ݇eventՈ⊼ˊߑ᭄ict_fsm.cict.cDŽICTϬࠄњ3Ͼᅮᯊ఼˖TIMEOUT_A ǃTIMEOUT_B TIMEOUT_DDŽclientথễInvite໐◄ՈICT ՈtransactionᯊˈTIMEOUT_BˈᯊЎ64*DEFAULT_T1(DEFAULT_TI Ў500ms)ˈTIMEOUT_BЎᭈϾtransactionՈϣᯊˈབẋẝϾᯊⒸˈtransactionDŽབৠϬՈᰃ≵ՈUDPˈ߭าTIMEOUT_A ˈTIMEOUT_DՈⒸ╘ᯊⒸЎDEFAULT_T164* DEFAULT_T1DŽབϬՈᰃ☦ՈTCPঞּ݇णᩲˈ߭ϬTCPݙᾬՈₑࠊˈϡSIPणᩲՈࠊˈ᠔ҹϡਃTIMEOUT_A TIMEOUT_D DŽTIMEOUT_AˊInviteՈˈInviteথễᯊˈਃᯊ఼TIMEOUT_Aˈ᱉ᯊᯊⒸݙẜࠄresponseՈᯊˈₑথ᪩Invite DŽTIMEOUT_DϬˊACKˈᔧࠄՈresponseϡᰃ>˙300ᯊˈclientথễACKˈᔧₑࠄ᪩invite Ոresponseᯊˈₑথ᪩ACKˈserverkilltranctionࠄACKDŽ .2.2IST Ո໘ˊ⌕ৠICT Ո໘ˊ⌕ˈ໘ˊosipЁՈosip_ist_transactionDŽISTՈּ݇eventՈ⊼ˊߑ᭄ist_fsm.cist.cDŽISTϬњᯊ఼TIMEOUT_GǃTIMEOUT_HTIMEOUT_IDŽՓϬᮍϢICTLˈणᩲDŽ .2.3NICT Ո໘ˊ⌕ৠICTՈ໘ˊ⌕ˈ໘ˊosipЁՈosip_nict_transactionDŽNICTՈּ݇eventՈ⊼ˊߑ᭄nict_fsm.cnict.cDŽNICTϬњᯊ఼TIMEOUT_EǃTIMEOUT_F TIMEOUT_KDŽ .2.4NIST Ո໘ˊ⌕ৠICTՈ໘ˊ⌕ˈ໘ˊosipЁՈosip_nist_transactionDŽNISTՈּ݇eventՈ⊼ˊߑ᭄nist_fsm.cnist.cDŽNISTϬњᯊ఼TIMEOUT_JDŽ .3OsipՈᢧ.3.1sipणᩲՈᢧᵤᭈˊ⌕ᔧࠄϔϾmessageՈᯊˈ◄ᵤ᪩messageˈϣϾҷˊՈ᭄ᵘˈ᪩ᵘᅮЎstruct osip_messageˈ᪩ᵘᅮՈϔϾmessageՈּܼ݇ᙃˈẝѯֵᙃЏᰃկtransactiondialogঞdialogՈབcallˈnotifyՈՓϬDŽᇍϔϾmessageՈᢧᵤ⌕བϟ᠔˖ࠄϔϾmessageᯊˈ᫇Ϭߑ᭄osip_message_parseẟᜐmessageՈᢧᵤDŽϬߑ᭄osip_util_replace_all_lws messageЁՈɴՈ ‘\r\n\tÿǃþ\r\tÿǃþ\n\tÿǃþ\r\n ÿǃþ\r ÿǃþ\n ÿЎˈmessageᰃҹþ\0ÿЎՈˈmessageՈheadersᰃҹ’\r\n\r\n’ЎՈˈࠄ’\r\n\r\n’Ўˈेheaders bodyՈߚɴՈ\t ǃ\r ǃ\nDŽϵѢsipणᩲˈ↣Ͼheadersᰃˈ໐Ո༈Ͼᄫ৪ϡЎ\tˈ᠔ҹϸϾheaderՈ\r\nϡӮˈՈᰃϔϾܕmultiՈheaderՈݙᾬϾؐПՈĀ\r\n\tāĀ\r\nāDŽབϟ˖᳝Ͼheaderˈ݊ЁSubject Ͼؐߎɴˈ RouteϾؐߎɴˈ໐ˈᰃߚҹ\tˈ໐Subject Routeˈᰃ\tՈˈosip_util_replace_all_lwsߑ᭄ᇚRoute header valueЁՈϸՈ\r\n\t࣪ЎˈेỿЎϔDŽSubject: Lunchute: <:a ce@tl nta co <:bo b@bi co<sip:carol@>Ͼmessageϵϝˈᰃmessage Ոstartlineˈ᪩ẝᰃϔϾsipՈmessage ˈࣙᣀsipˈ᪻ᑨਘˈؐˈҹ\r\nЎheadersՈߚ╘৪DŽ᪩\r\nϡӮosip_util_replace_all_lwsЎˈབ᪻ՈINVITE sip:bob@IP .0ᑨਘՈIP .0 200 O ˈϾϾDŽՈᢧᵤϵosip_me ssa st lin pa se ẟᜐᵤˈᢧᵤࠄme ssa Ոିˈme ssa Ոsipv sionҹঞme ssa Ոst s_cod ˈᔧst s_cod Ў߱࣪ؐ0ᯊˈ᪩me ssa ЎϔϾ᪻ˈ৺߭ЎᑨਘDŽ᪻Ոst lin ϵosip_me ssa st lin pa se ẟᜐᵤˈࠄ᪻Ոst i;ᑨਘՈst lin ϵosip_me ssa st lin pa se spẟᜐᵤDŽlin ՈᢧᵤᰃɴՈϾՈẟᜐᵤՈˈᇚᵤᄬosip_me ssa ՈᵘЁDŽᵤme ssg Ոsˈ᫇Ϭߑ᭄ msg s_pa seDŽosipՈᵤDŽབmessageЁheadersϡᰃ৪’\0’ˈ߭ණᵤmessageՈˈ᫇Ϭߑ᭄msg_osip_body_parseẟᜐᵤDŽMessage ՈbodyᵤheadersᵤЁᄬՈcontentेbodyՈ˖content_type ˈབcontent_typeЁՈtypeϡЎmultipartˈेϡmimeՈcontentˈbodyЁህϾˈָᇚϾbodyᵤЎϔϾݙᆍ˗བtype ЎmultitypeˈϾՈbodyϔϾᭈՈbodyˈ߭ҹ”--”Ўߚ╘৪ᢧᵤbodyˈᇚbodyЎϾmimeՈᄫ৪Іˈ↣ϾᢧᵤՈbodyݙᆍᄬosip_messageᵘЁՈbodiesᵘ៤ЁDŽ .3.2OsipՈᢧᵤᢧᵤmessage ՈheaderՈᯊˈЎՈosip_util_replace_all_lws࣪њϾheaderݙᾬɴՈ\rǃ\n \tЎˈ᠔ҹ↣ϾheaderҹՓϬ\r\nЎߚ╘৪ẟᜐ╘DŽབ৪Іstart_of_headerࠄ৪”\0”ˈ߭headerᵤˈಲࡳ˗᫇Ϭ__osip_find_next_crlfࠄẝϾheaderՈ৪ᄬend_of_headerЁ˗བstart_of_headerЎ\r\nˈ߭ᵤࠄ\r\n\r\n ेheadersՈ৪Іˈ߭ẘಲࡳˈᄬstart_of_header ࠄbodyЁˈेbodyᰃҢ\r\n৪ІᵤՈˈ᠔ҹbodyᵤᯊˈ◄ẋ\r\nঞПՈ˗ḍheaderݙᾬ╘৪Ā˖āˈপheaderՈhname hvalueˈ݊ЁhvalueᶤѯhnameՈϟᰃܕЎՈˈϬosip_message_set_multiple_headerᴹᵤ᪩headerՈhvalue৪І˗ᢧᵤ៤ࡳˈาstart_of_headerЎᏆᵤՈheaderՈend_of_header ˈᓔᵤϟϔϾheaderDŽosip_message_set_multiple_headerЁˈᇚheadersЎϸˈϔབϞЁՈSubjectˈϾؐˈ߭Ϭosip_message_set__headerẟᜐᵤ˗ϔབϞЁՈRouterˈܕϾؐˈḍsipणᩲˈ↣ϾؐПҹĀˈāẟᜐ╘ˈ᠔ҹ◄Ͼhvalue৪Іˈḍ”,”ᇚhvalue╘Ͼؐˈ↣Ͼؐ᫇Ϭosip_message_set__header ẟᜐᵤᄬᵤࠄosip_messageՈ᭄ЁDŽЎhvalueϬোᇚؐᴹˈ᠔ҹ◄Ľ߿ˊĀˈāᰃ৺ɴোݙᾬՈDŽোᾬՈĀˈāᠡᰃheaderؐՈߚ╘৪ˈ໐ݙᾬՈĀˈāাᰃϔϾheaderؐՈϔDŽosipЁosip_message_set__headerᇍmessage headersՈᢧᵤ₋Ϭ⊼ߑ᭄Ոᮍɴˈ₋ϬẝᴀᕜՈẟᜐՈheaderՈ⏏ˈϡӮࠄᭈϾՈḚDŽOsip_parser_cfg.cЁᅮheaderᵤ᠔ՓϬࠄՈܼˊব˖static__osip_message_config_t pconfig[NUMBER_OF_HEADERS];__osip_message_config_tՈᵘᅮབϟ˖typedef struct ___osip_message_config_t {char *hname;int (*setheader) (osip_message_t *, const char *); int ignored_when_invalid;}__osip_message_config_t;hname ЎsipणᩲՈ༈Ոᄫ৪Іˈẝѯᄫ৪Іosip_const.hЁ˗ߑ᭄setheaderЎ᪩णᩲheaderՈᇍᑨՈᢧᵤߑ᭄˗ignored_when_invalid Ўᰃ৺᪩header ᵤՈˈ᪩ᷛؐЎ1ᯊˈᢧᵤ᪩णᩲheaderথễᯊˈ᪩⏝ˈ┨sipणՈϾᖙheader ˈ݊ᑨ᪩ϬDŽЎњՈḍheaderՈhnameˈࠄᇍᑨՈsetheaderᵤߑ᭄ˈ₋ϬњhashՈᶹˈḍhnameϾhashؐˈϾϡৠՈhnameᇍᑨࠄৠϔϾhashؐЁˈҹᦤՈDŽ᫇Ϭ__osip_message_is_known_header (hname)ࠄ᭄ඈЁՈindex,Ϭ__osip_message_call_method (my_index, sip, hvalue)ᵤणᩲheaderˈᵤՈᄬᵘosip_message_t * dest,ЁDŽϾheaderࣙϾỞϬՈ᪡˖header৪ІՈᢧᵤߑ᭄ˈेϞࠄՈosip_message_set_xxxᵤߑ᭄˗headerᵤՈᵘՈቻߑ᭄ˈosip_message_get_xxxߑ᭄˗ḍheaderᵤՈᵘϣ৪ІՈߑ᭄˖osip_xxx_str˗headerᵤՈᵘՈcopyߑ᭄osip_xxx_clone ˗headerᵤՈᵘՈᰃ৺ߑ᭄˖osip_xxx_free˗ҹঞheaderᵤᵘՈ߱࣪ߑ᭄˖osip_xxx_init DŽᇍ↣ϾheaderՈϾּ݇᪡᳔ՈᰃᦤणᩲՈᭈϾheaderՈᭈ᪡ˈࣙᣀosip_message_init ˈosip_message_free ˈosip_message_clone osip_message_parse DŽ .3.3uriՈᢧᵤՈheaderՈᢧᵤᰃּՈˈ݊Ё᭄᳝ՈᾬՈheaderՈᢧᵤӮ↨ṇᴖˈ᳔Ո᳝from ǃto ǃcontactˈЎ┨њᴀᵯ᭄Пˈ݊ؐЁՈrequest_uriᴀҹ᭄ࣙˈ໐ẝϸ᭄Пᰃ᳝ՈDŽSipणᩲheaderՈЎ header’s name, header’s value header’s parameterDŽ݊Ёname valueϬĀ˖ā╘ˈvalue ϢparameterϬĀ˗ā╘ˈparameterϬĀ˗āּߚ╘DŽᵘᅮЁheaderՈvalueheaderࣙՈֵᙃẟᜐᵘবՈᅮˈ໐བࣙparameter߭Ͼgen_params Ոˈ᠔᳝ՈparameterᄬẝϾЁDŽབϟ☦fromՈᅮˈࣙfromՈৡঞϔϾurlˈঞּ݇Ոparameter˖struct osip_from {char *displayname; /**< Display Name */ osip_uri_t *url; /**< url */osip_list_t gen_params; /**< other From parameters */ };ᇍᑨparameter ՈᢧᵤָϬ__osip_generic_param_parseallˈ᪩ߑ᭄ᢧᵤheaderՈऩϾhvalue৪ІЁࣙՈ᠔᳝parameter ˈߑ᭄ݙᾬĀ˗āᇚ৪ІЎϾparameterˈᵤ↣Ͼparameter ˈᇚᵤᄬgen_paramsЁDŽParameterՈЎpname=pvalue ˈোϸDŽFrom ǃto ǃcontactҹঞviaЁⒸɴurl DŽurlՈᢧᵤষЎosip_uri_parseˈЎurlՈᄫ৪ІˈᢧᵤՈᵘᄬᵘosip_uri_tЁDŽurlࣙݙᆍ˖urlՈᴀᙃˈurl ՈheaderurlՈ᭄ᾬDŽᓔϢheaderϬĀ?āẟᜐ╘ˈheaderϬ”&”ẟᜐ╘ˈheaderϢ᭄ᾬϬ”;”ẟᜐ╘ˈ᭄ПϬĀ˗āẟᜐ╘DŽHeaderϬߑ᭄osip_uri_parse_headersẟᜐᵤˈᄬosip_uri_tᵘЁՈurl_headersЁ˗parameterϬߑ᭄osip_uri_parse_paramsẟᵤˈ݊ᄬosip_uri_t Ոurl_paramsЁDŽfrom ǃto ǃcontact ࣙurl ՈheaderЁˈབurlЁࣙparameterˈ߭ϾurlϬĀ<āĀ>āᴹˈҹϾurlDŽ᠔ҹᢧᵤfrom headerᯊ◄ᰃ৺ࣙ”<”৪DŽ .3.4ϾᮄՈणᩲheader1)ϾϔϾᇍ᪩ẟᜐᵤՈ᭛ˈ2)ࣙϾheaderϬࠄՈϾᴀϬ᪡ˈ3)བ᪩headerĽ⅞Ոˊˈ4)ּ݇Ո໘ˊߑ᭄ˈ5)6)Ўosip_xxx.c osip_xxx.h7)parser_initЁ⊼ՈheaderՈᢧᵤߑ᭄ˈ8)static__osip_message_config_t pconfig[NUMBER_OF_HEADERS]ЁՈNUMBER_OF_HEADERS ؐDŽ9)osip_const.hЁ⏏ՈheaderՈˈ10)osipՈּ݇Ո᪩11)osip_message.cosip_message_initߑ᭄Ё⏏ᇍ᪩headerּ݇ᵘՈ߱࣪᪡DŽosip_message_freeߑ᭄Ёৠ12)ᇍ᪩headerՈּ݇᪡ˈ13)osip_message_cloneЁ⏏ᇍ᪩headerՈcloneּ݇᪡DŽ14)osip_message_to_str.cЁՈ_osip_message_to_strߑ᭄Ё⏏᪩header࣪ЎstringՈߑ᭄⊼DŽ15)བ᪩headerϡ16)ₑ17)Ͼߎɴˈ18)ेϡ19)multiple headerˈ20)߭osip_message_parse.cՈ osip_message_set_multiple_headerߑ᭄Ё⏏ᇍ᪩headerՈ໘ˊDŽ21)osip_message.hՈ༈ЁՈosip_messageᵘЁ⏏ᇍ᪩headerՈᵘDŽ22)osip_headers.hЁ⏏ՈheaderՈ༈ϬDŽ .4osip ՈtransactionՈtransaction Ո᪡Џࣙᣀtransaction Ո߱࣪ǃtransaction Ոfree ǃtransactionՈǃҢtransactionЁቻᙃ᪂าtransactionᙃDŽsipणᩲẴϔϾtransaction ϵ5Ͼᖙ˖from ǃto ǃtopviaǃcall-id cseqˈẝ5ϾᾬϾtransactionˈབˈ᪩transactionาDŽ᠔ҹᇍ↣ϾᾬՈ᪂าϾ᪂าߑ᭄˖__osip_transaction_set_topvia ϬาtopviaˈᇍথễtopviaЎՈviaˈᇍtopviaЎᇚmessageথࠄՈ᳔Ͼsip-proxyࡵ఼ˈ__osip_transaction_set_fromϬาmessageՈথễˈ__osip_transaction_set_toϬาmessageՈˈ__osip_transaction_set_call_idϬาϾdialogՈؐˈ᪩ؐᰃՈˈᯊⒸݙϣՈcal_idᰃϡּৠՈˈ__osip_transaction_set_cseqϬาcseqؐˈ᪩ؐৠϔϾdialogݙᾬᰃϔՈˈेৠϔϾdialogՈՈtransaction Ոcseq↨ࠡՈtransaction Ոؐˈᣝsipणᩲ݊ؐৃҹᰃ᭄ˈҷɴЁབᰃregisterˈҢ1ˈབᰃregisterՈdialogˈҢ20DŽTransactionՈ߱࣪থϣࠄϔϾᮄՈ᪻থễϾ᪻Ոᯊˈ᪩ҹঞẋᢧᵤ៤ЎϔϾৃҹָϬ᪻ᙃՈᵘosip_message_tDŽ݊߱࣪ẋ࣏བϞ᠔Ẵˈ᪂า5Ͼᾬˈẜ࣪eventՈⓣˈҹঞḍosip_message_t Ոtype ࣪ՓϬࠄՈᅮᯊ఼ᵘˈབICT Ոict_contextDŽ݊ᅗՈ߱࣪exosip Ёᅲɴˈּ݇Ոབyour_instance ǃin_socket ǃout_socket recordᰃexosipЁᇍtransactionՈˊ໐᪂าՈDŽTransaction ЁՈeventՈּ݇᪡བ᠔ẴDŽtransactionՈЁˈḍRFC3261Ո᳔sipणᩲՈᦣẴˈϵtopviaՈbranch_idᰃ৺ּৠᴹˈབּৠˈህᰃৠϔϾtransactionՈ᪻ᑨਘঞACKˈЎᆍᴀՈtransactionՈ߭ˈৠᯊcall_id, cseq, from_tag, to_tag ᴹtransactionDŽབϟˈЎˊՈtransactionˈ᠔᳝Ոtransactionosip_tᵘՈЁˈᣝˊՈϡৠߚЎথễՈINVITEᑨਘǃ݊ᅗᑨਘˈࠄՈINVITEᑨਘǃ݊ᅗᑨਘDŽstruct osip {void *application_context; /**< User defined Pointer */ /* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions; /**< list of ict transactions */ osip_list_t osip_ist_transactions; /**< list of ist transactions */ osip_list_t osip_nict_transactions; /**< list of nict transactions */ osip_list_t osip_nist_transactions; /**< list of nist transactions */……#if defined(HAVE_DICT_DICT_H)dict *osip_ict_hastable; /**< htable of ict transactions */ dict *osip_ist_hastable; /**< htable of ist transactions */ dict *osip_nict_hastable; /**< htable of nict transactions */ dict *osip_nist_hastable; /**< htable of nist transactions */#endif };transactionՈẋ࣏ЁˈབᰃথߎՈ᪻ˈЎᴀഄՈtransactionϾϡₑՈtransaction_idˈ᠔ҹ↨‑transaction_idेৃ˗ᇍincoming Ոmessage,བᰃrequest ˈ߭ऍbranch_idЎᆍᴀẟᜐtransactionՈ↨‑ˈᣝणᩲRFC3261Ո17-2-3Ոᮍẟᜐ˗བincoming Ոmessage ᰃresponseˈ߭ऍbranch_idḍRFC3261Ո17-1-3Ոᢈ߭ẟᜐDŽ.5osip ЁdialogՈdialogՈּ݇Ոˊ᪡ࣙᣀdialogՈ߱࣪ᓎẋ࣏ˈdialogՈ⏄freeẋ࣏ˈҹঞdialogՈDŽdialogЁᄬּ݇ՈϵᙃcseqᙃDŽDialogᵘབϟˈϵcall_id ǃlocal_tag remote_tagϾdialog˖struct osip_dialog {char *call_id; /**< Call-ID*/ char *local_tag; /**< local tag */ char *remote_tag; /**< remote tag */ osip_list_t route_set; /**< route set */ int local_cseq; /**< last local cseq */ int remote_cseq; /**< last remote cseq*/ osip_to_t *remote_uri; /**< remote_uri */ osip_from_t *local_uri; /**< local_uri */osip_contact_t *remote_contact_uri; /**< remote contact_uri */ int secure; /**< use secure transport layer */osip_dialog_type_t type; /**< type of dialog (CALLEE or CALLER) */state_t state; /**< DIALOG_EARLY || DIALOG_CONFIRMED || DIALOG_CLOSED */void *your_instance; /**< for application data reference */ };dialogՈ߱࣪ᯊˈ◄ᰃclientserverᴹdialogᵘЁՈcall_idǃlocal_tag remote_tagՈؐDŽḍᰃclientserverᴹdialog ՈtypeˈาdialogՈDŽᔧخЎclientˈᰃࠄথߎՈrequest Ոresponseᯊˈ᫇Ϭosip_dialog_init_as_uacẟᜐ࣪dialog˗བᰃࠄserverথễẋᴹՈrequestˈ߭Ϭosip_dialog_init_as_uac_with_remote_request ẟᜐdialogՈ߱࣪DŽབᰃserverˈ᫇Ϭosip_dialog_init_as_uasẟᜐ࣪dialogDŽdialogՈᯊˈᔧᰃclientᯊˈ᫇Ϭosip_dialog_match_as_uacẟᜐDŽẔࠄՈresponse dialogЁՈcall_id ˈto_tag from_tagᰃ৺ˈབˈ߭ऍࠄњ᪩dialogDŽЎᆍՈᴀˈdialog ՈtoࠄՈmessage Ոto headertagՈϟˈ↨ṇdialog message Ոfrom_uri, to_uri DŽབˈ߭ৠḋՈdialogDŽᔧᰃserverᯊˈ᫇Ϭosip_dialog_match_as_uasẟᜐDŽ݊ϢclientՈּৠDŽᇍfrom_tag to_tagՈˊˈtransactionՈẋ࣏ЁৠḋϬࠄDŽ ExosipՈ⑤exosipࣙЁࣙˊϬՈ݇call ǃmessage ǃoption ǃreferǃregisterǃsubscription ǃpublish insubscription ՈAPIˈẝѯAPIՈᅲɴexՈcЁDŽЎẝѯষẟᜐࡵՈߑ᭄ˈࣙᣀosip libẟᜐՈᾬՈᅲɴҹjՈ⑤Ёབjcall.cˈ݊Ёjrequest.c jresponse.cɴњrequest response ՈmessageՈỞϬᵘɴDŽৠᯊexosipɴњՈϡৠՈՈsipणᩲẟᜐˈߚЎextl_dtls.c ǃextl_tcp.c ǃextl_tls.c extl_udp.c ˈᅗҹ⊼ՈᮍLibՈᯊࠄlibՈЁDŽЎњՈỞˈϸϾඃϬpipeՈᮍẟᜐɴˈབϬˈẝᾬᯊӮDŽᇍࠄՈmessageẟᜐՈỿˊ᭛udp.cЁˈẝᾬᰃᭈϾणᩲ↨ṇᴖՈDŽ◄sipणᩲՈẴҷɴḚẟᜐˊՈDŽ.1LibՈ߱Ͼsip Ոlib ϾՈˊᵘstruct exosip_t eXosipˈ᪩libϬП࣪ˈ߱࣪ߑ᭄Ўexconf.cՈeXosip_initߑ᭄DŽExosip_tᵘབϟ˖ struct eXosip_tt{struct eXtl_protocol *eXtl;char transport[10];char *user_agent;eXosip_call_t *j_calls; /* my calls */#ifndef MINISIZEeXosip_subscribe_t *j_subscribes; /* my friends */eXosip_notify_t *j_notifies; /* my susbscribers */#endifosip_list_t j_transactions;eXosip_reg_t *j_reg; /* my registrations */#ifndef MINISIZEeXosip_pub_t *j_pub; /* my publications */#endif#ifdef OSIP_MTvoid *j_cond;void *j_mutexlock;#endifosip_t *j_osip;int j_stop_ua;#ifdef OSIP_MTvoid *j_thread;jpipe_t *j_socketctl;jpipe_t *j_socketctl_event;#endifosip_fifo_t *j_events;jauthinfo_t *authinfos;int keep_alive;int learn_port;#ifndef MINISIZEint http_port;char http_proxy[256];char http_outbound_proxy[256];int dontsend_101;#endifint use_rport;char ipv4_for_gateway[256];char ipv6_for_gateway[256];#ifndef MINISIZEchar event_package[256];#endifstruct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];CbSipCallback cbsipCallback;p_access_network_info *p_a_n_i; digest_cave_response *cav_v; };᪩ᵘЁˈ᳔ₑᡅՈϾ៤བϟ˖1)int j_stop_ua;णᩲذՈࠊ᭄ˈ2)ᔧj_stop_ua Ў0ᯊˈ3)libˈ4)Ў0ᯊˈ5)libDŽ6)eXosip_call_t *j_calls; j_callsϬˊܼՈỞˈ7)᠔᳝ՈcallẝϾᵘЁᔶϾᵘDŽCallᵘབϟ˖struct eXosip_call_t {int c_id;eXosip_dialog_t *c_dialogs; osip_transaction_t *c_inc_tr; osip_transaction_t *c_out_tr;int c_retry; /* avoid too many unsuccessfull retry */ void *external_reference;eXosip_call_t *next; eXosip_call_t *parent; };݊ЁՈc_id ЎߚՈcall_id ˈc_dialogs ЎৠϔϾcall ЁՈdialogՈ▊DŽc_inc_tr c_out_tr Ў᪩call ᯊՈ߱࣪Ոtransaction ˈϔϾᇍϾcallϡᰃclient ህᰃserver ˈ᠔ҹc_inc_tr c_out_tr Ͼᰃ᳝transactionՈˈ݊Ё᳝ϾЎNULL DŽ8)eXosip_reg_t *j_reg; j_regˊsip Ո⊼9)ࡵˈ10)᠔᳝register ּ݇Ոtransactionj_regЁᔶϾDŽḍsip णᩲˈ11)ՈϔՈ⊼ࠄẟᜐˈ12)᠔ҹৠ13)Ͼregisterϡ14)callˈৠ15)ᯊ᳝ϾtransactionᄬDŽ16)struct eXtl_protocol *eXtl;ЎՓϬՈՈणᩲˈ17)exosipՈ߱࣪Ё◄าˈ18)ɴњ4ϡৠ19)Ոɴᮍˈ20)ՈᅲɴҹϔϾᵘՈᔶᄬˈ21)exosip_t࣪ᯊ⊼ࠄexosipՈextlЁDŽ22)osip_list_t j_transactions;ϬˊܼՈ┨ᰃẜಲՈtransactionDŽẝѯtransaction ϡ23)call registerᰃcall ǃregisterЁ┨ՈtransactionDŽ24)osip_t *j_osip; Ўosip lib Ոˊᵘˈ25)osip LibՈᵘϔϾӏࡵЁϾবᄬˈ26)ϬˊܼՈsip णᩲЁߎɴՈtransaction DŽḍՈᦣẴˈৠ27)Ͼtransaction ৠ28)ᯊᝯj_osip ˊcall/reg ˊˈ29)᠔ҹᔧϾtransaction ┨ᯊˈ30)Ңj_osip Ёᇚ᪩transactionҢˊᵘЁ┨ˈৠ31)ᯊҢcall reg Ё┨ˈ32)ࠄj_transaction ЁDŽj_osip ࣪ᯊˈ33)࣪њ4ϡৠ34)Ոtransaction Ոˊˈৠ35)ᯊ߱࣪њmessage header Ոᢧᵤߑ᭄Ոܼˈ36)ߑ᭄increase_ref_countЁ߱࣪DŽৠ37)ᯊosip lib Ўњɴₑܹˈ38)ᇍᝯ࣪Ո᭄ẟᜐ᭄DŽ39)ϟ☦ϾᄫϢणᩲՈᩨˈ40)registerᯊቻࠄᩨᙃˈ41)callᯊ◄ᇚᙃ⏏ࠄhttp_anth proxy_anthЁҹẟᜐcallᯊ࿁ẋᩨDŽp_access_network_info *p_a_n_i; digest_cave_response *cav_v; jauthinfo_t *authinfos;struct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];42)OSIP_MTݙᾬՈᰃЎњ໐43)Ոֵোₓǃ⏅ඃՈỞՈpipe DŽ݊Ёpipeẋњˈ44)ିunixЁָϬpipe ˈ45)windowsЁ₋Ϭsocket ᴹpipeDŽ46)MINISIZEݙᾬՈЎᠽᴀˈ47)ᔧpublish ˈ48)notifyࡳ࿁ᯊˈ49)ҹਃϬDŽ࣪Ո⌕བϟˈेܼ߱࣪ˊবexosipՈ៤Ոؐ˖osip libmessage ᪡ǃmessage ᪡ǃtransaction Ոkill ᪡exosip Ёᇍtransaction ǃdialog ǃcall ǃregisterՈˈẝѯ᪡ϵՈexosip ˈ᠔ҹẟᜐẝѯ᪡ᯊӮಲexosip osip ЁՈಲߑ᭄DŽ߱࣪exosipᯊӮẝѯಲߑ᭄ˈeXosip_set_callbacksߑ᭄Ёᅲɴˈẝѯ⊼ߑ᭄Ոᅲɴjcallback.c ЁᅲɴDŽexosip lib Ո⏄Ϭߑ᭄eXosip_quit ˈ݊᪡Ϣexosip_initՈ᪡ּˈ݊าj_stop_uaЎ0ˈՓˊඃˊsip णᩲՈrejister call DŽ᠔᳝Ոݙᄬˈ₎exosipᄬՈ᠔᳝Ոcall ǃregister ϬࠄՈdialog ঞtransactionDŽexosipՈ߱࣪ЁˈᾬϮࡵּ݇Ոᄫexosip Ոᾬẟᜐ࣪DŽབՈ߱࣪ߑ᭄eXosip_listen_addr ˈeXosip_masquerade_contactˈeXosip_set_user_agent ˈeXosip_add_authentication_info Ёᅲɴˈsip_reg.c Ոwinmain ˈ᪩ߑ᭄ᰃregister Ոਃߑ᭄ˈ࣪register ϬࠄՈϾؐˈSip_reg.c ᰃᇍlib ᑨϬՈϔϾDŽ.2LibՈЏexosip lib ࣪៤ࡳПˈབϬˈ߭ᮄՈඃЁϔexosip_execute ˈЏЁᠻeXosip_automatic_action˗བϬˈ߭ऩЁ↣Ͼexosip libՈџˈexosip_execute eXosip_automatic_action DŽЏЁ↣exosip LibࣙϞՈexEventˈ໘ˊexEvent ᯊӮˊcall Ё200ᑨਘՈₑথᴎࠊDŽ .2.12xxᑨਘՈₑথ໘ˊᴎࠊeXosip_retransmit_lost200okЁᇍ2xxՈᑨਘẟᜐₑথࠊˈḍsipणᩲˈЎ2xxՈₑᰃ◄sipणᩲẟᜐࠊՈˈᔧথễ2xxᑨਘˈᢈᯊⒸݙ≵ࠄACKᑨਘˈ߭ₑ2xxᑨਘDŽ݊ₑՈᯊⒸ╘Ў1sˈҹˈࠄ4ᯊ↣╘Ў4sDŽ2xxՈₑথՈذথϣϸ˖ϔЎ2xxᑨਘথễᯊˈথễ9ࠄᇍথễՈACKᑨਘˈ߭ₑথˈcallՈỞɴՈњˈ߭᪩call˗Ўথễ2xxᑨਘПˈࠄњᇍՈACKᑨਘˈ᪩ACKᑨਘẝϾdialogˈ߭া2xxՈথễˈৠᯊ₎dialogЁᄬՈ2xxᙃˈาdialogЁՈ2xxₑ᭄ЎذDŽ .2.2Exosip_executeexosip_executeՈᠻ↨ṇˈЎඃteminateՈϟˈඃexosip_executeˈ᠔ҹexosip_executeݙᾬּ݇Ո᪡ेৃDŽ݊བϟ˖eXosip_executeᯊˈmessageˈ᠔ҹẔᜐඃ࣏ϔָ֕ᰃ৺᳝থễՈmessage ˈᰃˊ࣏ϬᜐথễՈDŽˊՈmessage ᯊৃ࿁Ոcall ǃᮄՈtransactionˈϣՈtransactionՈeventˈẜ᳝exosip ՈeventDŽ݊Ёexosip ՈeventᰃϞඝˊ࣏Ոˈˊ࣏ЁḍՈᅲᜐ໘ˊDŽ݊࿁ՈeventՈᅮ᭛exosip.h Ոtypedef enumeXosip_event_type ЁDŽϔϾmessage ᑊخњˊП(гৃ࿁᳝ᮄՈmessageˊ)ˈexosip_execute ˊosip Ё4ᴵtransaction ⏂ᜬЁՈᅮᯊ఼ˈབᯊ఼ᯊˈ߭Ոᅮᯊ఼ᑊtransactionՈџЁˈ✊ৢᜐ4ᴵtransaction⏂ᜬЁՈ↣ϾtransactionՈџˈ݊ЁࣙᇍmessageՈˊDŽẝՈҷosip lib᳝ߚDŽ໘ˊϞ☦ˈᓔՈcall ǃregistration publicationDŽ݊Ёregistration publicationՈ₎Ոᯊˈᰃ݊ЁՈtransation Ңregistration publicationՈЁߴ┨ˈ✊ৢexosipՈj_transaction ⏂ᜬЁDŽ᪩⏂ᜬЁՈtransactioneXosip_release_terminated_callsЁ₎DŽৠᯊˈབሖՓϬՈᰃUDPˈ߭Ϭ_eXosip_keep_alive ЎregistrationথUDP ՈỞˈUDPᯊ᪩ষDŽ .2.2.1Exosip_read_messageExosip_read_message ϬՈሖणˈ᫇ϬሖՈtl_read_message ҢTCP/IP ሖmessage DŽབҢሖmessage ˈ߭Ѹඝ_eXosip_handle_incoming_message ᜐ໘ˊDŽ_eXosip_handle_incoming_messageЁˈ᪩message ˈབˈᢧˈẔmessage ЁՈᖙᡅcall_id number DŽབˊ࣏exosip Ё⊼њmessageՈˊˈ߭ಲ᪩ߑDŽ✊message ՈିˈẔᑊܲ᪩message ՈѻՈtransaction ՈeventՈିˈЎᰃmessage ˈ᠔ҹିЎRCV_XXX ˈথễmessage ᯊˈѻSND_XXXՈevent DŽЎᰃᮄՈmessage ˈ᳝ৃ࿁ˈϔᰃ࿁ՈtransactionˈेᰃᶤϾ᪻∖ՈᑨਘACK ˗བϡ࿁ˈḍmessage ЁՈᗕˈབᰃ0,ᰃϔϾ∖ˈ໐ϨϾ᪻∖ϡ࿁Ոtransactionˈ᠔ҹᰃϔϾᮄ∖ˈᇍᮄ∖Ո໘ˊeXosip_process_newrequest Ё˗བstatus ϡЎ0ˈ߭ᰃϔϾresponse ˈЎresponse ᰃᇍϔϾrequest Ոಲˈ໐থễrequest ՈᯊএњᮄՈtransactionˈབˊˈ᪩response ᪩ऍϔϾՈtransactionˈɴ≵᳝ˈ᪩response ᰃϔϾ᪳থễՈresponse ˈᇍresponse Ո໘ˊeXosip_process_response_out_of_transaction ЁDŽExosip_read_messageՈ໘ˊ⌕࣏བ˖eXosip_process_newrequesta)message b)ctx_type c)d)ҹЎserver ˈe)message ᮶ϡf)ᰃINVITE ˈg)гϡh)ᰃACK ˈৠi)ᯊϡj)ᰃ݊ᅗREQUEST Ոˈk)ָ߭Ͼmessage DŽl)ᰃACK ˈm)ཱི߭ᰃᇍ200Ոresponse ՈϔϾಲDŽϡn)এՈtransaction DŽo)ᰃCANCEL ˈp)ָ߭eXosip_process_cancel ᜐ໘ˊDŽq)᪩message ᰃ৺ѢϔϾdialog ˈr)Ўdialog transactionՈᴵӊਘˈs)Ͼtransaction ৃҹѢৠt)ϔϾdialogDŽབϔϾdialog ˈu)߭᪩Ոmessage Ոcseq_number dialog ЁՈcseq_number Ոᇣˈv)᳝Ѣdialog ЁՈremote cseq number ˈw)Ոmessage ᰃϔϾ᪳Ոrequest ˈx)߭᪩messageᑊẘಲDŽy)ᰃINVITEᑊϨ᳝ᅮ᪩Ոˈz)߭ܜথễϔϾ100ՈᯊᑨਘDŽaa)ϾmessageϔϾdialogi.ᑊϨϡii.ᰃACKBYEˈiii.߭Ͼdialogᰃ৺Ꮖˈiv.᮶᪩dialogথễBYE∖ˈv.߭sipᷛvi.ޚথễϔϾ481Ո᪳ᦤਘDŽvii.ϡviii.ᰃACK ˈix.ЎᏆՈড়ˈৠx.ᯊϔϾdialog ˈxi.᠔ҹ◄᪩messagedialog Ոremotecseq DŽxii.message ᰃINVITE1.ϾdialogЁ᳔ՈϔϾՈINVITE ᰃ৺Ꮖᗕˈ2.᳝ˈ3.߭sipᷛ4.ޚᇚϾnew INVITEߴ┨ˈ5.ᑊথễϔϾ500Ոᦤ᪳ਘDŽ6.Ͼdialog Ё᳔ՈϔϾথễՈINVITE ᰃ৺Ꮖᗕˈ7.᳝ˈ8.߭sipᷛ9.ޚᇚϾnew INVITEߴ┨ˈ10.ᑊথễϔϾ491Ոᦤ᪳ਘDŽ11.৺߭᪩INVITE ᰃϾড়Ո᪻∖ˈ12.߭dialog Ոroute set ˈ13.Ў᪩INVITE ᑊϡ14.ᰃ߯᪩dialog ՈৰϔϾ᪻∖ˈ15.᠔ҹ᫇ϬeXosip_process_reinviteˊ᪩INVITE∖DŽxiii.message ᰃBYE ∖1.᪩BYE ∖Ոˈ2.ᰃ৺ࣙto tag ˈ3.ЎথՈresponse ᳝to tag ˈ4.᠔ҹᇍথễՈBYE᪩ᰃϔϾࣙto tag Ոড়ՈmessageDŽ5.dialog Ёᰃ৺ᏆBYE ˈ6.BYEˈ7.ᇍᮍথњBYE ∖ˈ8.ָಲ9.500᪳ᦤਘ10.৺߭ϬeXosip_process_bye ˊBYE ∖DŽxiv.ᰃACK ˈxv.ָϬeXosip_process_ack ˊ᪩ACK ∖xvi.ᰃ݊ᅗ∖ˈxvii.߭ϬeXosip_process_message_within_dialogˊ᪩∖DŽbb)৺߭ˈcc)᳝ϔϾdialog ˈdd)ᰃܼՈϔϾ᪻∖i.ᰃACK ˈii.᪩200ՈACK ᳝dialog ˈiii.᠔ҹᰃϔϾ᪳ՈACK ˈiv.ָmessage ेৃˈv.ЎᰃACK ˈvi.᠔ҹᑊ᳝ᓎএtransaction ˈvii.ϡviii.ᇍtransaction ᜐ᪡DŽix.ᰃINFO ˈx.ָಲxi.481ਘDŽxii.ᰃINVITE ˈxiii.ϬeXosip_process_new_inviteˊẝϾᮄ∖ˈxiv.᪩∖ড়ˈxv.߭ϔϾᮄՈcall ˈxvi.ᑊϨcallϞϣϔϾdialog ˈxvii.᪩dialog ᰃ᳡xviii.Ոdialog ˈxix.ЎᰃUAS DŽxx.ᰃBYE ∖ˈxxi.߭ACK ϔḋˈxxii.᪩BYE ∖≵᳝dialog ˈxxiii.ಲxxiv.ϔϾ481Ո᪳ᦤਘỞᇍ◄Ոdialog ϡxxv.DŽxxvi.ᰃ݊ᅗ∖ˈxxvii.߭Ўᰃϡxxviii.sip ᷛxxix.ޚՈ᪻∖ᮍˈxxx.᠔ҹՈtransactionߴ┨ՈⓣЁेৃDŽ.2.2.2eXosip_process_response_out_of_transaction˖a)Ўmessage Ўᑨਘˈ໐b)Ϩ᳝transaction ˈc)᠔ҹᰃϔϾ᪳ՈᑨਘDŽmessage Ոড়ˈd)ϡe)ˈf)ָᑊẘಲg)᠔ҹՈcall Ոdialog ˈh)᪩responseᰃ৺dialogᰃẜ᳝ᓎএdialog Ոcalli)᳝ϔϾcall ˈj)᪩response Ϣcallˈk)ָDŽl)#ifndef MINISIZE ˈm)ϨऍϔϾdialog ˈn)o)њ200ਘˈp)ৃ࿁ᰃᇍᮍ᳝থễՈACKˈq)ᰃՈtransaction 200ਘᯊᏆkillњˈr)᠔ҹ≵᳝transaction ˈs)ᰃњdialogDŽབ200ਘՈcseqথễՈcseq Ոnumber ˈt)߭থễACKਘDŽ໘ˊϞẴˈu)᪩messageᑊẘಲDŽv)ᰃњcall ˈw)dialog ᳝ᓎএˈx)ᰃඝ200ਘᰃϔϾ᪳Ոᑨਘˈy)৺߭call Ոc_out_tr transactionDŽ߭Ў᪩200ਘᯊᓎএϔϾdialogᑊথễACKಲˈz)✊ৢথễϔϾBYE∖᪩call ˈaa)Ў᪩callথễ᪳њDŽ.2.3eXosip_automatic_action ˊ⌕࣏᪩ߑϬѢˊાՈcall ǃregisterǃnotify ǃpublishˈಲЎ401407◄থՈˈẟᜐₑDŽa)᠔᳝Ոcall:i.c_id < 1߭ϡii.Ϭ໘ˊˈiii.call ՈidѢ1Ոᰃᝯߴ┨Ոᰃ᳝ᝯˊߎj_calls⏂ᜬՈcallDŽiv.᪩call Ոdialog᳝ᓎএ᰻ˈv.ᰃথễϔϾINVITE∖ᓎএՈᮄcall ˈvi.ᰃᇍথễՈৰϔϾINVITE ˈvii.߭ᴀಲϔϾresponse ˈviii.ಲresponseՈᯊˈix.dialogህᝯএњDŽ1.এ᪩callՈৰϔϾINVITE ∖ᓎএ᰻ՈtransactionՈᗕˈ2.ˈ3.ᑊϨ᪩call᳝ࠄᯊᯊⒸ120ˈ4.ϨՈಲ 5.ՈᗕЎ401407ˈ6.߭থễ∖ˈ7.ᑊϨҢಲ8.ЁᦤপDŽₑথ᭄Ў3ˈ9.3ˈ10.ָ߭ࠄ᪩callᯊDŽৠ11.Ϟˈ12.ಲ13.ਘՈstatus Ў[300, 399]ˈ14.߭থễ∖ˈ15.ᑊϨḰথễՈˈ16.17.থễ᭄гЎ3DŽẝϬ_eXosip_call_retry_request ᜐ໘ˊDŽx.call Ё᠔᳝Ոdialog ˈxi.ᇍѢdialogՈdialog ᜐ໘ˊˈxii.ˊᮍৠxiii.Ϟˈxiv.гᰃẔˈxv.ϔЎᑨਘstatus Ў401407Ոᩨ᪳ᦤˈxvi.ϔЎ[300, 399]serverՈথᦤDŽb)᠔᳝Ոregister ˈc)ˊr_id >=1 Ϩ᳝transaction Ոregister ˈd)r_id < 1᳝last transaction Ոregister ᰃᏆߴ┨Ոregister ˈe)ϡf)ˊDŽi.থᯊⒸϡii.Ў0ˈiii.᮶᪩registerϔָₑথễˈiv.ϨᯊⒸᯊˈv.᪩registerҢ⊼Ꮖ900ˈvi.߭ϬeXosip_register_send_registerᜐₑDŽvii.ᯊⒸЎѢՈₑᯊⒸ-60ˈviii.гথˈix.᮶њₑᯊⒸˈx.ᖙ◄ₑᯊՈ60ህᓔথDŽxi.ˈ໐xii.ϨࡿϞ⊼ᯊⒸ120ˈxiii.ᑊϨ᳝xiv.Ոᑨਘਘϡxv.ᰃ៤Ոᑨਘˈxvi.߭гথDŽxvii.ˈxviii.ेৰϔ⊼ˈxix.ϨᰃЎᩨ໐xx.Ո⊼ˈxxi.߭DŽབᰃWPDIF ˈxxii.߭ಲxxiii.ЁՈᩨnonceᰃ৺ϞϔᯊՈnonce ּؐৠˈxxiv.ৠxxv.߭থ˗ϡxxvi.ᰃWPDIF ˈxxvii.ָ߭থDŽЎњWPDIFՈ៤ˈxxviii.ৰϔ⊼ᯊˈxxix.ᦤ᳡xxx.Ոಲxxxi.ЁՈnonceؐˈxxxii.ҹᰃ৺থՈᯊᴵӊЎDŽg)Notify ǃsubscription ǃpubՈ໘ˊৠh)callDŽ.3Callexosip libЁ┨њϔָẔᜐՈ໘ˊᇍথễՈmessageՈඃ࣏ˈẜᦤկњЎথễথễrequest ǃACK DŽЎ᠔᳝Ոmessage ѢϾtransaction ˈ໐ϨᇍmessageՈ໘ˊ᳔transaction Ոevent Ёẟᜐ໘ˊˈ᠔ҹ᠔᳝ᦤկՈࣙcall ǃnotify ǃpublish ǃregister ǃsubscription ǃrefer ࡳᰃỞϔϾtransaction ϞՈeventϢϔָẔᜐՈ໘ˊඃ࣏ᜐˈevent ˈ໘ˊඃ࣏Ḳ᠔᳝transaction ᯊӮˊࠄeventˈϾevent এे໘ˊՈᯊˈ߭ৃҹeventՈ໘ˊඃ࣏ˈ໐ϡ◄ࠄ᪩ˊඃ࣏ˊࠄ᪩transaction DŽExosip lib ᦤկњcall Ո4˖ৰϔᓎএϔϾcall Ոinitial invite থễ˗dialog Ё߯থễՈ݊ᅗrequest ˗dialog Ё߯থễᇍҢᇍথễՈrequest Ոresponse ˗invite ∖Ёಲᇍresponse ՈACK Ո߯থễDŽ .3.1CallՈৰϔϾINVITEexcall_api.cЁՈeXosip_call_build_initial_invite eXosip_call_send_initial_invite ᦤњথϔϾᮄՈcallᯊՈDŽeXosip_call_build_initial_inviteՈ⌕࣏བ˖。
OSI七层框架体系结构和TCP IP五层结构
OSI七层框架体系结构和TCP/IP五层结构OSI七层框架体系结构该体系结构标准定义了网络互连的七层框架,既ISO开放系统互连参考模型。
在这一框架中进一步详细规定了每一层的功能,以实现开放系统环境中的互连性,互操作性与应用的可移植性。
OSI 标准制定过程中采用的方法是将整个庞大而复杂的问题划分为若干个容易处理的小问题,这就是分层的体系结构办法。
在OSI中,采用了三级抽象,既体系结构,服务定义,协议规格说明。
OSI七层:1 物理层:主要是利用物理传输介质为数据链路层提供物理连接,以便透明的传递比特流。
2 数据链路层。
在通信实体之间建立数据链路连接,传送以帧为单位的数据,采用差错控制,流量控制方法。
3网络层:通过路由算法,为分组通过通信子网选择最适当的路径。
4 传输层:是向用户提供可靠的端到端服务,透明的传送报文。
5 会话层:组织两个会话进程之间的通信,并管理数据的交换。
6表示层:处理在两个通信系统中交换信息的表示方式。
7应用层:应用层是OSI参考模型中的最高层。
确定进程之间通信的性质,以满足用户的需要。
五层协议的体系结构(1)应用层应用层确定进程之间通信的性质以满足用户的需要。
应用层不仅要提供应用进程所需要的信息交换和远地操作,而且还要作为互相作用的应用进程的用户代理(user agent),来完成一些为进行语义上有意义的信息交换所必须的功能。
(2)运输层任务是负责主机中两个进程间的通信。
因特网的运输层可使用两种不同的协议。
即面向连接的传输控制协议TCP和无连接的用户数据报协议UDP。
面向连接的服务能够提供可靠的交付。
无连接服务则不能提供可靠的交付。
只是best-effort delivery.(3)网络层网络层负责为分组选择合适的路由,使源主机运输层所传下来的分组能够交付到目的主机。
(4)数据链路层数据链路层的任务是将在网络层交下来的数据报组装成帧(frame),在两个相邻结点间的链路上实现帧的无差错传输。
JAIN SIP 聊天室及oSIP 解读
Jain Sip聊天室流程设计
SIP呼叫建立和拆除的流程 1) UAC向UAS发INV ITE请求; 2) UAS收到INR ITE请求后向UAC发 100 /TRYING响应; 3) UAS向UAC发200 /OK响应; 4) UAC 收到200 /OK 响应后, 发送 ACK 请求 给UAS; 5) UAC和UAS互发REFER消息,双方 进行通话; 6) UAC向UAS发BYE请求,请求通话结 束; 7) UAS收到BYE请求后向UAC发200 /OK响应, 通话结束..
OSIP 解读
协议栈框架 框架并不是指代码的某一部分,而是指它的构成形式。主要有三部分:底 层套接字接收/发送,模块间通信管道,上层调用api接口。 1.Osip2并不实现底层套接字的接收/发送,由eXosip实现,现在只支持 UDP的链路连接 2.模块间的通信管道包括:transaction的消息管道、jevent的消息管道。 Transaction的消息管道是驱动其状态机的部件,通过不断的接收来自底层 套接字的远端信令,或者来自上层调用的指令,根据上述的状态机制来驱 动这个transaction的运转。 3.上层调用的api接口大致有两类:sip协议的调用接口和sdp协议的调用接 口。EXosip封装了大部分的sip协议调用接口,一般来说都不需要直接调用 osip2的接口函数。接口函数很多,在这里就不详述了,函数定义请参照源 代码部分的注释。
OSIP 解读
sip协议的过程分析 transaction这一层来实现sip的解析。 Transaction是指一个发送方和接收方的交互过程,由请求和应答组成。请 求分为Invite类型和Non-Invite类型。应答分为响应型的应答和确认型的应 答。响应型的应答是指这个应答仅代表对方收到请求。请求经过处理后都 必须返回确认型的应答。 响应型的应答有1xx,确认型的应答包括2xx、3xx、4xx、5xx和6xx。一个 transaction由一个请求和一个或多个响应型应答、一个确认型应答组成。 Transaction根据请求的不同和发送/接收的不同可以分为四类:ict、nict、 ist和nist。 ict是指Invite client transaction,就是会话邀请的发起方。 nict是指Non-Invite client transaction,是指非邀请会话的发起方。 ist是指Invite server tranaction,是指会话邀请的接收方。 nist是指Non-Invite server transaction,是指非邀请会话的接收方
网络通信中的开放式系统互联(OSI)模型解析(四)
网络通信中的开放式系统互联(OSI)模型解析在当今数字化时代,网络通信已成为人类生活中不可或缺的一部分。
然而,为了确保不同系统之间的相互连接和顺畅的通信,需要一种标准化的模型来指导网络通信的实现和交互。
开放式系统互联(Open Systems Interconnection,简称OSI)模型便是这样一种模型。
本文将对OSI模型的结构和功能进行深入解析。
一、OSI模型的基本结构OSI模型是一种网络通信的框架,由七层组成,每一层都承担着特定的任务和功能。
这七层分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层,它们按照不同的目标分工合作,从而实现了网络通信的顺利进行。
1. 物理层物理层是网络通信的基础,它负责将数字信号转换为可传输的物理信号,并控制数据的传输速率和传输介质的选择。
在物理层中,数据以比特(bit)的形式进行传输,例如通过电缆、光纤或者无线信号。
2. 数据链路层数据链路层负责将比特流转化为帧,这种帧是数据传输的基本单位。
同时,数据链路层还负责进行物理地址(MAC地址)的寻址和错误检测,以确保数据传输的可靠性。
3. 网络层网络层主要处理数据的路由选择和转发,它使用IP地址对数据进行定位和寻址,为数据在不同的网络节点之间寻找最佳路径,并实现数据的分组传送。
4. 运输层运输层主要负责数据的可靠传输,它将数据分割为合适的块,并通过端口号将这些块与特定应用程序进行关联。
同时,运输层还负责流量控制和拥塞控制,以确保数据的高效传输。
5. 会话层会话层负责建立、管理和维护应用程序之间的对话或会话。
它提供了建立连接、保存和恢复会话状态以及进行安全认证和权限管理的功能。
6. 表示层表示层主要负责数据的格式转换、加密和解密,以及数据的压缩和解压缩。
它确保不同系统之间的数据可以正确地解释和理解。
7. 应用层应用层是用户直接使用的层次,包括各种网络应用程序,如电子邮件、文件传输和网络浏览器。
应用层是用户与网络通信的接口,向用户提供了数据交换、查询和处理的能力。
IP网络基础-OSI与TCPIP
TCP/IP简介
2、TCP/IP与Internet溯源 起源于美国军方国防部高级研究计划局(ARPA)主持研制的 ARPAnet,阿帕网于1969年正式启用,当时仅连接了4台计算机, 供科学家们进行计算机联网实验用,这就是因特网的前身。 70年代,ARPAnet已经有了好几十个计算机网络,但是每个网 络只能在网络内部的计算机之间互联通信,不同计算机网络之 间仍然不能互通。为此, ARPA又设立了新的研究项目,就是 想用一种新的方法将不同的计算机局域网互联,形成‚互联 网‛。研究人员称之为‚internetwork”,简称‚Internet”。 这个名词就一直沿用到现在。 1974年,出现了连接分组网络 的协议,其中就包括了TCP/IP——著名的网际互联协议IP和传 输控制协议TCP。这两个协议相互配合,其中,IP是基本的通 信协议,TCP是帮助IP实现可靠传输的协议。 1982年ARPA接受 了TCP/IP,选定Internet为主要的计算机通信系统,并把其它 的军用计算机网络都转换到TCP/IP。1983年,ARPAnet分成两 部分,一部分仍称ARPAnet,供民用,逐渐形成了国际互联网。
数据链路层 802.2
物理层
802.3
EIA/TIA-232 v.35
以太网帧格式
OSI参考模型
网络层(Network Layer ) 网络层负责对子网间的数据包进行路由选择。网络 层还可以实现拥塞控制、网际互连等功能。 在这一层,数据的单位称为数据包(packet)。 网络层协议的代表包括:IP、IPX等。 传输层(Transport Layer) 传输层是第一个端到端,即主机到主机的层次。传 输层负责将上层数据分段并提供端到端的、可靠的或 不可靠的传输。此外,传输层还要处理端到端的差错 控制和流量控制问题。 在这一层,数据的单位称为数据段(segment)。 传输层协议的代表包括:TCP、UDP、SPX等。
OSI参考模型讲解
OSI参考模型的分层禁止了不同主机间的对等层之
间的直接通信。因此主机A的每一层必须依靠主机A相邻层
提供的服务来与主机B的对应层通信。
假设主机A的第四层必须与主机B的第四层通信,那
么主机A的第四层就必须使用主机A的第三层所提供的服务
。第三层通过一个服务接入点(SAP)给第四层提供服务
,这些服务接入点使得第四层能要求第三层提供服务
物理层
链路层协议3 物理层协议3
数据链 路层
物理层
物理介质 路由器 通信子网 路由器
物理介质
• 逻辑通信:位于不同主机和网络设备中同层通信实体间的对话,对话遵 • 循某一特定协议,且每层协议各不相同; • 传输层及以上层不同主机通信实体间的逻辑通信是直接点对点的通信, • 下3层中主机与路由器和路由器与路由器之间的通信也是直接通信,且同 • 层通信协议不尽相同。
同步:即事件实现顺序的详细说明。
分层模型的优点
解决通信的异质性(heterogeneity)问题: 语言层解决不同种语言的相互翻译问题(汉-日) 媒介层解决信息传递: 语音(电话)/文字(传真)
分层模型的优点
高层屏蔽低层细节问题 概念层只关心会话内容, 不关心语种和会话方式 语言层只关心语种, 不关心会话内容和方式 媒介层只关心信息的传递, 不关心信息的内容
计算机网络体系结构
网络的体系结构
计算机网络的各层以及其协议的结合,称为
网络的体系结构。换言之,计算机网络的体系结构即
是对计算机网络及其部件所应该完成的功能的精确定
义。即计算机网络应设置哪几层,每层应提供哪些功
能的精确定义,至于功能如何实现,则不属于网络体
系结构讨论的范围。换句话说,网络体系结构只是从
OSI七层体系架构,TCPIP协议,HTTP协议
OSI七层体系架构,TCPIP协议,HTTP协议⼿机推送了⼀篇⽂章简单介绍HTTP协议,然后想把其计算机⽹络分层构建再温习⼀下,上⽹看了⼏篇博客⽂章,竟然有许多错误,真是误⼈,这⾥再理⼀下。
HTTP之前,先了解⼀些计算机⽹络通信的基础。
OSI模型 - 七层体系架构开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),⼀种,由提出,⼀个试图使各种计算机在世界范围内互连为⽹络的标准框架。
定义于ISO/IEC 7498-1。
层次划分根据建议X.200,OSI将计算机⽹络体系结构划分为以下七层,标有1~7,第1层在底部。
现“OSI/RM”是“Open Systems Interconnection Reference Model”的缩写。
第7层应⽤层主条⽬:应⽤层(Application Layer)提供为应⽤软件⽽设的接⼝,以设置与另⼀应⽤软件之间的通信。
例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。
第6层表达层主条⽬:表达层表达层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式。
第5层会话层主条⽬:会话层(Session Layer)负责在数据传输中设置和维护计算机⽹络中两台计算机之间的通信连接。
第4层传输层主条⽬:传输层(Transport Layer)把传输表头(TH)加⾄数据以形成数据包。
传输表头包含了所使⽤的协议等发送信息。
例如:传输控制协议(TCP)等。
第3层⽹络层主条⽬:⽹络层(Network Layer)决定数据的路径选择和转寄,将⽹络表头(NH)加⾄数据包,以形成分组。
⽹络表头包含了⽹络数据。
例如:互联⽹协议(IP)等。
第2层数据链路层主条⽬:数据链路层(Data Link Layer)负责⽹络寻址、错误侦测和改错。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Osip协议源代码框架详解Prepared by Mao minghua Date 2009.09.25 Reviewed by DateApproved by DateRevision HistoryVersion Author Reviewed By Comments Issued Date 0.1Mao minghua 描述osip协议栈的源代码框架目录1符号及缩写 (4)2整体描述 (4)3OSIP包的源代码框架解析 (5)3.1 OSIP的TRANSACTION的EVENT的产生 (5)3.1.1 定时器事件的产生过程 (6)3.1.2 报文触发的事件 (7)3.2 OSIP 的TRANSACTION的EVENT处理流程 (7)3.2.1 ICT的处理流程 (8)3.2.2 IST的处理流程 (9)3.2.3 NICT的处理流程 (9)3.2.4 NIST的处理流程 (9)3.3 O SIP报文的解析 (10)3.3.1 sip协议报文的解析整理流程 (10)3.3.2 Osip报文头的解析 (12)3.3.3 uri的解析 (14)3.3.4 添加一个新的协议header字段 (15)3.4 OSIP的TRANSACTION的管理 (16)3.5 OSIP中DIALOG的管理 (18)4EXOSIP包的源代码框架解析 (19)4.1 L IB库的初始化和销毁 (20)4.2 L IB库的主处理线程 (23)4.2.1 2xx应答的重发处理机制 (24)4.2.2 Exosip_execute执行流程 (24)4.2.2.1 Exosip_read_message的处理 (26)4.2.2.2 eXosip_process_response_out_of_transaction的处理流程: (29)4.2.3 eXosip_automatic_action处理流程 (29)4.3 C ALL的处理 (30)4.3.1 创建Call的第一个INVITE (30)4.3.2 INVITE的ACK应答的创建和发送 (32)4.3.3 dialog内的请求的创建和发送 (33)4.3.4 Dialog内answer的创建和发送 (34)4.4 R EGISTER的处理 (35)4.4.1 向一个服务器第一次注册 (35)4.4.2 调整一个注册的注册超时时间 (35)4.4.3 发送一个register注册 (36)Osip源代码框架详解1符号及缩写缩写英文全称中文名称ICT Invite Client Transaction Invite类型的客户端事务IST Invite Server Transaction Invite类型的服务端事务NICT Not Invite Client Transaction 非Invite类型的客户端事务NIST Not Invite Server Transaction 非Invite类型的服务端事务IMS IP Multimedia Subsystem IP多媒体子系统PSVT Packet service video telephony 分组域可视电话SIP Session Initiation Protocol 会话初始协议UDP User Datagram Protocol 用户数据报协议URL Uniform Resource Locator 统一资源定位器2整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。
因为在Lib库内部没有使用到像定时器、发送队列等的任务,而同时需要使用到定时器,所以在lib库的内部采用轮训遍历的方式不停的检查是否有定时器超时,这在某种程度上会浪费CPU的允许时间。
同时整个lib库实现了对call, notify等的管理,为了实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的使用,在下面的分析中不涉及到信号量和锁机制。
Lib库按照sip协议栈的层次关系分为两个lib包,底层的osip lib包实现对单个请求、应答、ACK的处理,包括message的解析、拼装、内容set和get,单个请求形成的transaction相关操作以及通信两端形成的一个dialog的操作。
Lib库上层的exosip lib在底层osip lib库的实现基础上,实现对sip协议整理逻辑上的管理。
Exosip主要关注的是sip协议的业务流程,包括call的整体管理,notify的整体管理,publish的管理,register的管理,option的管理,refer的管理和subscription的管理,其中最主要的为call和register的管理,这两个为sip协议栈必须实现的部分,另几个功能为sip协议栈扩展部分。
从这几个业务的管理流程出发,在业务的底层它们会使用到相似的一些功能,如注册的认证,发送message,接收message,每个请求和应答形成的transaction,多个transaction组合而成的dialog。
在message的处理方面,可以分为两类,一类为发送的message,因为是主动发送,所以上层管理层知道是什么类型的message,lib库直接提供各类接口供使用。
一类为接收到的message,因为不知道是哪种类型,所以需要根据解析出来的message的信息来进行处理,这部分的处理在udp.c文件中。
整个lib库的初始化在exOsip中介绍。
3Osip包的源代码框架解析在osip源代码包中最主要的包括了message的相关操作,其中最重要的为message的解析,即从获取到的一个message中解析生成一个能够被代码直接处理的message数据结构-——osip_message_t。
与message结构相关的操作包括根据message数据结构的信息安装sip 协议规范组装成一个message字符串;message结构的初始化和释放;message结构的拷贝操作;以及从message结构中获取各种已经解析的成员变量的值和设置各个成员变量的值。
在message的解析部分,除了message的头之外,还包括了body的解析,涉及到sdp协议,包括对每个sdp字段的解析。
在osip源代码包中,设计了一个与同一个请求相关的所有message的集合——transaction,在发送或接收到一个新的请求的时候就会生成一个transaction,其中ACK和CANCEL请求是比较特殊的,对于非2xx应答的ACK和初始INVITE请求是属于同一个transaction的,而对于2xx的请求是属于单独的transaction的,所以其重传操作由UAC来控制,而不在INVITE的transaction内部进行控制。
CANCEL的请求除了本身建立一个transaction外,根据协议它还会去匹配要CANCEL掉的请求的transaction,如果匹配成功会CANCEL掉相应的transaction。
在osip包中同样设计了dialog相关操作,包括dialog的建立,dialog信息的保存,dialog 的匹配及删除等操作。
其它方面,包括多线程中使用到的锁和信号量及信号,内部使用到的链表,用于事件的队列(需要先进先出策略),一些平台无关的封装,定时器以及常量等的定义。
这部分比较简单,而且都是最底层函数,直接封装了系统调用层。
3.1 osip的transaction的event的产生transaction的状态变化是由事件来驱动的,当transaction上有事件产生时,根据事件的类型和当前transaction的状态来处理该event。
Transaction上的事件分为两类:一为定时器事件,在设定的定时器超时时会产生相应的定时器事件;另一类为事件驱动事件,如发送一个请求、应答或接收到一个请求、应答,发送一个ACK和接收到一个ACK,即是由报文产生的事件。
3.1.1 定时器事件的产生过程__osip_ict_need_timer_b_eventyesosip_timers_ict_execute (osip_t * osip)__osip_ict_need_timer_b_event__osip_ict_need_timer_a_eventHave timer b?noyesHave timer a?noyesHave timer b?no 退出添加event 到transaction 的transactionff 队列ICT 、IST 、NICT 和NIST 的定时器的事件产生流程都一样,对于每一个transaction ,其定时器是有顺序的,ICT 流程中TIMEOUT_B 的优先级最高,TIMEOUT_B 定时器触发后,会触发kill transaction 的操作。
当transactionff 队列中有未处理的事件时,不处理定时器,直接返回,所以在transactionff 队列中总的事件的数量是不多的。
所有的定时器函数调用底层同一个定时器检查函数__osip_transaction_need_timer_x_event 。
该函数会先检查该定时器是否启动,判断条件为(timer->tv_sec == -1),如果启动,检查当前时间是否超过定时器中设定的时间,如果是,则产生新的定时器事件。
因为定时器没有一个单独的任务,所以是采样轮训的方式检查是否有新的定时器事件产生,而不是根据系统时钟中断进行检测,因此会比较占用系统资源。
定时器的启动和修改使用接口osip_gettimeofday 和add_gettimeofday 。
只需要设定定时器的超时时间,即设定了一个新的定时器。
取消一个定时器,只需要修改定时器的timer->tv_sev 为-1。
3.1.2报文触发的事件_eXosip_transaction_initosip_new_outgoing_sipmessage (invite)osip_transaction_add_event(transaction, sipevent)包括一个新的invite、response、ack的发送或接收,除了对非2xx的应答ack外,其他的请求和应答都会产生一个新的transaction,并且产生一个新的sipevent事件。
3.2 osip 的transaction的event处理流程在sip协议栈中为了更快更好的处理transaction,根据协议栈的描述,划分为四种不同的transaction,分别为ICT、IST、NICT和NIST。