SIPp使用手册
黄龙舟 译 ****************
http://blog.163.com/hlz_2599
目录
SIPP使用手册 ................................................................................................................................... 1 目录 ...................................................................................................................................................... 2 一、 简介 ......................................................................................................................................... 3 二、 安装SIPP .................................................................................................................................. 3
1. 获取SIPp ................................................................................................................................................ 3 2. 安装SIPp ................................................................................................................................................ 4 3. 增加文件标识符 ............................................................................................................................. 5
三、 使用SIPP .................................................................................................................................. 6
1. 主要特性 ................................................................................................................................................ 6 2. 集成的脚本(场景) ............................................................................................................................. 6 2.1 示范脚本:主叫(UAC) ............................................................................................................... 6 2.2 示范脚本:带媒体的UAC .............................................................................................................. 7 2.3 示范脚本:被叫(UAS.xml) ......................................................................................................... 7 2.4 示范脚本:正则表达式,regexp.xml ............................................................................................. 8 2.5 示范脚本:分支,branchc.xml和branchs.xml ............................................................................. 8 2.6 UAC Out-of-call消息 ......................................................................................................................... 9 2.7 3PCC(第三方呼叫控制) ............................................................................................................... 9 3. 扩展的3PCC ......................................................................................................................................... 12 4. 控制SIPp .............................................................................................................................................. 12 5. 后台运行SIPp....................................................................................................................................... 13 6. 创建自定义的XML脚本 ...................................................................................................................... 13 6.1 创建客户端(类似UAC)脚本 .................................................................................................... 20 6.2 创建服务端(类似UAS)脚本 ..................................................................................................... 24 6.3 动作(Actions) ............................................................................................................................ 25 6.4 变量 ................................................................................................................................................ 31 6.5 条件分支 ........................................................................................................................................ 33 6.6 SIP认证 ........................................................................................................................................... 34 6.7 初始场景 ........................................................................................................................................ 36 7. 运行界面 .............................................................................................................................................. 36 8. 传输层模式........................................................................................................................................... 38 9. 统计 ...................................................................................................................................................... 39 10. 错误处理 ............................................................................................................................................ 40 11. 日志功能 ............................................................................................................................................ 40 12. 使用SIPp做性能测试 ........................................................................................................................ 45 12.1 使用SIPp做性能测试的建议 ..................................................................................................... 45 12.2 SIPp内部调度机制 ....................................................................................................................... 45
一、 简介
SIPp是一个测试SIP协议性能的工具软件,它包含了一些基本的SipStone用户代理工作流程(UAC和UAS),并可使用INVITE和BYE建立和释放多个呼叫。它也可以读XML的场景文件,即描述任何性能测试的配置文件(可以用他来模拟现场的SIP信令,以重现出现的故障;或者可以自定义SIP协议以测试终端对某些方面的容错或错误处理能力)。它能动态显示测试运行的统计数据(呼叫速率、信号来回的延迟,以及消息统计)。周期性地把CSV统计数据转储,在多个套接字上的TCP和UDP,利用重新传输管理的多路复用。在场景定义文件中可以使用正则表达式,动态调整呼叫速率。SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x网关,SIP PBX,等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。另外,SIPp还可以简单用来测试SIP协议。
本文档是根据sipp v3.4版本来编写的,早期的sipp版本可能不含有本文档提到的一些特性。
下面是SIPp的运行界面截图:
二、 安装SIPp
1. 获取SIPp
SIPp在GNU GPU许可下发行,sipp下载地址为http://sourceforge.net/projects/sipp/files/
2. 安装SIPp
SIPp可安装在Linux和Cygwin上面,其他Unix版本可能也可以安装使用,但在每一个发布周期中并未被测试。不过Cygwin上面性能没有Linux上面好,且SIPp只能在运行于windows xp或更高windows版本的Cygwin上面运行。在Linux环境中,SIPp以源代码的形式提供,在使用SIPp之前需要编译SIPp,在编译之前需要如下依赖组件:
C++ Compiler
curses or ncurses library
For TLS support: OpenSSL >= 0.9.8
For pcap play support: libpcap and libnet For SCTP support: lksctp-tools
For distributed pauses: Gnu Scientific Libraries
在编译SIPp时,有如下四个选项:
不包含对TLS,SCTP或PCAP的支持
# tar -xvzf sipp-xxx.tar # cd sipp # ./configure # make
包含TLS支持
# tar -xvzf sipp-xxx.tar # cd sipp
# ./configure --with-openssl # make
包含PCAP play支持
# tar -xvzf sipp-xxx.tar # cd sipp
# ./configure --with-pcap # make
包含SCTP支持
# tar -xvzf sipp-xxx.tar # cd sipp
# ./configure --with-sctp # make
或者组合支持以上功能
# tar -xvzf sipp-xxx.tar # cd sipp
# ./configure --with-sctp --with-pcap --with-openssl # make
下面以CentOS 6.4为例,可以按如下步骤编译安装 #yum install gcc-c++ gcc automake autoconf libtool make #yum install libpcap libpcap-devel #yum install ncurses ncurses-devel #tar -xvzf sipp-xxx.tar.gz #cd sipp #./configure --with-sctp --with-pcap --with-openssl #make && make install 安装后使用sipp -v命令可查看当前sipp版本,如下版本是v3.4,日期为2013年10月22日版本。
3. 增加文件标识符
如果你的系统不支持足够的文件标识符,当使用TCP/TLS模式(译者注:使用UDP模式也一样)进行大并发量呼叫测试可能会遇到问题,可以使用两种方法来突破这种:使用命令行参数-max socket或者改变系统的。至于如何增加文件描述符的最大值,不同的系统修改方法或步骤不同。
在内核为2.4版本的Linux系统上可以通过修改/etc/security/limits.conf and the
/etc/pam.d/login文件来更改,打开/etc/security/limits.conf文件并添加如下内容: * soft nofile 32768 * hard nofile 65535
然后打开/etc/pam.d/login文件并添加如下内容: session required /lib/security/pam_limits.so
然后使用如下命令来永久更改文件描述符所能支持的最大值:
ulimit -s unlimited
注销系统再登录,然后使用ulimit -a命令验证是否更改成功,成功后如下图所示
(open files为设置的值32768了)
三、 使用SIPp
1. 主要特性
sipp允许向远端系统发送一个或多个呼叫,sipp目前只支持从命令行运行。SIPp内置了两个脚本,服务器(UAS)脚本和客户端(UAC)脚本,你也可以创建自己自定义的脚本。可以在同一台设备上同时运行服UAS和UAC脚本以示范SIPp的能力。
首先运行SIPp内嵌的服务器脚本,命令如下: # ./sipp -sn uas -i local_ip
然后在同一台主机上运行SIPp内嵌的客户端脚本,命令如下: # ./sipp -sn uac
2. 集成的脚本(场景)
2.1 示范脚本:主叫(UAC)
脚本文件:uac.xml,流程如下。请点我下载。
2.2 示范脚本:带媒体的UAC
脚本文件:uac_pcap.xml,流程如下。请点我下载。
2.3 示范脚本:被叫(UAS.xml)
流程如下。请点我下载。
2.4 示范脚本:正则表达式,regexp.xml
流程如下。请点我下载。正则表达式的用法后面会介绍。
2.5 示范脚本:分支,branchc.xml和branchs.xml
请点击下载branchc.xml和branchs.xml。这两个脚本是相互配合使用的,一个作主叫,一个作被叫,并且用到了条件分支的功能。
2.6 UAC Out-of-call消息
脚本为ooc_default.xml,请点我下载。
当SIPp作为UAC使用时收到一个out-of-call请求,则可能会用到out-of-call脚本,默认情况下脚本只是简单地回200OK。这个脚本的功能可以被命令行参数-oocsf 或者-oocsn所覆盖。
2.7 3PCC(第三方呼叫控制)
3PCC由rfc3725定义。虽然SIPp的3PCC功能本来是用来实现类似3PCC的情况,但是这个功能也可以用于其它场景,比如当你希望使用sipp来呼叫多方时。
为了保持SIPp的简单,通常情况下,一个SIPp实例(注:实例的概念是,对于一个可执行程序,打开一次就是一个实例,再开另一次又是另一个实例,每个实例会分配到一个HINSTANCE 变量)只能同时与一个远端系统交互,这个也是SIPp不能方便实现3PCC功能的一个原因,以下面的流程1为例说明:其中,要求SIPp作为控制器(Controller)实现3PCC功能。
流程1
用到的脚本文件如下:
脚本文件A: 3pcc-A.xml (original XML file) 脚本文件B: 3pcc-B.xml (original XML file) 脚本文件C-A: 3pcc-C-A.xml (original XML file) 脚本文件C-B: 3pcc-C-B.xml (original XML file)
不过,SIPp提供了3PCC特性,SIPp的3PCC功能允许同时运行的两个SIPp实例同步交互运行,我们还是以流程1为例说明:流程1中的一个sipp实例与远端A交互(这个实例我们称之为3PCC控制器A),另一个sipp实例与远端B交互(我们称之为3PCC控制器B),在SIPp内部看来,实际上的整个流程如下:
大家可能注意到了,在控制器A和控制器B之间需要传递信息,比如由A提供的SDP offer1需要发送给B,反过来也是一样,这个机制在SIPp中由命令和来提供,如: 我们把这个消息发送给另一个SIPp实例,这个消息中传递了呼叫的Call-ID,用同样的方式,我们可以使用正则表达式再提取我们相要提取的内容,在下例中,我们把内容存储在变量2中:
search_in=\"msg\"assign_to=\"2\"/>
接下来我们可以使用上面存储的变量2,如下: ;tag=[call_number] To: sut [peer_tag_param] Call-ID: [call_id] CSeq: 1 ACK Contact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70 Subject: Performance Test [$2] ]]> 总之,sendCmd和recvCmd可以看作是连接两个sipp实例的纽带,通过这个纽带,两个sipp实例之间可以互相传递参数,实现一些复杂的功能。
3. 扩展的3PCC
SIPp扩展的3PCC功能可以让一个SIPp实例与任意多个SIPp实例通信,来实现多个SIPp群呼的场景。此文暂不介绍。
4. 控制SIPp
可以使用按键或者UDP连接加交互地控制SIPp。在运行过程中,SIPp支持使用热键或者一些简单命令来控制,使用到的热键如下: 按键 + - * / c q Q s p 1 2 3 4 5 6-9 作用 以1倍于rate_scale的速率增加呼叫 以1倍于rate_scale的速率减少呼叫 以10倍于rate_scale的速率增加呼叫 以10倍于rate_scale的速率减少呼叫 进入命令控制模式 待所有呼叫完成后退出sipp 立即退出sipp 转储当前状态到日志文件(仅当使用了-trace_screen参数时) 暂停当前工作 显示脚本页面 显示统计页面 显示响应时间分布页面 显示变量页面 显示TDM页面 Display the second through fifth repartition screen. 在命令模式,可以使用单个命令控制SIPp的动作。命令模式比热键更灵活,只不过需要手动输入命令,SIPp提供了如下命令(在运行过程按热键c进入): 命令 dump tasks set rate x set rate-scale x set users x set limit x set hide set index trace 把错误信息转储到日志文件 设置呼叫率 设置呼叫速率步长(rate-scale) 设置同时在线的用户数(仅在指定了参数-users时生效) 设置呼叫速率上限(等同于参数-l) Should the hide XML attribute be respected? 是否显示脚本视图中的索引信息 开启或关闭错误显示,仅对\"error\\"logs\\"messages\and \"shortmessages\"有效。 描述 set display 改变视图,在主脚本页面和ooc脚本页面之间切换 1) 流量控制 SIPp根据脚本指定的内容产生sip流量,你可以控制每秒产生的sip呼叫(calls)个数。如果使用了参数-users,则是指定每秒并发的用户数(users),可以使用下面的方法来调节呼叫速率:
热键(上文已描述) 交互式命令
开数呼叫时指定的参数 有两个命令可用于控制速率,set rate X用于设置当前的呼叫速率为X。另外,set rate-scale X用于设置呼叫速率步长为X,设置步长后,可以使用+,-,*,/快速地控制呼叫速率。另外,在开始运行SIPp时,可以通过如下参数来指定呼叫速率:
-r:指定每秒呼叫的个数
-rp:指定呼叫速率的时间单位(毫秒),默认是1000毫秒(1秒)。通过这个参数
可以指定每m毫秒里有n个呼叫(使用命令-r n -rp m)
2) 远程控制
可以通过一个UDP socket来远程控制SIPp,例如:
可以使用脚本来自动地控制一些动作,比如平滑地增加呼叫速率
被测试的程序通过脚本可以根据负载向SIPp发送命令自动地控制呼叫速率
每一个SIPp实例监听一个UDP socket,监听的端口从8888开始,一直递增到60个,可以使用如下命令控制SIPp:
echo p >/dev/udp/x.y.z.t/8888 -> 暂停SIPp,相当于按p键 echo q >/dev/udp/x.y.z.t/8888 -> 退出SIPp,相当于按q键
echo \"cset rate 100\" >/dev/udp/127.0.0.1/8888 -> 发送set命令
如下是一个比较有用的实例,动态地控制SIPp的呼叫速率:
#!/bin/sh
echo \"*\" >/dev/udp/127.0.0.1/88 sleep 5
echo \"*\" >/dev/udp/127.0.0.1/88 sleep 5
echo \"*\" >/dev/udp/127.0.0.1/88 sleep 5
echo \"*\" >/dev/udp/127.0.0.1/88 sleep 60
echo \"q\" >/dev/udp/127.0.0.1/88
5. 后台运行SIPp
使用命令参数-bg可以将SIPp在后台运行,如果不指定sipp脚本执行的次数,sipp将会一直在后台运行。可以使用kill命令(kill SIPp_PID,kill SIPp进程号)终止SIPp。
6. 创建自定义的XML脚本
虽然SIPp已内置了脚本,但这远远是不够的,所以现在介绍一下如何创建自己的SIPp脚本。SIPp脚本使用XML编写,一个SIPp脚本总是以如下开头:
而且总是以下面语句结束:
开头和结尾很简单,至于中间的写法规则其实也不难,在SIPp的脚本文件中,用于操作SIP消息的命令没有多少个,例如:, , , , , and 等等,详细列表如下: 命令 属性 描述 用例 retrans 仅用于使用udp协议时,:表示每500ms重传输该消息。 定义udp报文重发送时间,遵循rfc3261标准section 17.1.1.2 模拟丢包率 本属性用来记录响应时间,该属性记录本次发送的消息的branch id,以在收到回应时能够精确匹配,若没有此属性则根据Cseq匹配。 本属性用来记录响应时间,该属性与start_txn指定的消息对应,这两个消息必须成对出现,否则报错 :发送的丢包率为10% :存储本次会话(由lost start_txn branch id唯一指定)消息,名称记为“invite” ack_txn :对应上面发送的名为“invite”的会话消息 response 指定SIPp期望收到的SIP:表示SIPp期望收到代码为消息代码,如1xx,2xx,200的消息 3xx等 指定SIPp期望到收的SIP:表示SIPp期望收到ACK请请求消息,如:INVITE,求 ACK,BYE,REGISTER,CANCEL,OPTIONS等。 指定SIPp期望收到的消息是可选的,对端可以回这个期望的消息,也可以没有回这个期望的消息。如果SIPp收到一个消息,SIPp先检查这个消息是否匹配一个标记为optional的消息,如果不匹配则标记为unexpected。 当optional设置为“global”时,SIPp在收到一个消息时会检查脚:表示SIPprequest optional 期望收到代码为100的消息,但如果没有收到也没有关系。 本的全部步骤。 rrs Record Route Set,. 即路由记录设置,如果该属性被设置为“true”则收到的消息中的消息头“Record-Route”会被存储,并可以通过[route]关键词调用。 鉴权认证。如果该属性被设置为“true”则消息中的消息头\"Proxy-Authenticate:\"会被存储并可以用来生成认证用的关键词[authentication]。 lost timeout 模拟丢包率 设置超时,如果期望的消息在指定的时间里面没有收到,除非指定了ontimeout标否,否则呼叫将被终止。 . auth ontimeout 在超时之后跳到指定标号 例:在100s内没有收到消息100则跳到标号5. action 指定当收到指定的消息action的正则表达式实例: 时SIPp需要采取的动作 表示收到响应消息200后,在消息中搜索匹配正则表达式([0-9]{1,3}\\.){3}[0-9]{1,3}:[0-9]*的字符串,并存储在变量1和2中,这个表达式的意义实际上是提取ip地址和端口号。 regexp_match 布尔值。检查收到的请求(Request)是否匹配指定包含的消息,如果匹配则应用正则表达例:检查是否匹配MESSAGE or PUBLISH or SUBSCRIBE requests。 式,这个方法可以用来一次提取多个请求中的字符串,非常方便 response_txn milliseconds 表示这个响应消应是与 :之前开始的(start_txn)表示仅响应以start_txn=\"invite\"发送的消息 对应,通过branch id来匹配 定义暂停的时间,单位:暂停脚本5秒钟 为ms。当没有指定时间时,则使用命令行参数-d来指定。 表示使用哪个呼叫变量来决定该呼叫是否需要暂停 表示使用GSL(GNU科学计算库)决定的呼叫长度来对呼叫进行暂停。如果不用GSL,则可以使用固定值或者指定一个范围。使用高斯分布,则有以下几种统计分布可选:normal, exponential, gamma, lambda, lognormal, negbin, (negative binomial), pareto, 和weibull,在选择哪种分布时,需要指定对应的参数。 :当含有呼叫变量1时暂停 variable distribution 1、不使用GSL时,可以使用以下两种方法来对呼叫进行暂停: ,表示暂停1秒钟 ,表示暂停时间在2秒到5秒钟之间。 2、使用GSL时需要指定参数,参数的命名与Wikipedia中关于分布的描述页面一致。举几例如下: ,提供一个平均偏差为60秒和标准差为15秒的暂停分布值,平均差与标准差的值为毫秒整型值,分布图形如下: ,创建一个分布,该分布是以平均差为12.28和标准差为1为的自然对数,平均差与标准差为双精度型,单位为毫秒,分布图如下: ,创建一个平均值为15分钟的指数分布,分布图如下: ,创建一个威尔布分布。 创建一个帕累托分布。 ,创建一个伽马分布 创建一个负二项分布。 distribution=\"lognormal\" mean=\"10\" sanity_check 完整性检查。默认情况下统计分布暂停都会执行完整性检查以保证暂停值不会超过程序设定的最大值,可以将该值设置为false来禁用这个功能,以提升性能。 不对SIP协议处理,仅用于执行命令 action 例:执行播放声音或视频的命令 用于3PCC dest action 仅用于扩展模式的3方通话 当接收到命令时定义一个动作。 : src id 仅用于3PCC的扩展模式 标号,用于给脚本分支,比如标号13: 属性值id是一个整型 值,最大值是19。 定义时间间隔,用于将响应时间进行分类 :表示响应时间分类为0-10,10-20,20-30和大于30 value variables 定义时间间隔,用于将呼叫时长进行分类 : 定义全局范围里的变量 定义用户范围的变量 抑制未用到的变量,当脚本运行提示有存在未用到的变量时,可以使用该命令来禁用它。 variables variables 综上,用到的命令其实也不多:send, recv, sendCmd, recvCmd, pause, ResponseTimeRepartition, CallLengthRepartition, Globals, User, 和 Reference。这些命令的使用其实也蛮有规律的。比如有些命令在书写时是成对出现的,如 是一对,有些命令在书些时不用成对出现,如。除上面列举的属性是必须按类别使用的外,还有一些是通用属性,所有脚本命令 (i.e., , , , , , and)均可使用,具体如下: 属性 start_rtd 描述 实例 开启一个“响应时间:当这个消息被发送的时候会开启值(Response Time 一个名为“invite”的计时器。可以在统计视图按3,6,7,Duration)”计时器,8察看所定义的计算器 便于统计响应时间 停止五个中的一个“响应时间值”计时器,便于统计响应时间。计时器的个数序号可在运行界面看到,如RTD1,RTD2 重复使用“响应时间值”计时器,便于统计响应时间 :当这个消息被发送的时候会停止2号计时器,rtd 可以在统计视图按3,6,7,8察看所定义的计算器。例如::当这个消息被发送的时候会停止invite计时器 repeat_rtd :名为invite的计时器值会被统计出来,但计时器不会停止 crlf next 在脚本视图中对应的 位置处输出一个空行 在任意命令中使用next属性可以使当前的执行跳到脚本的另一部分,前提是收到了当段脚本定义的消息。 例1:发送ACK后跳到标号为12的脚本 例2:当收到403消息后跳到标号为5的脚本 test 与next一起使用,除了满足next属性的要求外,同时仅当设置了与test相关的变量才能跳到指定脚本段。 例:当设置了变量4时,在发送了ACK消息后跳到标号为6的脚本 chance 与test一起使用,设置后按设定的机率跳到指定脚本。 当condexec中的属性值被设置时执行执行这个元素,具体例子可以参考“6.7 初始场景”部分。 与condexec相反 累加计数器,计算对应参数的执行次数,结果在统计视图中体现出来。 例:设置了变量3后,以90%的机率跳到标号5的脚本 condexec condexec_inverse counter :当该消息发送后,“MsgA”递增1。 6.1 创建客户端(类似UAC)脚本客户端脚本以“send”命令开始,如下:
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port]From: sipp ;tag=[call_number] To: sut Call-ID: [call_id] Cseq: 1 INVITEContact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70
Subject: Performance Test 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”命令内部,必须要将待发送的sip消息括入“”中间,在这中间的所有内容将会被发送到远端系统。同时,你可能也注意到了在这个示例中有一些特殊的关键词,比如: [service],[remote_ip],这些关键词用来指示SIPp将要做什么样的事情,具体可见下表“关键词列表”。 关键词 [service] [remote_ip] [remote_port] [transport] [local_ip] [local_ip_type] [local_port] [len] 默认值 service 5060 UDP 主机本地地址 由系统随机分配 说明 由参数-s传递,一般用来指定单个主被叫 远端设备地址 远端设备端口。可以在脚本中使用偏移量,如[remote_port+3] 指定传输层协议,UDP/TCP,由参数-t决定 可以由参数-i指定 ip版本 可由-p指定,可以在脚本中使用偏移量,如[local_port+3] sdp长度,用于“Content-Length”头域,由sipp自动生成或者手动指定,可以添加偏移量,如[len+3] 呼叫索引,从1开始,每增加一个呼叫递增1 初始值为1,可以使用参数 -base_cseq手动指定初始值。 本地媒体流ip,可以由-mi参数指定 [call_number] [cseq] [media_ip] [media_ip_type] [media_port] [auto_media_port] 本地媒体流ip版本 本地媒体流端口,可由-mp指定,可以设置偏移量[media_port+3] 自动指定媒体流端口,仅用于pcap。该参数使多个呼叫的音频和视频端口从-mp指定的端口开始,并给每个新的呼叫分配端口。SIPp默认支持10000个rtp流并发 此关键词用于从接收的上一个sip消息中提取指定头域(如果存在)的值。比如[last_to]则表示从接收的上一个sip消息中提取To域的消息保存到[last_to]中并应用。 从从外部文件csv加载值,file表示选择从命令行中指定的csv文件的一个文件作为外部文件,line定义选择的外部文件的起始行,field选择字段 把指定的文件中内容全部插入到sip消息中。由于空格符,回车符及换行符不被某些关键词识别,所以插入的文件需要被精确地编辑成你想要的格式才行,否则会有乱码。 当前时间戳,与错误日志的时间戳格式一样 上一个收到的消息 用于插入定义的呼叫变量n 用于认证头(authentication head),这个关键词可以使用参数,书写格式为:[authentication username=myusername password=mypassword],如果没有指定用户名(username),则需使用命令行参数-au或者-s指定;如果没有指定密码(password),则需使用命令行参数-ap指定 指定sipp的pid,即进程号 如果在recv命令中已设置“rrs”属性为true,则“Record-Route”头被存储在关键词[route]中,可使用[routes]调用。 如果在recv命令中已设置“rrs”属性为true,则[next_url]中包含Contact头中的内容 生成一个由(z9hG4bK) + call number + message索引组成的branch id到脚本中。如果你想要使用与之前的消息一样的branch id,你可以使用偏移量指定,如[branch-N] 在脚本中提供消息号 提供接收到的上一个请求消息中的CSeq值,可以使用[cseq+1]来递增该值。 在消息中包含sipp的内部时钟 在消息中包含sipp的版本 在呼叫消息中包含tdm 映射值 使用字符填充消息 [last_*] [field0-n file= line=] [file name=] [timestamp] [last_message] [$n] [authentication] [pid] [routes] [next_url] [branch] [msg_index] [cseq] [clock_tick] [sipp_version] [tdmmap] [fill] [users] [userid] 如果在命令行中指定了-users参数,则这个关键词表示当前已经运行的用户的数量 如果在命令行中指定了-users参数,则这个关键词表示当前正在运行的用户的id(范围为0到users-1)如上,在脚本中我们已经发送了Invite消息,SIPp可以使用“recv”命令等待接收消息。如下:
optional=\"true\"
optional=\"true\"
其中,100和180消息是可选接收的(optional),不过200是强制接收的,在一序列“recv”命令中,必须至少有一个消息是强制接收的,接下来使用SIPp发送ACK。
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port]From: sipp ;tag=[call_number] To: sut [peer_tag_param] Call-ID: [call_id] Cseq: 1 ACKContact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70 Subject: Performance Test Content-Length: 0 ]]>
我们也可以在这里插入一个暂停,如下,脚本会暂停5秒钟。
然后通过发送一个Bye消息并期望接收一个200ok来结束此次呼叫:
BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port]From: sipp ;tag=[call_number]To: sut [peer_tag_param] Call-ID: [call_id] Cseq: 2 BYEContact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70 Subject: Performance Test Content-Length: 0 ]]>
然后结速这个脚本
通过以上例子可以看出创建自己的SIPp脚本也并不是很难的,如果你想看其它例子,你可以在命令行使用参数-sd查看SIPp内嵌的脚本。
6.2 创建服务端(类似UAS)脚本
脚务端脚本以“recv”命令开始,语法规则和可用命令跟客户端脚本的是一样的,不过在服务端脚本中会用到很多的[last_*]关键词,举个例子如下:
SIP/2.0 180 Ringing [last_Via:] [last_From:][last_To:];tag=[call_number] [last_Call-ID:] [last_CSeq:]
Contact: Content-Length: 0 ]]>
在这个脚本中是准备回复180消息,而且该180消息中的一些内容是从上一个接收的invite中提取出来的。
6.3 动作(Actions)
在一个“recv”或者“recvCmd”命令中,可以执行一些动作,目前支持如下动作: 正则表达式(ereg) 记录日志(log)
执行外部命令(如系统命令),内部命令,以及播放pcap文件(exec) 执行双精度变量算术运算 给变量赋字符串值 比较双精度变量 跳到脚本的指定索引 在csv文件中查找指定词 鉴权
改变一个呼叫的网络地址
1) 正则表达式
在SIPp中使用正则表达式可以实现如下功能:
提取SIP消息中的内容并存储到变量中以在后续中用到 检查SIP消息中的某些内容是否满足要求
SIPp中的正则表达式满足PSIX 1003.2规范,如果你想学习如何写表达式,可以参考此正则表达式教程,请点击我,下面是正则表达式动作的一些语法: 关键词 regexp 默认值 - 描述 用于使用正则表达式匹配接收到的消息头或者消息体。例: 在消息头的头域Contact:中查询所有并分配给变量6。“.*”用于代表所有字符串。 search_in msg 有四个值: msg:匹配整个消息(匹配后可以再拆分),比如如果从消息From: ;tag=39f-29ee138中做正则表达式为ereg regexp=\";.*进行匹配,则可以匹配为三部分。 hdr:匹配消息头(消息头匹配后不能再拆分),比如如果消息头为From: ;tag=39f-29ee138,正则表达式为ereg regexp=\";.*,此时匹配的结果只有一个,就是整个From头。 body:匹配消息体 var:匹配SIPp字符串变量。 匹配头域,仅在search_in被设置为hdr时使用 匹配变量,仅在search_in被设置为var时使用 To look for a header ignoring case . Only used when the search_in tag is set to hdr. header variable case_indep - - false occurence start_line check_it 1 false false 查找头域第几次出现,默认为1,,仅在search_in被设置为hdr时使用 仅查找起始行,仅在search_in被设置为hdr时使用 设置为真时,如果不匹配则置此次呼叫为失败,不能同check_it_inverse同时使用 与check_it相反,当设置为真时,如果匹配则置呼叫为失败 将匹配的结果存储到指定单个变量或几个变量,使用$[n]引用变量,可以将变量$[n]的内容应用于sip消息或者用于编写sipp条件分支脚本。在分配的几个变量中,第一个变量包含整个正则表达式的内容,接下来的其它变量依次匹配各子正则表达式,例: check_it_inverse false assign_to - 如果sip消息包含有如下行: o=user1 53655765 2353687637 IN IP4 127.0.0.1 那么变量3,4,5,8分别为: o=user1 53655765 2353687637 user1 53655765 2353687637特别提示一下:在同一个动作(action)中可以同时使用多个正个表达式。举例说明如下:
第一个动作(First action):
提取接收到的sip消息中的第一个ipv4地址 检查我们是否能够成功提取该ip地址 将该ip地址赋给呼叫变量1和2 第二个动作(Second action):
提取接收到的消息的Contact头 将提取的contact头分配给变量6
2) 记录日志
log动作(action)可以记录自定义的日志,记录的消息保存在“脚本名_进程号.log”文
件中,所有关键词都可以应用于日志动作中以用来反馈我们想要看到的消息或日志。注意:只有在打开日志跟踪开关-trace_logs时才能产生日志。
例:
还可以使用另一个动作“warning”来记录sipp的错误日志消息,如下:
3) 执行命令
动作“exec”可以用来执行内部命令,外部命令,或者播放音频或视频(命令\"play_pcap_audio\" 和 \"play_pcap_video\")。
内部命令:
内部命令“int_cmd”有三个属性:stop_call,stop_gracefully(类似于按q键),stop_now(类似于使用ctrl+C强制退出sipp)。举个收到603后停止执行脚本的例子:
外部命令
使用外部命令“command”的属性可以执行当前主机的shell可执行的任意命令。举个回显收到了invite消息的例子:
> from_list.log\"/>
媒体命令 命令“rtp_stream”可以将内嵌的编码为PCMA,PCMU或者g729的音频文件(如a.wav)转为流媒体向对端发送。动作“rtp_stream”的用法如下:
,流传输文件file.wav,假设该文件是pcma格式的 ,流传输文件名为
[filename]的文件,重放[loopcount]次,默认是1次,如果设置为-1则一直循环播放,[payloadtype]告诉SIPp当前音频的负载类型(PCMA为8,PCMU为0,G729为18)。 ,暂停当前的流媒体 ,继续被暂停的流媒体
命令“pcap_play”允许sipp发送预先录制好的RTP流媒体,共有play_pcap_audio /
play_pcap_video两个属性。如果选择play_pcap_audio,则在SIP/SDP中使用“m=audio”,play_pcap_video则为“m=video”,命令用法如下:
4) 变量操作
SIPp的呼叫变量支持使用双精度浮点型,可以使用SIPp的动作来对由参数“assign_to”指定的值进行修改,目前支持的动作有:assign,sample和todouble。assign动作能将双精度值存储在“value”参数中;sample动作基于上文提到的统计分布,使用到的参数也跟统计分布一样;todouble命令将assign_to的值翻倍再引用。举例如下:
可以使用SIPp对呼叫变量执行加减乘除操作,举例如下:
做算术操作时还可以使用变量,如下:
5) 字符串变量
可以使用命令创建字符串变量,该命令有两个参数“assign_to”和“value”,例:
还可以对自符串进行比较,命令为,其对字符串比较的值是一个小于,等于,或大于0的双精度整型值。例:
6) 变量测试
变量测试功能可以用来灵活控制脚本的运行。变量测试的动作命令为“test”,含有四个参数:variable,value,assign_to,compare。variable是value和assig_to比较后的结果,variable是一个布尔值。test的比较支持6种操作,分别为:
equal, not_equal, greater_than, less_than,greater_than_equal, 或 less_than_equal。 例:如果$1比10小则设置$2为真
7) 查找
动作查找lookup主要用来可索引的注入文件,lookup需要一个外部文件作为输入并输出一个行号(可使用命令-infindex users.csv 0对文件user.csv输出从0开始的行号),如下是一个从认证头(authorization header)中提取用户名并根据这个用户名找到user.csv文件中对应该用户名的行号的一个例子:
8) 跳到一个索引
可以使用jump动作跳到一个指定索引,该功能可以用于编辑一些程序化的脚本。主叫可以使用[msg_index]来保存他们的索引,被叫可以使用jump动作跳回一个索引。当脚本中含有一个名为“_unexp.main”的标号时,SIPp在任意时间如果收到了一个unexpected消息
将会跳到这一个标号,并且存储错误之前的地址到变量“_unexp.retaddr”。
跳到名为_unexp.retaddr的变量:
9) 获得当前时间
动作gettimeofday允许sipp获取“新纪元时间(unix epoch)”,可以使用秒与毫秒。
10) 改变目标IP地址
动作setdest允许改变呼叫的目标ip地址。
regexp=\"sip:.*@([0-9A-Za-z\\.]+):([0-9]+);transport=([A-Z]+)\"search_in=\"var\"
check_it=\"true\"
assign_to=\"dummy,host,port,transport\" variable=\"url\" />
11) 鉴权
动作verifyauth允许根据提供的用户名和密码对接受到的消息中的认证头进行检查,检查的结果存储在一个布尔变量中,该功能可以用来模拟验证鉴权的情况。目前只支持MD5摘要加密算法,在使用verifyauth之前必须发送一个挑战。举例如下:
SIP/2.0 401 Authorization Required [last_Via:] [last_From:][last_To:];tag=[pid]SIPpTag01[call_number] [last_Call-ID:] [last_CSeq:]
Contact: WWW-Authenticate: Digest realm=\"test.example.com\ Content-Length: [len] ]]>
在接收到第二个请求之后,可以将消息中提取出来的用户名与外部文件的用户名和密码作比较,然后根据结果采取接下来的动作:
regexp=\"Digest
.*username=\\\"([^\\\"]*)\\\"\"
search_in=\"hdr\"
header=\"Authorization:\"
注:外部文件users.conf需使用命令-inf users.conf -infindex users.conf 0引入
6.4 变量
对于复杂的脚本,需要使用变量,之前的版本仅支持数字类型的变量,此版本可以支持字符类型的变量,所以在使用变量时,可以使用有意义的名词来作为变量名。SIPp的变量也有生效范围,全局变量对所有呼叫生效,默认的变量仅对单个呼叫生效。全局变量一般用于存储脚本参数或者作为一个计数器。与-user参数结合的用户变量允许在多个呼叫之中保存其状态,全局变量和用户变量可以使用如下方法声明:
1) 从外部CSV文件引入变量
可以在命令行使用“-inf 文件名”参数来引入变量到脚本中。文件的第一行须申明变量的读取方式是顺序读取(SEQUENTIAL)还是随机读取(RANDOM)还是基于用户的方式读取(USER)。每一行对应一个呼叫,使用“;”分隔符分隔每一项数据,分开的项在脚本中作为变量名[filed0],[field1],„„[fieldn]来引用。例如:
SEQUENTIAL
#This line will be ignored Sarah;sipphone32 Bob;sipphone12 #This line too
Fred;sipphone94
该文件中的行会被按顺序读取,第一个呼叫第一行,第二个呼叫第二行。在脚本中的任何地方只要出现了关键词[field0],根据第几个呼叫决定,这个关键词就会被替换为Sarah或者Bob或者Fred,[field1]也是类似。如果达到了文件末尾则再重新开始,一直循环,文件的大小没有。
另外可以使用参数不从第一行开始,例如第从第二行开始:
[field0 line=1]
上面的例子用图片说明一下,以加深理解。
另外,还可以使用不止一个外部文件来引入变量,这在测试一些场景是很有用的,比如你要做一个测试主叫号码是按顺序的但是被叫是随机的时候,你就可以用一个第一行为顺序的caller.csv文件和一个第一行为随机的callee.csv文件来实现了。
INVITE sip:[field0 file=\"callee.csv\"] SIP/2.0
From: sipp user <[field0 file=\"caller.csv\"]>;tag=[pid]SIPpTag00[call_number] To: sut user <[field0 file=\"callee.csv\"]>
2) 格式化输出的引用文件
一个扩展的标准外部文件是“PRINTF”文件。通常情况下,一个SIPp的外部文件是含有一些重复内容的,比如:
USERS
user000;password000 user001;password001 ...
user999;password999
如果要做一个这样的文件比较麻烦,SIPp有一套机制可以自动在内存中生成一套比较有规律格式的文件,这样既方便又能减少读取大文件的时间,例如上面的那些内容可以如下简单表示:
USERS,PRINTF=999
user%03d;password%03d
当模板文前不止含有一行内容时,如:
USERS,PRINTF=4
user%03d;password%03d;Foo user%03d;password%03d;Bar
SIPp能够将模板文件自动循环,其相当于:
USERS
user000;password000;Foo user001;password001;Bar user002;password002;Foo user003;password003;Bar
3) PRINTF引入文件的参数 参数 PRINTF 描述 文件包含多少行 举例 PRINTF=10,创建10行 PRINTF=10,PRINTFMULTIPLE=2 表示创建10行,号码依次为0,2,4,„„,18 PRINTF=10,PRINTFOFFSET=100 表示创建10行,号码依次为100-109. PRINTF=10,PRINTFMULTIPLE=2,PRINTFOFFSET=10 表示创建10行,号码依次为10,12,14,„„28. 4) 索引注入的文件
参数-infindex允许对引入的文件生成索引,-infindex的参数是将要被索引的文件的文件名。假如文件user.csv的内容如下:
USERS
alice,pass_A bob,pass_B carol,pass_C
PRINTFMULTIPLE 设置行增长的步长 PRINTOFFSET 设置生成数的起始值 如果想提取第一行,则为-infindex users.csv 0。
6.5 条件分支
1) 条件分支脚本
在SIPp中可以非线性地执行一个脚本,你可以在检测到一个既定事件后从脚本的一个部分跳到脚本的另一个部分。这个功能使用标号实现:在脚本中定义一个标号如,其中n是1-19之间的数,每个标号则表示一部分。然后在任意一个动作命令之后添加一个next=”n”的参数,当脚本执行完这个动作后就会跳到指定标号处继续往下执行。另外,如果在next参数后再添加一个test=”m”参数,脚本仅在变量[$m]有值时才会跳到指定标号,这个特性可以用来实现某些特殊要求。
2) 条件分支脚本中的随机执行
为了使用SIPp的行为更类似人工呼叫,可以使用SIPp来编写“概率分支(statistical branching)”脚本,这个功能使用属性“chance”(例如chance=”0.90”)来实现,chance表示以chance所定义的机率来执行脚本。
6.6 SIP认证
SIPp支持两种SIP认证:Digest/MD5(“algorithm=”MD5””)和Digest/AKA(“algorithm=“AKAv1-MD5””。启用认证很简单,当收到401或407消息时,在命令中添加auth=”true”就行了,然后可以使用[authentication]关键词来进行认证了。SIPp通过使用[authentication]关键词来计算认证消息,根据加密算法的不同,authentication关键词的参数也不相同: Digest/MD5(例: [authentication username=joe password=schmo])
username: username:如果没有指定用户名,则使用命令行参数 '-au'
(authentication username) or '-s' (service) 指定。
password: password: 如果没有指定密码,则使用命令行参数 '-ap'
(authentication password) 指定
Digest/AKA: (例如: [authentication username=HappyFeet
aka_OP=0xCDC202D5123E20F62B6D676AC72CB318
aka_K=0x465B5CE8B199B49FAA5F0A2EE238A6BC aka_AMF=0xB9B9])
username: username: 如果没有指定用户名,则使用命令行参数 '-au'
(authentication username) or '-s' (service) 指定。
aka_K: Permanent secret key. If no aka_K is provided, the \"password\" attributed is
used as aka_K.
aka_OP: OPerator variant key
aka_AMF: Authentication Management Field (indicates the algorithm and key in
use)
假如你想针对不同的呼叫使用不同的认证,可以使用CSV文件如:
SEQUENTIAL
User0001;[authentication username=joe password=schmo] User0002;[authentication username=john password=smith] User0003;[authentication username=betty password=boop]
然后XML脚本文件如下([field1]会被auth替换)
REGISTER sip:[remote_ip] SIP/2.0Via: SIP/2.0/[transport] [local_ip]:[local_port] To: From: Contact: ;transport=[transport] [field1] Expires: 300 Call-ID: [call_id] CSeq: 2 REGISTER Content-Length: 0 ]]>
例如:
Example:
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port]From: sipp ;tag=[call_number] To: sut [peer_tag_param] Call-ID: [call_id] CSeq: 1 ACKContact: sip:sipp@[local_ip]:[local_port] Max-Forwards: 70 Subject: Performance Test Content-Length: 0 ]]>
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port]From: sipp ;tag=[call_number] To: sut Call-ID: [call_id] CSeq: 2 INVITEContact: sip:sipp@[local_ip]:[local_port] [authentication username=foouser] Max-Forwards: 70 Subject: Performance Test 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
]]>
6.7 初始场景
一些特殊的复杂的脚本可能需要在脚本刚开始运行时设置一些全局变量,SIPp的初始场景(initialization stanza)功能可以实现这个功能。创建初始场景的方法很简单,只要在命令和 和之间插入一些和命令就行了。在初始场景中的变量,仅用于全局变量,并不会应用于呼叫。举个例子,下面的初始场影功能为如果变量$THINKTIME没有设置值,则将该变量的值设置为1:
该功能可以配合命令行参数-set来使用以使用复杂的功能。
7. 运行界面
SIPp含有多个监控界面,在运行过程中按1-9键进行切换。 键1:脚本视图,显示脚本的流程和一些重要的信息
键2,统计视图,显示主要的统计信息,使用-f参数可以调整刷频率
键3:区间视图,显示响应时间和呼叫长度的分布区间
键4,变量视图,显示变量信息
8. 传输层模式
SIPp含有多个传输层模式,其默认模式为“UDP mono socket”模式
1) UDP mono socket
在UDP mono socket模式中(命令行参数-t u1),仅打开一个IP/UDP socket与远端系统进行通信,所有呼叫均使用这个套接字,这个模式一般用来模拟两个2个sip服务器的场景。
2) UDP multi socket
在UDP multi socket模式中(命令行参数-t un),SIPp为每个新的呼叫分配一个IP/UDP socket。这个模式一般被用来模拟多个UA来呼叫一个sip服务器。
3) UDP 每socket每IP
在UDP 每socket每IP模式中(命令行参数-t ui),对于inf文件中给定的每个IP地址均会分别打开一个UDP/IP socket。在使用参数-t ui后,还必须指定inf文件中用到的用来表示ip地址的field(用命令行参数“ip_field x”来指定),这种模式需分两种情况讨论:
客户端侧:使用-t ui参数后,SIPp会对发起的每个呼叫使用不同的ip地址,ip地
址为inf文件指定,用来替代脚本中的[local_ip]
服务端侧:使用-t ui参数后,服务端会监听本地所有ip地址,所以需将脚本中的
[local_ip]替换成[server_ip]
该模式一般用来每用户每个ip地址的场景。
4) TCP mono socket
参数为-t t1,类似UDP mono 5) TCP multi socke
参数为-t un,类似UDP multi
6) 其余TLS,SCTP均支持mono socket和multi socket模式,用法类似。
9. 统计
1) 响应时间统计
SIPp提供了一套机制来收集并统计响应时间。每一个响应时间在两个SIPp命令(send,recv或者nop)之间进行计算。可以使用start_rtd开启一个计时器并使用rtd结束它。在SIPp运行界面可以按3,6,7,8或9来查看计时器的值,另外还可以使用-trace_stat命令来将统计结果保存到CSV文件中。
2) 可用的计时器
参数-trace_stat转储所有统计信息到文件“脚本名_进程号.csv”中,可用的统计类型如下:
StartTime:脚本开始运行的时间日期
LastResetTime: Date and time when periodic counters where last reseted. CurrentTime:当前统计的日期和时间 ElapsTime:已运行的时间 CallRate:呼叫速率,每秒 IncomingCall:呼入的呼叫数量 OutcomingCall:呼出的呼叫数量
TotalCallCreated:总共生成的呼叫个数 CurrentCall:正在进行的呼叫 SuccessfulCall:成功的呼叫
FailedCall:失败的呼叫
FailedCannotSendMessage:不能发送消息的呼叫(传输层问题) FailedMaxUDPRetrans:重试达到最大次数导致的失败呼叫 FailedUnexpectedMessage:未如脚本所料的错误呼叫 FailedRegexpDoesntMatch:由于正则表达式应该匹配而没有匹配而造成失败的呼叫 FailedRegexpShouldntMatch:由于正则表达式不应该匹配而匹配造成失败的呼叫 FailedRegexpHdrNotFound:由于正则表达式没有找到匹配项导致的失败的呼叫 FailedOutboundCongestion:由于TCP拥塞而导致失败的呼叫 FailedTimeoutOnRecv:由于接收超时而导致失败的呼叫 FailedTimeoutOnSend:由于发送超时而导致失败的呼叫 OutOfCallMsgs:不能与存在的呼叫匹配的消息个数 Retransmissions:重传输的个数
AutoAnswered:自动应答并回复200ok的消息的个数 3) 详细消息统计
使用命令行参数-trace_option可对发送或接收的消息的个数进行保存。
10. 错误处理
1) 未预料的消息
当SIPp收到一个sip消息能与现存的呼叫进行匹配(通过call-id)但是不是脚本所
预料的(unexpected)消息,如果没有收到200ok消息或者发送了bye但没有收到200ok,那么sipp会发送一个cancel并记此次呼叫为失败(failed);如果收到的是4XX或5XX消息,SIPp会发送一个ACK消息并记录此次呼叫为失败
如果收到的一个sip消息不能与现存的呼叫进行匹配,那么sipp会发送bye消息,
这个呼叫不会记为失败 非sip消息sipp会直接丢弃 2) 重传输机制(仅UDP)
sipp的重传输机制符合rfc3261标准(标准请参见rfc3261,17.1.1.2)
11. 日志功能
在运行过程,SIPp提供了多种方法记录日志。 -trace_msg命令 -trace_shortmsg
-trace_err:追踪错误消息 -trace_error_codes -trace_counts
另外,可以使用-ringbuffer_size命令日志文件大小。
在线帮助:使用sipp -h可查看,翻译如下: 参数名称 描述 脚本文件参数 -sd -sf -oocsf -oocsn -sn 导出内嵌的脚本文件 加载自定义的脚本XML格式 加载out-of-call脚本 加载out-of-call脚本 使用默认(内置)脚本,如果不指定参数,则默认是uac,可用的参数如下: uac:标准uac uas:简单uas regexp:带正则表达式的uac branchc: brahchs: 3pcc-C-A: 3pcc-C-B: 3pcc-B: 3pcc-A: 设置传输层模式: u1:udp mono,默认 un:udp multi ui:udp每个呼叫每个ip t1:tcp mono tn:tcp multi c1:u1的压缩模式 cn:un的压缩模式 设置本地ip地址,用于指定'Contact:','Via:', and 'From:'的地址 指定本地端口 绑定socket到本地地址 设置本地控制ip地址,用于远程控制 设置本地控制端口,默认是8888 最大的并发socket个数 设置最大的重连接次数 是否关闭呼叫在重连接时 在关闭和重连接之间的等待时间(ms) 指定远端主机地址和端口用于发送消息 显示版本号 在后台运行sipp 禁用标准输入 加载一个插件 在开始运行时休眠多少秒 设置发送和接收缓冲区大小 IP,端口和协议参数 -t -i -p -bind_local -ci -cp -max_socket -max_reconnect -reconnect_close -reconnect_sleep -rsa SIPp功能参数 -v -bg -nostdin -plugin -sleep -skip_rlimit -buff_size -sendbuffer_warn -lost -key -set -tdmmap -dynamicStart -dynamicMax -dynamicStep SIPp呼叫行为参数 -aa -base_cseq -cid_str 在发送缓冲区有错时只提示告警而不是报错 设置默认的丢包率。脚本中定义的值优先级更高 关键词的值,设置通用参数名为“keyword”的值为“value” 设置变量的值,设置变量名为“variable”的值为“value” 生成并处理TDM电路表(貌似是实现路由表功能),格式为-temmap {0-3} {99} {5-8} {1-31} 变量值,设置动态id变量 dynamic_id的起始值 dynamic_id的最大值 dynamic_id的增长步长 使能SIPp对INFO, UPDATE and NOTIFY自动回200ok 设置起始cseq值,默信为1 设定call-id格式,默认为:%u-%p@%s,其中%u=call_number, %s=ip_address, %p=process_number, %%=% 控制呼叫长度,为脚本中 指定值 设置一个call-id的保持时间 强制使用uri的值来作为鉴权参数,默认情况下,uri由remote_ip:remote_port组成。 设置用于认证的用户名,默认由-s指定 设置用于认证的密码,默认是password 设置请求uri中的用户名部分,默认是service 设置SIpp的默认行为,可能的值为: all:使用所有默认行为能力 none:不使用任何行为 bye:对中止的呼叫发送bye abortunexp:在收到unexpected消息时中止呼叫 pingreply:对ping请求回应。 可以叠加使用,如all,-bye no default,禁用默认行为,具体将禁用以下行为: udp重传输超时后发送bye或者cancel 对于unexpected的cancel发送200ok 对unexpected的bye发送200ok 对unexpected的PING消息发送200ok 对于任意的unexpected的消息发送bye或者cance并终止呼叫。 忽略在脚本中定义的暂时时间内收到的消息 -d -deadcall_wait -auth_uri -au -ap -s -default_behaviors -nd -pause_msg_ign 注入文件(Injection file)选项 -inf 在呼叫过程中,从一个外部CSV文件引入值到脚本中去。文件的第一行表明数据的读取顺序。 -infindex -ip_field 根据文件中的字段(field)来创建索引。例如:-inf users.csv -infindex users.csv 0表示根据第一个键值来创建索引。 设置从注入文件中哪个字段读取ip地址 RTP选项 -mi -rtp_echo -mb -mp -min_rtp_port -max_rtp_port -rtp_threadtasks -rtp_buffsize 呼叫速率选项 -r -rp -rate_scale -rate_increase 设置呼叫速率(设置多少个呼叫每秒) 设置呼叫速率的周期,默认是1000毫秒。例如-r 7 -rp 2000表示2秒中7个呼叫 控制按键+-*/的变化跨度 控制每单位时间后呼叫的增长速率。这个功能允许周期地递增呼叫速率,例如-rate_increase 10 -fd 10s表示呼叫速率每10秒增加10个 如果指定了-rate_increase,则这个参数表示当速率达到该值时不再增加 如果设置了-rate_increase,当达到了最大速率时不退出sipp 设置最大的并发呼叫量 设置最本最大的呼叫个数,当sipp达到该指定值会自动退出 指定同时进行的呼叫个数 全局参数,指定消息接收的超时时间,单位为毫秒 全局参数,指定消息发送的超时时间,单位为毫秒 Sipp在设置的时间后退出 指定最大的重传次数 指定invite消息最大的重传输次数 设置本地媒体的地址,默认为主ip地址 启用rtp回送功能。将由-mp参数指定的端口收到的rtp流回送给原发送者。 设置rtp回送buffer大小,默认为2048 设置本地rtp回送地址,默认为6000 rtp端口范围最小值 rtp端口范围最大值 每线程的rtp 设置rtp socket的发送和接收buffer大小 -rate_max -no_rate_quit -l -m -users 重传输与超时选项 -recv_timeout -send_timeout -timeout -max_retrans -max_invite_retrans -max_non_invite_retrans 指定非invite消息最大的重传输次数 -nr 禁用重传输功能 -rtcheck -T2 三方呼叫控制选项 -3pcc -master -slave -slave_cfg 性能和软件狗选项 -timer_resol 设置计时器精确度,默认为毫秒。这个选项影响统计的精确度。较小的值能够提高精确度但是会消耗更多的cpu,默认为10ms 使用3pcc模式 指定重传输检测模式,默认为full,还有loose可供选择 全局设置T2定时器 -max_recv_loops -max_sched_loops -watchdog_interval -watchdog_reset 设置每一个循环可接收的最大消息数。提高这个值可用来测试更大的话务量,默认是1000 设置每个循环(loop)最大的呼叫数量,提高这个值可用来测试更大的话务量,默认是1000 设置软件狗检查的间隔,默认为400秒 如果在此参数设定的时间内,sipp的软件狗还没有被触发过,则复位最大的触发计数器,默认是10发钟 消息跟踪、日志记录和测试统计选项 -f 设置在屏幕上的统计报告频率,默认为1秒 -trace_stat 转储所有统计记录到文件名为“脚本名称_进程号.csv”文件中,可以使用命令行参数“-h stat”差看统计文件中各列内容的详细描述 设置统计文件的分隔符 设置统计文件的文件名 设置转储的统计文件的更新(写入)频率,默认是60秒 每更新一次统计文件复位区间计时器 将发送和接收的sip消息保存在消息日志文件__messages.log中 设置消息日志文件的文件名 覆盖消息日志文件,默认覆盖 以短格式记录接收和发送的sip消息,并保存在文件中 设置短消息格式文件的文件名 覆盖短消息日志文件 存储自定义的消息计数到csv文件中 跟踪并记录所有意外的消息到错误日志文件__errors.log中 设置错误日志文件的文件名 记录未预料的sip消息的响应代码到日志文件中 保存被非法中断的呼叫的调试消息到日志中 保存退出sipp时的最后的统计屏幕到日志中 跟踪并保存所有响应时间到日志文件中 设置保存响应时间到日志文件的频率,默认是200个呼叫保存一次 跟踪日志动作(log action)到日志文件中 设置循环保存的日志文件的个数的最大值 设置保存的日志文件的大小的最大值 设置所有保存的日志文件的个数的上限 -stat_delimiter -stf -fd -peridoic_rtd -trace_msg -message_file -message_overwrite -trace_shortmsg -shortmessage_file -shortmessage_overwrite -trace_counts -trace_err -error_file -trace_error_codes -trace_calldebug -trace_screen -trace_rtt -rtt_freq -trace_logs -ringbuffer_files -ringbuffer_size -max_log_size 12. 使用SIPp做性能测试12.1 使用SIPp做性能测试的建议
SIPp本身就是被设计用来做性能测试,通常情况下能够满足中等并发中等呼叫速率的测试场景。如果测试时满足下列条件,则可以用SIPp来测试高并发、高呼叫速率的场景:
使用Linux系统来达到高并发。Windows版本(使用CYGWIN)性能不够高
尽量不使用消息跟踪功能,消息跟踪(如-trace_msg, -trace_logs等)仅用于调试而
不是性能测试
理解SIPp的内部调度机制,并使用命令行参数-timer_resol, -max_recv_loops和
-max_sched_loops来调整SIPp,使其运行在最佳状态。
12.2 SIPp内部调度机制
SIPp使用单线程、event-loop架构,该架构使它能够处理很高的SIP消息流量。Sipp的event loop跟踪各种任务,大部分任务便是脚本中定义的呼叫;另外一些是特殊的任务:屏幕刷新任务,统计更新任务,新呼叫任务和软件狗任务。SIPp的主执行loop由以下构成:
唤醒已经过期的任务
运行任务直到达到max_sched_loop最大值 轮流处理每一个socket,从各个socket中读取不超过max_recv_loops指定个数的消
息
SIPp持续地执行loop直到遇到让它停止执行的条件,如运行过程中按q键,或达到最大的呼叫量等等
几个可以对sipp的性能进行微调的命令行参数如下: 定时器精确度(timer_resol):默认的定时器精确度是1ms,这也是sipp所能支持
的最高的精确度,如果调大了精确度会导致SIPp处理不过来
max_recv_loops和max_sched_loops:max_recv_loops是sipp在单位时间内所能读
取的最大消息量,max_sched_loops是单位时间内所能处理的最大呼叫量,在呼叫量很大的测试时可以调大这两个值,不过要注意,调大这两个值后会对cpu的占用带来较大的影响 watchdog_interval, watchdog_minor_threshold, watchdog_major_threshold,
watchdog_minor_maxtriggers, and watchdog_major_maxtriggers:watchdog是用来监
视sipp是否已经挂死的,可以适当调大这些值
参考资料:SIPp官方文档 翻译:****************
2014年2月16日