Resiprocate协议栈分析
基于SIP的B2BUA服务器设计

基于SIP的B2BUA服务器设计作者:庄伟胤唐余亮来源:《中国新通信》2014年第07期【摘要】 Session Initiation Protocol(SIP)是下一代网络的核心控制协议,用于在IP数据网络上建立、改变和结束多媒体会话。
SIP服务器作为下一代网络的核心设备,它的实现就显得尤为重要。
一种方法是代理服务器Proxy,它只在SIP交互时保存状态,而不是在整个呼叫中维护状态,这限制了代理服务器更大范围的应用。
另一种方法是背对背的用户代理(B2BUA,Back-to-Back User Agent)服务器,它在整个呼叫过程中都维护状态。
文章从SIP 协议的基本原理出发,利用reSIProcate协议栈实现SIP B2BUA服务器并对其做了压力测试。
【关键词】 RFC 3261 SIP B2BUA一、SIP协议SIP是2001年推出的IETF标准(RFC 3261),用于在IP数据网络上建立、改变和结束多媒体会话。
SIP系统采用C/S模型,定义了服务器和用户代理。
SIP系统的端系统称为用户代理(User Agent,UA),包含用户代理客户端(User Agent Client,UAC)和用户代理服务器(User Agent Server,UAS)。
UAC负责呼叫的发出,而UAS负责呼叫的接收。
典型的基于Proxy的呼叫过程为:主叫方向被叫方发出INVITE请求消息,开始建立会话。
Proxy接收到这条消息时会回复一条100 Trying告诉主叫方消息正在处理,然后INVITE 消息经过Proxy路由转发到被叫方,被叫方回复100 Trying 和180 Ringing响铃,被叫方接听回复200 OK,主叫方回复ACK,会话建立。
要结束会话时,其中一方发送BYE消息,另外一方回复200 OK。
二、B2BUA服务器介绍按照RFC 3261中的定义,B2BUA是一个逻辑实体,它就像UAS一样接收和处理请求。
linux tcpip协议栈分析

sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。
它在<include/linux/skbuff.h>中定义,并包含很多成员变量供网络代码中的各子系统使用。
这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的成员变量以使得成员变量的布局更加清晰。
它的成员变量可以大致分为以下几类:∙Layout 布局∙General 通用∙Feature-specific功能相关∙Management functions管理函数这个结构被不同的网络层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。
L4向L3传递前会添加一个L4的头部,同样,L3向L2传递前,会添加一个L3的头部。
添加头部比在不同层之间拷贝数据的效率更高。
由于在缓冲区的头部添加数据意味着要修改指向缓冲区的指针,这是个复杂的操作,所以内核提供了一个函数skb_reserve (在后面的章节中描述)来完成这个功能。
协议栈中的每一层在往下一层传递缓冲区前,第一件事就是调用skb_reserve在缓冲区的头部给协议头预留一定的空间。
skb_reserve同样被设备驱动使用来对齐接收到包的包头。
如果缓冲区向上层协议传递,旧的协议层的头部信息就没什么用了。
例如,L2的头部只有在网络驱动处理L2的协议时有用,L3是不会关心它的信息的。
但是,内核并没有把L2的头部从缓冲区中删除,而是把有效荷载的指针指向L3的头部,这样做,可以节省CPU时间。
1. 网络参数和内核数据结构就像你在浏览TCP/IP规范或者配置内核时所看到的一样,网络代码提供了很多有用的功能,但是这些功能并不是必须的,比如说,防火墙,多播,还有其他一些功能。
大部分的功能都需要在内核数据结构中添加自己的成员变量。
因此,sk_buff里面包含了很多像#ifdef这样的预编译指令。
【6A版】Resiprocate及SDP协议详细分析

Resiprocate介绍1.前言本文主要内容来自互联网,特此感谢Steven的辛苦撰写和resiprocate开源组织的无私奉献以及sip协议的创造者Schulzrinne教授和Rosenberg大师的辛勤工作。
2.从SIP谈起说明:不期待一次就把RFC3261或者其他的协议文档内容及其细节全部记住或者完全理解;把原理性的东西及其脉络厘清也许更重要;在调试程序和看协议栈源码的过程中我的做法是一直把RFC3261(经常的是那份中文文档☺的文档打开;遇到忘记或者不是太明白的概念和内容就在文档中再搜索相关主题及内容来看看;经常会碰到这样的问题,我发个内容给SIPProGy或者SIPServer,可是并没得到我希望的回复或者与期待的回复内容有出入,这时,我的经常做法是再去研读协议的相关定义,看看是不是我哪个细节并没理解深入或者引起注意,导致我发出去的内容与协议标准有出入或者我的流程与协议定义不吻合。
接下来的内容是前人的文档整理,只是个大概,如果没兴趣,完全可以跳过不看;协议栈部分基本上是分成DUM与Stack两部份可以先后看,也可以先看Stack部分。
补充说明:文档中的大部分图片都来自网上公开的资料,只有少数几幅是自绘,因此出现内容不清和误导,概不负责☺特此感谢借鉴资料和图片的原创者们,虽然他们并不知道又误导了一个菜鸟。
2.1SIP(SessionInitiationProtocol)简介最先由美国哥伦比亚大学的HenningSchulzrinne教授在1998年初开始发起,1999年3月由IETF的MMUSIC(MultipartMultimediaSessionControl)工作小组制定正式标准成为RFC2543,1999年9月IETF成立新的工作小组,负责SIP新版本2.0的制定,并于20GG年7月释出初版RFC2543bis,于20GG 年发布了RFC3261。
RFC3261的发布,标示着SIP的基础已经确立,随后又发布了几个RFC增定版本,充实了安全性及身份认证等几个领域的内容,例如RFC3262对临时响应做了可靠性的规范。
fc协议栈分析

fc协议栈分析协议名称:FC协议栈分析协议一、引言本协议旨在对FC协议栈进行详细分析,包括其结构、功能、特性以及相关应用。
通过对FC协议栈的分析,可以帮助用户更好地理解和应用该协议栈。
二、背景FC(Fibre Channel)协议栈是一种高速、可靠的数据传输协议,广泛应用于存储网络和计算机网络领域。
该协议栈提供了一种可扩展的、灵活的架构,支持多种传输速率和拓扑结构。
三、协议栈结构1. 物理层(Physical Layer):负责传输介质的物理连接和电信号的传输,包括光纤、电缆等。
2. 数据链路层(Data Link Layer):负责数据的分帧、差错检测和流量控制,提供可靠的数据传输。
3. 网络层(Network Layer):负责数据的路由和寻址,提供端到端的通信。
4. 传输层(Transport Layer):负责数据的可靠传输和流量控制,提供端到端的连接。
5. 会话层(Session Layer):负责建立和管理会话,提供应用程序之间的通信。
6. 表示层(Presentation Layer):负责数据的格式转换和加密解密,提供数据表示和交换的标准。
7. 应用层(Application Layer):负责应用程序的数据交互和处理。
四、协议栈功能1. 数据传输:FC协议栈提供高速、可靠的数据传输功能,支持多种传输速率,如1Gbps、2Gbps、4Gbps、8Gbps、16Gbps等。
2. 数据路由:FC协议栈支持多种拓扑结构,如点对点、环形、树形等,可以根据网络需求进行灵活配置。
3. 差错检测与纠正:FC协议栈提供差错检测和纠正机制,保证数据传输的可靠性和完整性。
4. 流量控制:FC协议栈支持流量控制功能,可以根据网络负载和带宽需求进行动态调整,提高网络性能。
5. 端到端连接:FC协议栈提供端到端的连接功能,保证数据的可靠传输和顺序交付。
6. 数据格式转换:FC协议栈支持数据的格式转换和加密解密,提供数据表示和交换的标准。
深入解析无线传感器网络中的网络协议栈

深入解析无线传感器网络中的网络协议栈无线传感器网络(Wireless Sensor Network,WSN)是一种由大量分布在空间中的无线传感器节点组成的网络系统。
这些节点可以感知环境中的各种物理量,并将其通过无线通信传输给中心节点进行处理和分析。
在WSN中,网络协议栈起着至关重要的作用,它负责管理和协调节点之间的通信,保证数据的可靠传输和网络的高效运行。
一、物理层物理层是WSN网络协议栈的最底层,主要负责将数字信号转换为模拟信号并进行无线传输。
在物理层中,常用的调制技术有频移键控(FSK)、相移键控(PSK)和正交频分多址(OFDM)等。
此外,物理层还需要考虑能量消耗的问题,因为无线传感器节点通常由电池供电,能量是非常有限的资源。
二、链路层链路层位于网络协议栈的第二层,主要负责节点之间的数据帧传输。
在WSN 中,由于节点之间的通信距离较近,链路层通常采用低功耗的无线通信技术,如低功耗蓝牙(Bluetooth Low Energy,BLE)和Zigbee等。
链路层还需要解决无线信道的共享和冲突问题,以保证数据的可靠传输。
三、网络层网络层是WSN网络协议栈的第三层,主要负责节点之间的寻址和路由。
在WSN中,网络层需要解决节点拓扑结构的建立和维护问题,以及数据包的转发和路由选择问题。
为了降低能量消耗,网络层通常采用分层路由协议,将网络划分为多个层次,每个层次的节点负责转发和处理相应的数据。
四、传输层传输层位于网络协议栈的第四层,主要负责节点之间的可靠数据传输。
在WSN中,由于节点之间的通信距离较近,传输层通常采用无连接的传输协议,如用户数据报协议(User Datagram Protocol,UDP)。
传输层还需要解决数据包的分段和重组问题,以保证数据的完整性和可靠性。
五、应用层应用层是WSN网络协议栈的最顶层,主要负责节点之间的应用数据交互。
在WSN中,应用层需要根据具体的应用需求设计相应的协议和算法,以实现对环境中各种物理量的感知和监测。
SIP相关的协议

一、SIP: Session Initiation Protocol RFC 3261 二、SDP: Session Description Protocol RFC 2327 三、RTP:Real-time Transport Protocol : RFC 1889 四、MEGACO:Media Gateway Control Protocol(ITU-T H.248) : ( ) RFC 3015 其他: 、 其他:tcp、udp、MGCP、rtcp等 、 、 等
SIP相关资料链接
The Internet Engineering Task Force / 中国通信标准化协会 TC1:IP与多媒体 / International Packet Communications Consortium
开源SIP协议栈
sipX
SVN : /viewsvn/
sipX sipX是一个SIP系统,由SIPFoundry开发。 SIP SIPFoundry sipX是从reSIProcate分离出来的,sipX除了 包括SIP stack外,还包括了sipXphone, sipXproxy, sipXregistry等等...,由它们构成了 完整的SIP系统,而且sipx还支持嵌入式系统, 各个模块可以按需取舍。
开源SIP协议栈
ReSIProcate
SVN : /viewsvn/resiprocate/main/sip/
ReSIProcate同样也是由SIPFoundry开发, ReSIProcate最开始起源于Vocal,由于Vocal 开始只支持rfc3254,为了支持最新的 rfc3261,ReSIProcate诞生了,但现在, ReSIProcate已经成为一个独立SIP协议栈了, 它十分稳定,并且很多商业程序都在使用。
osip2协议栈原理分析以及总结

OSIP2协议栈学习总结1、Osip2协议栈介绍Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点。
它的核心特性为sip协议数据的解析和事务的管理。
数据包的收发、RTP 流的处理等,并不在Osip2中完成。
应用程序使用Osip 时需要单独去实现这些模块。
Osip2的缺点是没有很好的上层api封装,使得上层应用在调用协议栈时很破碎;只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度。
2、Osip2协议栈体系结构OSIP主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块.OSIP结构如图所示.2.1 语法解析器libosip库源码src/osipparser2为解析器源码,OSIP解析模块主要用于对SIP请求与响应进行封装与解析处理,分为SIP解析、URL解析与SDP解析完成对sip协议相关字段的构造和解析。
比如,将紧凑的存储于内存buffer中的sip 数据解析到清晰定义的数据结构体中,每一个字段代表sip协议中有意义的一个头域。
SIP解析主要负责SIP标题头的解析与封装。
SDP解析除了对数据包中SDP会话各类型进行解析外还包含对各类型的初始化和释放操作以及对整个SDP包的一些基本操作。
URL解析主要负责对SIP URI中包含的host,port,username,password等信息进行解析与设置。
2.2 有限状态机SIP状态机模块负责完成对某个事务状态的维持及处理。
并且在特定的状态下触发相应的事件或者回调函数。
OSIP协议栈的状态机主要分为4类:INVITE客户端事务ICT,非INVITE 客户端事务NICT,INVITE服务器端事务IST,非INVITE服务器端事务NIST。
2.3 工具模块OSIP工具模块分为对话管理工具和SDP协商工具。
对话管理工具使用户能够根据RFC3261对dialog进行操作,建立相应dialog结构体。
蓝牙协议栈详解

蓝牙协议栈详解蓝牙协议栈是指蓝牙通信中的软件协议,它定义了蓝牙设备之间的通信规则和数据传输方式。
蓝牙协议栈由多个层次组成,每个层次负责不同的功能和任务。
本文将对蓝牙协议栈的各个层次进行详细解析,以便读者更好地理解蓝牙通信原理。
1. 物理层(Physical Layer)物理层是蓝牙协议栈中最底层的层次,它定义了蓝牙设备的无线通信方式和频率。
蓝牙使用2.4GHz的ISM频段进行通信,采用频率跳变技术来避免干扰。
物理层还定义了蓝牙设备的功率等级和传输速率,以及通信距离的限制。
2. 链路层(Link Layer)链路层是蓝牙协议栈中的第二层,它负责建立和管理蓝牙设备之间的连接。
链路层主要包括两个子层:广告子层和连接子层。
广告子层负责设备的广告和发现,用于建立连接;连接子层负责连接的建立、维护和关闭。
链路层还定义了蓝牙设备之间的数据传输方式,如数据包的格式、错误检测和纠错等。
3. 主机控制器接口(Host Controller Interface,HCI)主机控制器接口是蓝牙协议栈中的第三层,它定义了主机和主机控制器之间的通信方式。
主机控制器接口可以通过串口、USB等方式与主机连接,主要负责传输命令和数据,以及处理主机和主机控制器之间的事件和状态。
4. L2CAP层(Logical Link Control and Adaptation Protocol)L2CAP层是蓝牙协议栈中的第四层,它提供了面向连接和面向无连接的数据传输服务。
L2CAP层可以将较大的数据包分割成多个小的数据包进行传输,并提供可靠的数据传输机制。
L2CAP层还支持多个逻辑信道的复用和分离,以满足不同应用的需求。
5. RFCOMM层(Radio Frequency Communication)RFCOMM层是蓝牙协议栈中的第五层,它通过虚拟串口的方式提供串行数据传输服务。
RFCOMM层允许应用程序通过串口接口与蓝牙设备进行通信,实现数据的传输和控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
也许是事务用户层 13
DialogUsageManager 是 sip 事务层管理类, 是一个大总管的角色; 看其 Makexxx 系列的 函数能明白它能发起一系列登陆、会话邀请的动作及其回复。
Dum 定义了很多句柄管理类,通过它我们能得到真实的对象,从而完成操作,这在事件 响应中非常有用。 在 Dum(DialogUsageManager)的类中基本上这样一条线(以 INVITE 为例): DialogUsageManager 产生 Dialog Set, Dialog Set 产生 Dialog, Dialog 产生 InviteSession; InviteSession 又分 Client InviteSession 和 Server InviteSession。 而上面的各个对象的 PROCESS 或者 DISPATCH 函数产生的各种状态的变化并触发相应事 件。 在 DUM 的 IM/PRESENSE 部分广泛使用 SUBSCRIBE/NOTIFY 的模式,目前协议的定义似乎 参照成熟的设计模式。 个人一直比较喜欢这段论述: session 有两种含义,一种是传统意义上的 RTP 会话,一种是信令意义上的会话。SIP 中的会话指后一种,在层次上它在 dialog 之上,也就是 dialog 可以看成 session 的组 成单元。二者的分别主要基于目前出现的 subscription 应用,对于 session 和 subscription 可以共享一个 dialog,dialog 由基本的会话标识组成,如 Call-ID,From-Tag,To-Tag,以及一些目的 target 等共性单元组成。而 session 除了具 备这些单元外,包含 INVITE 建立起的会话其他内容,例如 INVITE 引起的状态机处理内 容、PRACK 处理记录等内容。有一个最为重要的区别是:Session 是完成了 SDP 的 Offer-Answer 过程,也就是此时双方可以进行双向的 RTP 传输了。而 Dialog 只是双方 建立了联系,这个联系是通过 Dialog Context 来记录的。在 Dialog 状态下双方不一定 可以作双向的 RTP 传输。所以必定是 Dialog 在前,而 Session 在后,但两者可以同时 一起建立。 Session 是基于 SDP Message 的交互,没有 SDP 的交互,就没有 Session。 而 Dialog 是基于请求消息中的 Header Field 进行交互。因此两者在层次上也是不一样 的。
协议栈的层次
SIP 为应用层(Application-Layer)的协议,所以不需要改变操作系统便可以支持。SIP 已经获得 3GPP (Third GenerationPartnership Project)、3GPP2 (Third Generation Partnership ProjectNumber 2)等机构认证,成为未来第三代行动通讯 (3G) 的标准。 下面是 SIP 的分层图示,IETF 坚持分层,不同模块功能相对独立,各层之间松散耦合。
operator*等;源码中也非常注重效率如
Sip Core 部分中大量 Hash 表的建立。
T* operator->() { return get(); }
const T* operator->() const { return get(); }
T& operator-> () { return *get(); }
事务用户层(Transaction User)
事务层(Transaction )
传输层(Transport)
语法与编码层(Syntax and
Encoding)
1
关于 Resiprocate 设计
首先祭出这面大旗,”类是对概念的描述,面向接口编程;封装变化的概念。”---这 不是我讲的,是大师们的口水。 Resiprocate 中大部分类就是对 RFC3261 各种 SIP 元素、 组件的封装, 并且也体现了 RFC 协议设计的层次。 在面向对象的设计中我们首先就要厘清问题域的所在; SIP Stack 的设计就是要充分 考虑完整展现 RFC 定义的各种元素和概念以及让这些独立而又关联的元素互动起来成为 一个活的系统。 可以这样来考虑,比如我们知道 RFC 定义了一个 SIP MESSAGE 的概念;下面是从 RFC 文档拷贝的内容: SIP 消息 = 起始行 *消息头部 CRLF(空行) [消息体]
3
式对对象的间接管理是老外的惯用伎俩啦,关于句柄设计从大师 BS 的著作到 <<Effective C++>>的 Handle_Body 论和<<C++沉思录>>的大段描述再到<<C++ Model Design>>都有发挥和外延,感兴趣可以观之。 插播: 源码中的大量 Clone 函数是模仿大师 BS 的虚拟构造函数一说,是原型模式的体现; 源码中对同步的封装值得借鉴,其中有“资源开始即初始化”理论的体现;在 DUM 部分 回调机制所遵循的著名“好莱坞原则”;句柄和代理的一个特点就是重载了 operator->、
HandleManager::create(Handled* handled) { mHandleMap[++mLastId] = handled;// typedef HashMap<Handled::Id, Handled*> HandleMap; //HandleMap mHandleMap; return mLastId; }
建议:利用 CRC 卡片的方式去记录理解 Resiprocate 中的大量的类及其关系。CRC:类、 职责、协作。
部分设计的理解
OBSERVER/VISITOR/COMMAND/ITERATOR 模式,工厂模式(大量容器的使用也是一种变体 如:DialogSet),代理类句柄类(界面实现分离,隐藏实现…),…… 大量的界面类(如 AppXXX 系列)是遵循大师 BS“界面和实现分离”的原则吧;而句柄方
receiveAny, the SipStack will call postToTu on the appropriate Tu. Messages not associated with a registered TU go into SipStack::mTuFifo. */ void registerTransactionUser(TransactionUser&);
下图是 DUM 中各种对象实例间的关系表示:14DUM 中几个要的类图:1516
17
18
3. RESIPROCATE SIP Core 重要模块的简单 介绍
SipStack 模块
SipStack 是 Sip Stack Core 的面向外界的接口; 可以说它是 Sip Stack Core 的外覆类(wrapper) 或者是界面类(以大师 BS 的观点来看),它是和外界交互的窗口和协议,具体的实现又分散到更 具体的实现类和层次。
1. SIP Stack 分析
5
1.1 Resiprocate SIP Stack 系统架构图示
6
7
8
1.2 FIFO 流的走向图
9
10
1.3 Sending datagram
11
1. 4 Process Incoming UDP
12
2. Application/DUM
设计浅析
抽象接口:CLASS HANDLED ,CLASS InviteSessionHandler(诸如此类) …… 对象之源:CLASS HANDLED(多态和控制的基础)…… 交互控制: CLASS Handle,CLASS HandleManager…… 概念封装成类典型:CLASS Dialog, CLASS DialogId, CLASS DialogSet, CLASS DialogSetId, CLASS InviteSession….. Utility 工具类:CLASS BaseCreator , CLASS DestroyUsage, CLASS Profile…… 流动之源:DialogUsageManager::process(),Dialog::dispatch(const SipMessage& msg)…… 状态机的位置:DialogUsageManager::incomingProcess,DialogSet::dispatch,Dialog::dispatch 在整个 Resiprocate 大家族中事务层概念1的体现是 TransactionUser 类, 而其真正的实 现和管理类就是 DialogUsageManager;从其: class DialogUsageManager : public HandleManager, public TransactionUser 能看出来; HandleManager 点出了 DialogUsageManager 的管理功能的本质, 并且管理各 种对象(Handle 是各类对象的句柄)。 在整个 Resiprocate 系统中不管是我们发出或者收到的 SIP Message 都是放进了先进先 出的队列然后不断轮询处理,这有点象 Windows 的消息系统,对应收发的消息 DUM 提供 事件通知的机制。 DUM 利用事件回调模型, 事件响应可以选择继承系列 XXXHandler 抽象 接口,并向 TU 注册,以实现 VISITOR 模式;我在另外的文档里也提到这是 Reactor (Dispatcher,Notifier)模式,应用程序开发者只负责实现具体事件处理程序,并在 反应器上注册它们 ----“好莱坞原则”。
/// Responsible for routing messages to the correct TU based on installed rules