mean="900000"/
用于非协议消息处理的命令执行,常用参数包括
action:
执行命令动作
用于两个SIPp实例间的交互发送,常用于3PCC场景,常用参数包括
[CDATA[]]>:
用于3PCC场景的参数传递
dest:
仅用于扩展模式3PCC
[CDATA[
Call-ID:
[call_id]
[$1]
]]>
用于两个SIPp实例间的交互接收,常用于3PCC场景,常用参数包括
action:
接收到命令时的执行命令动作
src:
仅用于扩展模式3PCC
.*"
search_in="msg"
assign_to="2"/>
通用属性:
属性名
描述
示例
start_rtd
启动响应定时器
rtd
停止响应定时器
repeat_rtd
重复启用响应定时器
crlf
运行界面增加回车换行
next
跳转任意label
test
与next一起使用,设置跳转条件
chance
与test、next一起使用,当test结果有值时,则概率跳转
counter
计数器累加1
3.3.正则表达式
正则表达式作为sipp中极为重要的功能,在各个场景下应用广泛,最常见的是通过正则表达式,获取接收消息中某个参数,并将该参数赋给变量,用于后续流程的使用。
正则表达式的使用语法如下图所示:
正则表达式的命令为
regexp属性为需要匹配的表达式内容,其中使用”()”包括起来的部分,为匹配项,可以赋给变量;
search_in属性为设置本次查询的方式,sipp支持3种正则匹配的方式,分别为:
1.头域查询匹配
当search_in=”hdr”时,表示正则按照头域匹配,必须包含header参数,给出需要查询的头域名称,如header=”From”。
sipp会在指定的头域中进行匹配。
注:
start-line的匹配也是用头域匹配方式。
2.消息查询匹配
当search_in=”msg”时,表示正则根据整个消息内容进行匹配,通常在需要匹配SDP内容时会用到。
3.变量查询匹配
当search_in”var”时,表示正则按照变量进行匹配,必须配置variable参数,给出需要匹配的变量名称,如variable=”header_to_tag”。
4.变量与关键字
4.1.关键字的使用
sipp中定义了大量的关键字,涉及到网络参数、sip会话参数和媒体参数等等,需要在编写脚本时加以注意。
关键字的引用格式为[keyword],例如[locao_ip]、[call_id]等。
下表列出了常用的关键字:
关键字
描述
备注
[service]
由参数-s传递,一般用来指定单个主被叫
[remote_ip]
远端设备地址
[remote_port]
远端设备端口。
可以在脚本中使用偏移量,如[remote_port+3]
[transport]
指定传输层协议,UDP/TCP,由参数-t决定
[local_ip]
主机本地地址,可以由参数-i指定
[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_port]
本地媒体流端口,可由-mp指定,可以设置偏移量[media_port+3]
[auto_media_port]
自动指定媒体流端口,仅用于pcap。
该参数使多个呼叫的音频和视频端口从-mp指定的端口开始,并给每个新的呼叫分配端口。
SIPp默认支持10000个rtp流并发
[last_*]
此关键字用于从接收的上一个sip消息中提取指定头域(如果存在)的值。
比如[last_to]则表示从接收的上一个sip消息中提取To域的消息保存到[last_to]中并应用。
[field0-n
file=
line=]
从外部文件csv加载值,file表示选择从命令行中指定的csv文件的一个文件作为外部文件;line定义选择的外部文件的起始行,field选择字段[filename=]把指定的文件中内容全部插入到sip消息中。
由于空格符,回车符及换行符不被某些关键字识别,所以插入的文件需要被精确地编辑成你想要的格式才行,否则会有乱码。
[timestamp]
当前时间戳,与错误日志的时间戳格式一样
[last_message]
上一个收到的消息
[authentication]
用于认证头(authenticationhead),这个关键字可以使用参数,书写格式为:
[authenticationusername=myusernamepassword=mypassword],如果没有指定用户名(username),则需使用命令行参数-au或者-s指定;如果没有指定密码(password),则需使用命令行参数-ap指定
[pid]
指定sipp的pid,即进程号
[routes]
如果在recv命令中已设置“rrs”属性为true,则“Record-Route”头被存储在关键字[route]中,可使用[routes]调用。
[next_url]
如果在recv命令中已设置“rrs”属性为true,则[next_url]中包含Contact头中的内容
[branch]
生成一个由(z9hG4bK)+callnumber+message索引组成的branchid到脚本中。
如果你想要使用与之前的消息一样的branchid,你可以使用偏移量指定,如[branch-N]
[msg_index]
在脚本中提供消息号
[clock_tick]
在消息中包含sipp的内部时钟
[sipp_version]
在消息中包含sipp的版本
[fill]
使用字符填充消息
[users]
如果在命令行中指定了-users参数,则这个关键字表示当前已经运行的用户的数量
[userid]
如果在命令行中指定了-users参数,则这个关键字表示当前正在运行的用户的id(范围为0到users-1)
4.2.变量定义与使用
sipp的脚本中,支持双精度浮点型变量和字符串变量两种变量类型.
1.浮点型变量
针对浮点型变量的操作命令主要有assgin(赋值)、sample(统计分布)和todouble(强制类型转换),以及加减乘除等简单算术运算,举例如下:
—将变量sum赋值为0-->
--将sum加2,然后再赋值给sum-->
--将sum减3,然后再赋值给sum-->
--将sum乘以4,然后再赋值给sum-->
--将sum除以5,然后再赋值给sum,此时sum=-0.8-->
浮点型变量还支持变量比较测试功能,该部分在分支一节中会重点描述。
2.字符串变量
可以使用命令创建字符串变量,该命令有两个参数“assign_to”和“value”,例如:
—将外部文件的field0的值,赋给字符串变量str-->
字符串变量支持比较操作,命令为,其对字符串比较的值是一个小于,等于,或大于0的双精度整型值。
通常该功能用在对正则表达式提取结果的操作,以及从外部文件获取值的操作中,例如:
—将变量strvar与字符串”Hello”进行比较,结果赋值给浮点型变量result-->
4.3.鉴权
在sipp的关键字和变量使用中,有一类特殊的变量需要重点说明,那就是鉴权。
sipp支持标准的Digest和AKA两种鉴权方法。
具体的使用方法如下:
1.在接收到401或407响应时,如果该流程需要鉴权,则需要在recv命令中增加属性auth=”true”,sipp会记录该消息中鉴权头域的相关值。
2.随后在发送的第二条请求消息中,使用[authentication]关键字,指定用户名及密码(Digest方式)或aka_K、aka_OP、aka_AMF(AKA),sipp将自动计算出response,并构造相关头域内容。
例如:
3.还可以通过在外部文件中某一列,配置[authenticationusername=1001password=1001],然后在消息中使用[fieldN]引用,来实现不同用户的鉴权过程。
4.sipp脚本中还支持对鉴权的response结果进行校验,该操作使用verifyauth命令来完成,并将检查结果赋值给一个布尔变量中。
例如:
5.分支和跳转
5.1.标签
sipp脚本支持自定义标签操作,因此可以通过next、jump等命令,实现对流程逻辑的分支和跳转功能,类似C语言中的goto。
标签的定义语法格式如下:
其中id属性值为该标签的标识,可以通过next属性进行标签之间的跳转,例如:
在例子中,recv命令使用了next,即如果收到了486响应,则直接跳转至id为err_ack的label处。
5.2.条件判断
sipp支持通过变量测试,来进行某些条件的判断,继而执行相关的操作,类似于开发语言中的if…else语法,变量测试的动作命令为“test”,含有四个参数:
variable,value,assign_to,compare。
variable和value的比较的结果,通过assgin_to赋给某一变量,值为1或0。
compare为比较的操作方法,一共有6种,分别为:
●equal
●not_equal
●greater_than
●less_than
●greater_than_equal
●less_than_equal
举例如下:
上述语句中,变量st与10进行比较,如果小于10,则result=1,否则result=0。
5.3.跳转和循环
sipp脚本的正常执行流程为顺序依次执行相关语句,但是在某些场景下需要非线性地执行,例如收到错误消息,则跳转至错误处理等,就需要用到分支功能。
结合上文内容可知,sipp的分支功能时通过标签和跳转命令来实现的。
在任意一个动作命令之后添加一个next=”label_id”的参数,当脚本执行完这个动作后就会跳到指定标号处继续往下执行,另外,如果在next参数后再添加一个test=”m”参数,脚本仅在变量[$m]为真时才会跳到指定标号,这个特性结合条件判断,可以用来实现某些特殊要求。
例如:
上述例子为注册服务器部分脚本,实现的效果是:
当接收到REGISTER消息后,通过正则表达式获取Expires头域的值,并将其与0比较,如果相等,则表示该消息为注销请求,result2=1。
nop命令行中,判断如果result2=1,这跳转至deregister标签,进行注销流程的处理。
(注:
通过正则表达式匹配而获取到的值,均为字符串变量,因此无法直接与数值0进行比较,而是通过strcmp命令进行字符串比较,将此结果赋给result