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小时内删除。
发表评论