SIP相关介绍
一:SIP 消息介绍
1:SIP请求消息
2:SIP响应消息
3:INVITE 消息
4:SDP
- v=:Version,表示协议的版本号。
- o=:Origin,表示源。值域中各项(以空格分隔)的涵义依次是username(用户名)、sess-id(会话ID)、sess-ver-sion(会话版本号)、nettype(网络类型)、addrtype(地址类型)、unicast-address(单播地址)。
- s=:Session Name,表示本SDP所描述的Session的名称。
- c=:Connecton Data,连接数据。其中值域中以空格分配的两个字段分别是网络类型和网络地址,以后的RTP流就会发到该地址上。注意,在NAT环境中如果我们要解决RTP穿越问题就要看这个地址。NAT问题将在第9章节中讲到。
- b=:Badwidth Type,带宽类型。
- t=:Timing,起止时间。0表示无限。
- m=:audio Media Type,媒体类型。audio表示音频,8396表示音频的端口号, RTP/AVP是传输协议;后面是支持的Codec类型,与RTP流中的Pay-load Type(载荷类型)相对应,在这里分别是8、0、98和101,8和0分别代表PCMA和PCMU,它们属于静态编码,因而有一一对应的关系,而对于大于95的编码都属于动态编码,需要在后面使用“a=rtpmap”进行说明。
- a=:Attributes,属性。它用于描述上面音频的属性,如本例中98代表8000Hz的ILBC编码,101代表RFC2833DTMF事件。a=sendrecv表示该媒体流可用于收和发,其他的还有sendonly(仅收)、recvonly(仅发)和inac-tive(不收不发)。
5:Sip 中的 brahch 、tag 、 CSeq
- Transaction(事务) 事务发生于客户端和服务器端之间,包含从客户端发出请求给服务器,到服务器响应给客户端的最终消息(non-1xx message)之间的所有消息. 如果请求是一个"Invite"消息,并且最终的响应是一个non-2xx消息,那么该事务包含一个"Ack"响应消息.如果服务器的响应是一个2xx消息,那么,随后的ACK是一个单独的事务.
brahch是一个事务ID(Transaction ID),用于区分同一个Client 所发起的不同Transaction。
对于遵循RFC3261规范的实现,这个branch参数的值必须用magic cookie”z9hG4bK”打头. 其它部分是对“To, From, Call-ID头 域和Request-URI”按一定的算法加密后得到。
这7个字母是一个乱数cookie(定义成为7位的是为了保证旧版 本的RFC2543实现不会产生这样的值),这样服务器收到请求之 后,可以很方便的知道这个branch ID是否由本规范所产生的(就 是说,全局唯一的)。
- Dialog(会话) 会话是两个UAs(user agent) 之间持续一段时间的端到端(peer-to-peer)的SIP 关系. 一个会话由一个Call-ID, 一个local tag 和 一个remote tag来标识.会话过去也叫做 "call leg".
对话都是有对话ID来标识的,包括Call-ID,一个本地标签(From-tag)和一个远端标签(To-tag)。即是说三者确定了某个对话的存在。
- CSeq是一个序号,由于UDP是不可靠的协议,在不可靠的网络上可能丢包,所以有些包需要重发,该序号则可以防止重发引起的消息重复。
CSeq序列号。CSeq是按照各自方向严格增1的值,如果为空则设 为初始值。
二:RTP & RTCP
在完成SIP及SDP协商后,真正的语音数据是在RTP协议中传送的。即双方在前面的SDP协商中都已经获得了对方的IP地址、端口号,以及支持的媒体类型。接下来,就是将本地的媒体数据以指定的编码格式进行编码并通过RTP协议发送到对方去。
- RTP协议的全称是Real-time Transport Protocol,即实时传输协议,它是由IETF的多媒体传输工作小组在RFC 3550中定义的。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。
- RTP协议用以传送实时数据。RTP协议通常运行在UDP层之上,二者共同完成运输层的功能。UDP提供复用及校验和服务,也就是通过分配不同的端口号传送多个RTP流。协议规定,RTP流使用偶数(2n)端口号,相应的RTCP流使用相邻的奇数(2n+1)端口号。因此,应用进程应在一对端口上接收RTP数据和RTCP控制数据,同时向另一对端口上接收RTP数据和RTCP控制数据。
三 DTMF
DTMF(Dual Tone Multi Frequency)就是双音多频,我们日常生活中拨打电话的过程中经常会用到,如拨打用户的分机号码,输入帐号和密码等。而随着IP电话的大量使用如何实现传送DTMF成为IP电话中的一个技术问题。
SIP中检测DTMF数据的方法:SIPINFO、RFC2833、INBAND
1)SIPINFO
为带外检测方式,通过SIP信令通道传输DTMF数据。没有统一的实现标准,目前以Cisco SIPINFO为标准,通过SIPINFO包中的signal字段识别DTMF按键。注意当DTMF为“*”时不同的标准实现对应的signal=*或signal=10。SIPINFO的好处就是不影响RTP数据包的传输,但可能会造成不同步。
2)RFC2833
为带内检测方式,通过RTP传输,由特殊的rtpPayloadType即TeleponeEvent来标示RFC2833数据包。同一个DTMF按键通常会对应多个RTP包,这些RTP数据包的时间戳均相同,此可以作为识别同一个按键的判断依据,最后一包RTP数据包的end标志置1表示DTMF数据结束。另外,很多SIP UA 包括IAD都提供TeleponeEvent的设置功能如3CX Phone,Billion-IAD,ZTE-IAD等默认的TeleponeEvent都为101,但可以人为修改,这时要求在进行RFC2833 DTMF检测之前需事先获取SDP协商的TeleponeEvent参数。
就是将DTMF数字按照一个的规则和格式组成一个数据包,然后封装到RTP中发送。接收端接收后进行解析,再还原成相应的DTMF信号,这种方式的优点是对丢包的容错性强以及识别差错率低。
3)INBAND
为带内检测方式,而且与普通的RTP语音包混在一起传送。在进行INBAND DTMF检测时唯一的办法就是提取RTP数据包进行频谱分析,经过频谱分析得到高频和低频的频率,然后查表得到对应的按键。在选择压缩比很高码率很低的codec,比如G.723.1和G.729A等,建议不要使用INBAND模式,因为INBAND DTMF数据在进行复杂编解码后会产生失真,造成DTMF检测发生偏差或失败。
四:SIPp压力测试
1:SIPp介绍
- SIPp 是基于SIP协议的性能测试工具. 它可以模拟各种UAC或者UAS的行为, 通过INVITE和BYE方法来建立和挂断通话.
- 可以在XML的文件中, 建立各种性能测试的场景, 如:呼叫/88#转接等, SIPp可以解析该文件并执行, 还可以在场景文件中使用正则或者变量.
- 可以实时显示测试中的各种统计参数(如:呼叫速率, 消息统计等),可以定时将统计结果写到CSV文件中, 可以实时调节呼叫速率.
- SIPp可以用来测试很多SIP设备, 如SIP代理, B2BUAs, SIP媒体网关, SIP PBX等, 很适合模拟数千个坐席来呼叫SIP系统.
- 手册:http://sipp.sourceforge.net/doc/reference.html#Foreword
2:SIPp的使用
1) SIPp:UAC(register)
注册分机:
./sipp -sf mast_reg.xml -m 1 -p 15000
–loip 192.168.1.102 -xcip 192.168.1.102 -ap samton148 -s 18627180502 -fid 18625320000–aa -trace_err –bg
小技巧:
- 注册和注销的命令基本一样, 只需要修改场景文件中的注册时间: Expires: 3600 => Expires: 0
- 为了使测试能长时间执行, 需要将注册时间尽可能的定义久一些, 如 720000s(200个小时), 同时, 需要在PBX的sip.conf文件中, 定义最大的注册时间, maxexpiry=720000,默认值为3600.
- –aa: 对INFO,UPDATE,NOTIFY消息自动回复200OK
- –trace_err: 保存错误消息, 位于场景文件相同的目录
下, 文件名为<scenario filename>_<pid>_errors.log
类似选项(trace_msg, trace_stat, trace_rtt)
- –bg: 置于后台执行
2) SIPp:UAC(caller)
发起呼叫:
./Sipp–sf mast_uac.xml -r 30 –rp 1s
-loip 192.168.1.102 -xcip 192.168.1.102 –ap samton148
–s 18627180502 -p 7000 –mp 7002 -fid 18625320000-m 1000
命令解析:
1. 192.168.1.102: 服务器IP地址
2. –sf: 指定的场景文件
3. -r 30 –rp 1s: 每秒执行30次 (-rp 1s == -rp 1000 )
4. –m: 总共执行的次数
5. –p: SIPp运行时绑定的端口, -mp: 绑定的媒体端口
6. –loip, -xcip, -ap, -s, -fid: (本地IP,远程IP,用户密码,被叫,主叫),用来替换场景文件中的变量
3) SIPp:UAS(callee)
接听来电:
./sipp -sf mast_uas.xml -p 15000 –mp 15002 –fid 18627180502
-loip 192.168.1.102 -xcip 192.168.1.102 -aa
注意:
1. 做为UAS端的SIPp, 不需要远端服务器的参数
2. 做为被叫号码, 必需先注册
五:软交换系统
1) ppx_softswitch
ppx_softswitch系统是一套轻便级软交换系统,软件构架如下图所示:
- LibEdit:命令行交互基础库;
- Sofia-SIP:Nokia开发的SIP开源协议栈,负责SIP消息解析和封装,SIP事物管理,SDP消息解析和封装等;
- Core:软交换入口模块,负责配置文件的加载、所有模块的初始化和启动等;
- Utils:基础功能函数库,比如log,socket,哈希表,MD5算法等常用函数集;
- CLI(Command-Line Interface):命令行操作维护管理模块;
- SCM(SIP Call Management):SIP会话管理模块;
- Formats:语音文件的读取和写入;
- Codes:音频编解码库集合;
- MS(Media Streamer):媒体流会话管理,RTP协议解析和封装,录音处理等;
- PBX:PBX业务逻辑处理模块;
- Meeting:会议管理模块;
- SynwayAdapter:三汇API接口适配提供和管理模块。