1.SIPp概述
1.1.SIPp简介
SIPp是一个测试SIP协议性能的工具软件。它包含了一些基本的用户代理工作流程(UAC和UAS:UAC负责发起SIP呼叫请求,UAS接收UAC的请求并负责对其做出响应),并可使用INVITE和BYE建立和释放多个呼叫。
可以读取XML的场景文件,即描述任何性能测试的配置文件,在场景定义文件中可以使用正则表达式;
能动态显示测试运行的统计数据(呼叫速率、消息统计等);
可以用来测试许多真实的SIP设备,也可以模仿上千个SIP代理呼叫你的SIP系统;
另外,SIPp可以用来模拟现场的SIP信令,以重现出现的故障;或者可以自定义SIP协议以测试终端对某些方面的容错或错误处理能力。
1.2.SIPp安装
1.2.1.SIPp在Linux下安装
安装步骤
1)SIPp安装到sipp账户下面(也可以安装到其他账户下),上传tar包到服务器,直接解压;
2)执行编译脚本,进入sipp目录下,执行make;
3)进入.bash_profile配置环境变量,如下图所示,配置完成后执行. .bash_profile后生效;
启动方式
screen方式启动主被叫,登录sipp账户打开两个窗口,分别用于启动主叫和被叫,进入到sipp脚本目录下,执行如下命令:
1)启动主叫:
Screen –S uac(screen的名字,可以随便命名,便于区分主被叫即可)
./caller.sh
启动成功,可以按ctrl+a+d退出screen(切到后台运行)
2)启动被叫:
Screen –S uas
./callee.sh
启动成功,可以按ctrl+a+d退出screen(切到后台运行)
3)再次进入screen,可以先执行screen -ls查看screen进程号,然后再执行screen -r 进程号,便可进入该screen,按ctrl+c后再输入exit,即可结束进程。
1.2.2.SIPp在windows下安装
直接解压双击安装即可。
注意事项:
1)安装前:在SIPp安装目录的根目录(如C:\)下安装cygwin或者直接在根目录下建立一个空的文件夹cygwin;
2)安装完成后:配置环境变量,在系统变量“Path”的最后添加“;SIPp的安装目录”并保存;
3)运行脚本时:脚本所在盘的根目录下必须包含usr文件夹,系统盘下一般都有,或者直接从其他机器上复制一份过来;
1.3.SIPp使用
用SIPp做测试的时候需要准备五个文件:l,l,uac.sh,uas.sh,data.csv。(xml文件是必须的,后面三个根据情况可以使用命令或参数代替)
l(l):根据实际需要编写的uac(uas)侧的sip信号流程;
uac.sh(uas.sh):模拟主叫(被叫),调用sipp命令,并传入相应参数的批处理文件,也可不准备此文件直接输入sipp命令执行程序,但是写成文件执行更加方便可靠;
data.csv:用于l和l中需要引入的相应数据。
注:在Windows下运行时,通过usc.bat(uas.bat)代替.s件。
SIPp脚本运行示例:
2.SIPp核心配置文件编写
在编写xml脚本文件之前,需要先明确SIPp脚本模拟的对象、以及最终需要测试的对象,现以Volte彩铃业务为例说明,Volte彩铃业务框架如下图:
当需要测试业务平台,且不受核心网限制时,可以将主/被叫与核心网当成一个整体,通过抓取SIP前台服务器的包作为参考来编写l(l),而UAC(UAS)发送给SIP前台的消息应该是真实主(被)叫消息通过核心网后发给SIP前台的消息形式。
下面以Volte彩铃非Precondition流程为例:
将主/被叫与核心网当成一个整体,得出SIPp脚本编写所需的流程图为:
2.1.SIP消息命令
介绍一下如何创建自己的SIPp XML脚本。一个SIPp脚本总是以如下开头:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="Basic Sipstone UAC">
而且总是以下面语句结束:
</scenario>
开头和结尾很简单,至于中间的写法规则其实也不难,在SIPp的脚本文件中,有许多用于操作SIP消息的命令,以下是使用率比较高的命令详细列表:
正则匹配关键词
命令
属性
描述
例子
<send>
retrans
只用于UDP传输:指定计数器T1值,在RFC3261,17.1.1.2章节有描述
<send retrans="500">:
表示每500ms重传输该消息,可在没收到响应的情况下,在设定的时间之后重传。
lost
模拟丢包率
<send lost="10">:
发送的丢包率为10%
<recv>
response
指定SIPp期望收到的SIP消息代码,如1xx,2xx,3xx等
<recv response="200">:
表示SIPp期望收到代码为200的消息
request
指定SIPp期望收到的SIP请求消息,如:INVITE,ACK,BYE,REGISTER,CANCEL,OPTIONS等。
<recv request="ACK">:
表示SIPp期望收到ACK请求
optional
指定SIPp期望收到的消息是可选的,对端可以回这个期望的消息,也可以没有回这个期望的消息。
<recv response="100" optional="true">:
表示SIPp期望收到代码为100的消息,但如果没有收到也没有关系。
action
指定当收到指定的消息时SIPp需要采取的动作
lost
模拟丢包率
<recv lost="10">
<pause>
milliseconds
定义暂停的时间,单位为ms。当没有指定时间时,则使用命令行参数-d来指定。
<pause milliseconds="5000"/>:
暂停脚本5秒钟
<sendCmd>
<![CDATA[]]>
用于SIP中第三方呼叫控制(3PCC)。CDATA必须包括Call-ID。
<sendCmd>
  <![CDATA[
    Call-ID: [call_id]
……
  ]]>
</sendCmd>
<recvCmd>
action
当接收到命令时定义一个动作。
<recvCmd>
  <action
    <ereg regexp="Content-Type:.*"
          search_in="msg"
          assign_to="2"/>
  </action>
</recvCmd>
通用
crlf
在脚本视图中对应的位置处输出一个空行
<send crlf="true">
有些命令在书写时是成对出现的,如<send> </send>是一对,有些命令在书些时不用成对出现,如<pause milliseconds="5000"/>。
2.2.SIPp脚本关键词
常用关键词具体可见下表"关键词列表"。
关键词
默认值
说明
[service]
service
由参数-s传递,一般用来指定单个主被叫
[remote_ip]
远端设备地址
[remote_port]
5060
远端设备端口。可以在脚本中使用偏移量,如[remote_port+3]
[transport]
UDP
指定传输层协议,UDP/TCP,由参数-t决定
[local_ip]
主机本地地址
可以由参数-i指定
[local_ip_type]
ip版本
[local_port]
由系统随机分配
可由-p指定,可以在脚本中使用偏移量,如[local_port+3]
[len]
sdp长度,用于"Content-Length"头域,由sipp自动生成或者手动指定,可以添加偏移量,如[len+3]
[call_number]
呼叫索引,从1开始,每增加一个呼叫递增1
[cseq]
初始值为1,可以使用参数 -base_cseq手动指定初始值。
[media_ip]
本地媒体流ip,可以由-mi参数指定
[media_ip_type]
本地媒体流ip版本
[media_port]
本地媒体流端口,可由-mp指定,可以设置偏移量[media_port+3]
[last_*]
此关键词用于从接收的上一个sip消息中提取指定头域(如果存在)的值。比如[last_to]则表示从接收的上一个sip消息中提取To域的消息保存到[last_to]中并应用。
[branch]
生成一个由(z9hG4bK) + call number + message索引组成的branch id到脚本中。
[field0-n file=<filename> line=<number>]
从外部文件csv加载值,file表示选择从命令行中指定的csv文件的一个文件作为外部文件,line定义选择的外部文件的起始行,field选择字段。
脚本参数化:
1、需要sipp命令赋值的参数-p、-i、-s:[local_ip]、[local_port]、[remote_ip]、[remote_port]、[service]
2、sipp自动检测生成的参数:[call_number]、[call_id]、[cseq]、[len]、[branch]
2.3.创建客户端(UAC)脚本
UAC脚本以“send”命令开始,如下:
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: sut <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
Cseq: 1 INVITE
Contact: sip:sipp@[local_ip]:[local_port]
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: [len]
v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=-
t=0 0
c=IN IP[media_ip_type] [media_ip]
m=audio [media_port] RTP/AVP 0
a=rtpmap:0 PCMU/8000
]]>
</send>
在send命令内部,必须将待发送的sip消息括入"<![CDATA" 和 "]]>"中间,在这中间的所有内容将会被发送到远端系统。同时,在这个示例中包含一些特殊的关键词,比如:[service],[remote_ip],这些关键词可以通过sipp命令参数来进行赋值,具体可见2.2节"关键词列表"。另外:加入retrans参数,可在没收到响应的情况下,在设定的时间之后重传,此例中为500毫秒。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。