1
自己动手写 SIP 协议栈
Author:张梦晗
E_mail:enyaxp@student.dlut.edu.cn
2006 年 9 月 13 日
前言
本文由作者的本科毕设论文改写而成。由于时间仓促及作者
水平所限,本文中的 SIP 协议栈尚不能实用,仅供初学 SIP 协议
的朋友们入个门而已。不足之处还请多多包涵。
2
摘 要 ............................................ Ⅰ
Abstract ........................................... Ⅱ
致 谢 .............................................. 5
第一章 绪论 ....................................... 5
1.1 SIP协议简介........................................................................ 5
1.2 论文各章内容.................................................................... 5
第二章 SIP协议基本介绍........................... 7
2.1 SIP系统基本组成................................................................ 7
2.2 SIP消息描述........................................................................ 7
2.2.1 起始行(start-line) .................................................. 8
2.2.2 消息头(message-header)..................................... 10
2.3 SIP基本会话过程...............................................................11
第三章 SIP协议栈ZmhSipStack的实现............. 14
3.1 协议栈工作原理................................................................ 14
3.2 协议栈处理器的实现........................................................ 16
3.2.1 传输层模块............................................................. 17
3.2.2 文本解析器............................................................. 18
3.2.3 文本生成器............................................................. 23
3.2.4 数据处理器............................................................. 24
3.2.5 SIP状态机............................................................... 26
第四章 基于ZmhSipStack的应用程序编写 ......... 30
4.1 基于ZmhSipStack的应用程序开发.................................. 30
4.2 用户代理程序SipUA的实现.............................................. 31
4.2.1 RTP模块................................................................... 32
4.2.2 编解码器模块........................................................... 32
3
4.2.3 音视频采集与输出模块......................................... 33
4.2.4 用户对话框设计以及程序运行效果..................... 34
4.3 无状态服务器程序SipProxyServer的实现.................... 36
第五章 ZmhSipStack在嵌入式环境下的应用 ........ 38
5.1 ARM/μCOS-Ⅱ嵌入式开发环境介绍................................ 38
5.2 ZmhSipStack的嵌入式移植.............................................. 39
5.3 基于ZmhSipStack的嵌入式应用程序构建...................... 40
5.3.1 ArmSipUA构建......................................................... 41
5.3.2 ArmSipProxy构建................................................... 42
第六章 局域网内的SIP通信实验 .................... 43
6.1 实验条件介绍..................................................................... 43
6.2 实验步骤说明.................................................................... 43
结 论 ........................................... 46
参考文献 ........................................... 47
4
第一章 绪论
1.1 SIP 协议简介
SIP(Session Initiation Protocal)称为会话初始化协议,
是由 IETF(Internet Engineering Task Force)组织于 1999 年
提出的一个基于 IP 网络中实现实时通信应用的一种信令协议。作
为一个由 IETF 提出的标准,SIP 协议很大程度上借鉴了其他各种
广泛存在的 Internet 协议,采用基于文本的编码方式,这也是
SIP 协议同下一代网络视音频通信领域其他现有标准相比最大的
特点之一。
和原有的多媒体会话协议(如 H.323)相比,SIP 具有以下优
点:
可与 Voice XML、JSP、J2ME 等结合,快速开发增值业务;
支持多媒体应用,如语音、视频、图像、音频、文字、
数据等业务;
可将语音、视频、Presence、短消息、Web 浏览、定位信
息、Push、文件共享等业务结合起来,在语音、数据业
务结合和互通方面有天然优势;
业务网络和承载网络分离,两者可独立发展;
业务网络可以融合现有的固网和移动网业务;
协议简单,具有公认的扩展潜力。
基于以上优势,SIP 协议被广泛应用于下一代网络的业务开
发当中。而在现代软交换网络和未来移动网络中,SIP 协议更是
将作为各个功能单元之间互通的基础协议,因此,有人也称 SIP
协议为下一代网络中的“TCP/IP”协议(图 1.1)。
1.2 论文各章内容
本论文的各章内容如下:
⑴ 本文第二章介绍 SIP 协议的基本原理、格式和与其他辅
5
助协议的结合,然后介绍 SIP 系统的工作原理和基本会话过程;
(a) VoIP 软件 (b) 可视电话终端 (c) 多媒体网关 (d) 3G 手机
图 1.1 基于 SIP 协议的通信应用
⑵ 第三章介绍 SIP 系统的核心—SIP 协议栈的编写:首先
进行方案论证,然后分析协议栈的工作原理和需要实现的机能,
紧接着介绍自主开发的 SIP 协议栈 ZmhSipStack 的软件架构、结
构体定义和各具体功能函数;
⑶ 第四章介绍了基于此协议栈编写的应用于 PC 机的用户
代理程序 SipUA 和服务器程序 SipProxyServer,并对实现程序各
功能的函数进行解释,最后展示程序运行效果;
⑷ 第五章中介绍了如何将 SIP 协议栈 ZmhSipStack 移植到
嵌入式 ARM/μCOS-Ⅱ 环境下,并介绍了基于此协议栈编写的应
用于嵌入式 ARM 平台的用户代理程序和服务器程序;
⑸ 第六章应用用户代理和服务器程序在 PC 机和 ARM 平台之
间进行 SIP 协议会话实验,并给出实验结果。
6
第二章 SIP 协议基本介绍
本章主要介绍了 SIP 系统的基本组成和 SIP 协议的消息格式,
并介绍了 SIP 系统的四种基本会话过程。
2.1 SIP 系统基本组成
SIP系统在RFC3261中有详细的定义。为了描述问题方便,
RFC3261定义了几种逻辑功能实体,协议对每种实体的功能和行为
都进行了详尽描述。实际应用中,一个物理实体可能集成了多个
逻辑功能。
在RFC3261看来,SIP系统可按逻辑功能分为4种元素:User
Agent(用户代理),Proxy(代理服务器),Redirect Sever(重
定向服务器),Registrar(注册服务器)。
图 2.1描述了一个完备SIP系统的网络结构。从中我们可以发
现用户代理、注册服务器、代理服务器都在同一个网域中,而重
定向服务器可以在这个网域中,也可以在另一个网域中。SIP系统
的会话过程请参看本章2.4节。
图 2.1 SIP 系统的网络结构
2.2 SIP消息描述
SIP协议是基于文本的通信信令协议。SIP消息以文本形式表
示消息的语法、语义和编码,因此相对于二进制的信令,SIP消息
7
显得简单、易懂。
SIP消息有两种:客户端到服务器的请求消息和服务器到客户
端的响应消息。SIP消息由一个起始行(start-line)、一个或多
个字段(field)组成的消息头、一个标志消息头结束的空行(CRLF)
以及作为可选项的消息体(message body)组成。其中描述消息
体的头称为实体头(entity header),其格式如下:
generic-message = start-line
*message-header
CRLF
[message-body]
下面分别对起始行、消息头及消息体一一进行解释。
2.2.1 起始行(start-line)
起始行分请求行(Request-Line)和状态行(Status-Line)两
种,其中请求行是请求消息的起始行,状态行是响应消息的起始
行。
1.请求行(Request-Line)
请求行已方法(method)标记开始,后面是统一定位标示符
(URI)和协议版本号(SIP-Version),最后以回车换行符结束,
各个元素间用空格键字符间隔。
Request-Line = Method SP Request-URI SP SIP-Version CRLF
方法标记“Method ”来对说明部分进行描述。SIP 协议在
RFC3261中一共定义了六种方法。具体定义如下:
INVITE:用于邀请用户或服务参加一个会话。INVITE
消息中必须包含主叫方和被叫方的信息和双方交换的多
媒体信息流类型。除了能够用用于启动双方通信会话外,
还具有启动多方会议的能力;
ACK:用于客户机向服务器证实它已经收到了对INVITE
请求的最终响应。ACK消息中的主叫、被叫信息是由前
8