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–Suac(screen的名字,可以随便命名,便于区分主被叫即可)./caller.sh启动成功,可以按ctrl+a+d退出screen(切到后台运行)2)启动被叫:Screen–Suas./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做测试的时候需要准备五个文件:uac.xml,uas.xml,uac.sh,uas.sh,data.csv。(xml文件是必须的,后面三个根据情况可以使用命令或参数代替)uac.xml(uas.xml):根据实际需要编写的uac(uas)侧的sip信号流程;uac.sh(uas.sh):模拟主叫(被叫),调用sipp命令,并传入相应参数的批处理文件,也可不准备此文件直接输入sipp命令执行程序,但是写成文件执行更加方便可靠;data.csv:用于uac.xml和uas.xml中需要引入的相应数据。注:在Windows下运行时,通过usc.bat(uas.bat)代替.sh文件。SIPp脚本运行示例:2.SIPp核心配置文件编写在编写xml脚本文件之前,需要先明确SIPp脚本模拟的对象、以及最终需要测试的对象,现以Volte彩铃业务为例说明,Volte彩铃业务框架如下图:主叫被叫核心网TASSIP前台CN+业务MS当需要测试业务平台,且不受核心网限制时,可以将主/被叫与核心网当成一个整体,通过抓取SIP前台服务器的包作为参考来编写uac.xml(uas.xml),而UAC(UAS)发送给SIP前台的消息应该是真实主(被)叫消息通过核心网后发给SIP前台的消息形式。下面以Volte彩铃非Precondition流程为例:..1.INVITE(SDP_A)2.INVITE(SDP_A)3.INVITE(SDP_A)13.180(SDP_CAT)17.PRACK18.200OK(PRACK)10.180主叫域19.200OK(INVITE)(SDP_A_Regular)20.200OK(INVITE)(SDP_A_Regular)21.ACK32.UPDATE(SDP_B)33.200OK(UPDATE)(SDP_B_regular)22.ACK23.re-INVITE()24.re-INVITE()27.200OKre-INVITE(SDP_B)38.ACK(SDP_B_Regular36.ACK35.200OK(INVITE)11.18012.180停止彩铃播放25.re-INVITE()26.re-INVITE()28.200OKre-INVITE(SDP_B)30.200OKre-INVITE(SDP_B)S-CSCFI/S-CSCFTAS省彩铃平台(AS)UEb被叫域4.INVITE(SDP_A)5.INVITE(SDP_A)6.INVITE(SDP_A)被叫域选7.INVITE(SDP_A)8.INVITE(SDP_A)9.18014.180(SDP_CAT)15.180(SDP_CAT)16.180(SDP_CAT)播放彩铃被叫摘机29.200OKre-INVITE(SDP_B)主被叫建立双方通话37.ACK(SDP_B_Regular34.200OK(UPDATE)(SDP_B_regular)31.UPDATE(SDP_B)将主/被叫与核心网当成一个整体,得出SIPp脚本编写所需的流程图为:UAC业务平台UASInvite(sdp)180PRACK200(PRACK)200(invite_sdp)ACKInvite200(invite_sdp)UPDATE200(update_sdp)200(invite_sdp)ACK2.1.SIP消息命令介绍一下如何创建自己的SIPpXML脚本。一个SIPp脚本总是以如下开头:?xmlversion=1.0encoding=ISO-8859-1?scenarioname=BasicSipstoneUAC而且总是以下面语句结束:/scenario开头和结尾很简单,至于中间的写法规则其实也不难,在SIPp的脚本文件中,有许多用于操作SIP消息的命令,以下是使用率比较高的命令详细列表:命令属性描述例子sendretrans只用于UDP传输:指定计数器T1值,在RFC3261,17.1.1.2章节有描述sendretrans=500:表示每500ms重传输该消息,可在没收到响应的情况下,在设定的时间之后重传。lost模拟丢包率sendlost=10:发送的丢包率为10%recvresponse指定SIPp期望收到的SIP消息代码,如1xx,2xx,3xx等recvresponse=200:表示SIPp期望收到代码为200的消息request指定SIPp期望收到的SIP请求消息,如:INVITE,ACK,BYE,REGISTER,CANCEL,OPTIONS等。recvrequest=ACK:表示SIPp期望收到ACK请求optional指定SIPp期望收到的消息是可选的,对端可以回这个期望的消息,也可以没有回这个期望的消息。recvresponse=100optional=true:表示SIPp期望收到代码为100的消息,但如果没有收到也没有关系。action指定当收到指定的消息时SIPp需要采取的动作lost模拟丢包率recvlost=10pausemilliseconds定义暂停的时间,单位为ms。当没有指定时间时,则使用命令行参数-d来指定。pausemilliseconds=5000/:暂停脚本5秒钟sendCmd![CDATA[]]用于SIP中第三方呼叫控制(3PCC)。CDATA必须包括Call-ID。sendCmd![CDATA[Call-ID:[call_id]……]]/sendCmdrecvCmdaction当接收到命令时定义一个动作。recvCmdactioneregregexp=Content-Type:.*search_in=msgassign_to=2//action/recvCmd通用crlf在脚本视图中对应的位置处输出一个空行sendcrlf=true有些命令在书写时是成对出现的,如send/send是一对,有些命令在书些时不用成对出现,如pausemilliseconds=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)+callnumber+message索引组成的branchid到脚本中。[field0-nfile=filenameline=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”命令开始,如下:sendretrans=500![CDATA[INVITEsip:[service]@[remote_ip]:[remote_port]SIP/2.0Via:SIP/2.0/[transport][local_ip]:[local_port]From:sippsip:sipp@[local_ip]:[local_port];tag=[call_number]To:sutsip:[service]@[remote_ip]:[remote_port]Call-ID:[call_id]Cseq:1INVITEContact:sip:sipp@[local_ip]:[local_port]Max-Forwards:70Content-Type:application/sdpContent-Length:[len]v=0o=user1536557652353687637INIP[local_ip_type][local_ip]s=-t=00c=INIP[media_ip_type][media_ip]m=audio[media_port]RTP/AVP0a=rtpmap:0PCMU/8000]]/send在send命令内部