osip源代码框架详解
- 格式:doc
- 大小:1.03 MB
- 文档页数:36
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参考模型在整个参考模型中,下层是为上层提供服务。
二、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模型的组成概述及解释说明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模型的最底层,主要负责将数据转换为传输所需的电信号,并通过物理媒介进行传输。
它关注的是数据的传输单位是比特(bit),包括传输介质、电缆规范、编码方式等。
物理层主要作用是确保数据的可靠传输,例如通过传输介质的选择和电平控制来实现数据的传输。
第二层 - 数据链路层数据链路层负责在直连的节点之间提供可靠的数据传输。
它将原始数据分割成数据帧,并通过物理层提供的物理媒介进行传输。
数据链路层有两个子层,即逻辑链路控制(LLC)子层和介质访问控制(MAC)子层。
LLC子层主要处理数据帧的逻辑连接控制,而MAC 子层则处理数据的访问控制和媒介争用的问题。
第三层 - 网络层网络层是OSI模型的第三层,主要负责数据包的路由和转发。
它将数据分割成较小的数据包,并通过路由器进行传输。
网络层的主要功能是将数据从源节点发送到目标节点,通过确定最佳路径和设置优先级来实现数据的高效传输。
此外,网络层还处理数据包的片段、拥塞控制等问题。
第四层 - 传输层传输层负责提供端到端的数据传输服务。
它通过端口号来标识不同的应用程序,并通过传输协议(如TCP和UDP)来实现数据的可靠传输。
传输层提供了数据的分段、重组、流量控制和错误恢复等功能,确保数据的完整性和可靠性。
第五层 - 会话层会话层负责在不同计算机之间建立、管理和终止会话。
它通过提供会话控制机制和同步功能来实现进程之间的通信。
会话层允许应用程序在不同计算机之间建立连接,并提供同步点以确保数据的顺序和完整性。
第六层 - 表示层表示层负责对数据进行编码和解码,以确保不同系统之间的数据交换的兼容性。
它处理数据的格式转换、数据加密和解密、数据压缩和解压缩等任务。
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参考模型是一个非常重要的概念。
它是一个框架,用于描述和理解计算机网络通信的各个方面。
本文将会分别介绍OSI参考模型的3个主要概念,帮助读者更好地理解和应用这个概念。
1. 层次结构OSI参考模型的第一个主要概念是层次结构。
OSI参考模型将计算机网络通信划分为7个层次,每个层次负责不同的功能。
这些层次按照功能从低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
每个层次都有特定的功能和责任,但是它们之间又相互关联,协同工作。
通过层次结构,OSI参考模型将复杂的网络通信问题分解为相对简单的部分,使得网络设计、实现和调试更加科学和有效。
2. 分层协议OSI参考模型的第二个主要概念是分层协议。
为了实现层次结构,每个层次都需要使用相应的协议来完成特定的功能。
OSI参考模型中定义了各个层次的协议标准,这些标准通常被称为协议栈。
每个协议栈都包含多个协议,这些协议协同工作,完成特定层次的功能。
当一个计算机发送数据时,这些数据会经过每个层次的协议,分别添加相应的信息和处理方式。
而接收端的计算机则按照相反的顺序,逐层处理数据,最终将数据转化为应用层的信息,供应用程序使用。
3. 模块化设计OSI参考模型的第三个主要概念是模块化设计。
由于OSI参考模型采用了层次结构和分层协议,它使得计算机网络设计成为可能。
这种模块化的设计使得网络技术可以分为不同的领域,并且每个领域可以专门研究和发展。
物理层可以研究网络传输介质和信号编码方式,数据链路层可以研究MAC位置区域和帧格式,网络层可以研究IP位置区域和路由协议。
在实际的网络实现中,每个层次的技术和设备也变得更加专业和高效。
这种模块化的设计也为网络通信的标准化和互操作性提供了基础,推动了网络技术的发展和应用。
OSI参考模型的3个主要概念是层次结构、分层协议和模块化设计。
这些概念为计算机网络通信提供了理论基础,使得网络技术得以规范和发展。
一直没空仔细研究下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णᩲ⑤ҷۅḚᶊ᪪ᢧ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Ո⌕࣏བ˖。
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。