SIPp脚本编写方法基础m1资料Word文件下载.docx
- 文档编号:17830316
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:22
- 大小:165.81KB
SIPp脚本编写方法基础m1资料Word文件下载.docx
《SIPp脚本编写方法基础m1资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《SIPp脚本编写方法基础m1资料Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
SIPp的测试脚本遵循标准的XMLV1.0版本的语法规范,XML即“可扩展标记语言”eXtensibleMarkupLanguage的缩写,W3C组织与1998年发布XML1.0规范。
1.2.DTD扩展语法规则
SIPp的执行目录中,存在一个sipp.dtd文件。
该文件为标准的xml扩展语法规则,在该文件中,对send、recv、pause等元素增加了定义,包括其属性列表等内容,可作为脚本文件格式的校验。
1.3.脚本结构
一个标准的SIPp脚本,文件起始应为通用的xml前导区和DTD文件定义区如图所示:
接下来使用<
scenario>
和<
/scenario>
包括的部分,即为脚本的正文部分。
sipp脚本正文部分,包含如下几个区域:
1.初始化区
在初始化区域中,通常用来进行全局变量的定义和赋值等操作,在脚本未进行逻辑流程前,预先完成初始化动作。
初始化区是在脚本正文的最开始,通过使用命令<
init>
/init>
,并在其之间插入一些<
nop>
label>
命令即可实现,在初始场景中的变量,仅用于全局变量,并不会应用于呼叫。
例如下图中,在初始化区对THINKTIME进行赋值:
2.逻辑执行区
逻辑执行区中包括了业务流程的相关内容,比如接收消息、发送消息、暂停时长、分支判断、媒体播放、内外部命令执行等操作。
逻辑执行区是脚本的最关键部分,编写sipp脚本,主要也就是针对该部分进行编写和调试。
3.变量抑制区
该部分是为了避免在脚本逻辑区定义了大量的变量,但实际并未使用导致运行时报错无法执行的问题,不论定义了多少变量,这些变量有无被使用,只需要添加进变量抑制区的列表中,脚本均可正常执行。
该部分仅有一个命令<
Reference/>
,variables属性为所需抑制的变量列表。
如下图所示:
4.定时器自定义区
该区域主要作用为:
针对消息响应时长(ResponseTime)以及呼叫持续时长(CallLength)的Timer进行自定义间隔的配置,以获取所需的显示范围,例如自定义timer配置为:
则在sipp运行时,查看运行统计界面呈现如下:
1.4.注释
sipp脚本注释的语法格式为<
!
-->
xxx<
,支持多行注释,如:
2.脚本类型
SIPp脚本根据使用场景不同,主要分为UAC、UAS、3PCC和OCC4种类型,每种类型均有其特定的使用方式,内部逻辑也有所不同。
2.1.UAC
顾名思义,UAC类型的脚本主要是模拟sip会话中的UAC侧,即负责发起会话的client端。
如注册客户端、主叫用户、订阅者等。
通常的UAC脚本逻辑区会以send作为业务流程的起始。
UAC脚本一旦启动,如果不设置起始暂停时长的参数,通常会立即开始执行。
2.2.UAS
UAS与UAC相对,主要模拟sip会话的UAS侧,启动后即进入被动接收状态,通常作为server端使用,如注册服务器、被叫用户、通知者、业务网关等。
通常的UAS脚本逻辑区会以recv作为业务流程的起始。
UAS脚本启动后,即绑定相关本地socket,进入接收消息的状态。
2.3.3PCC(三方通话)
SIPp工具允许多个脚本实例间进行交互,完成较为复杂的业务流程。
如三方通话等业务,因此该种脚本在普通脚本的基础上,更多地使用内部cmd交互命令,如recvcmd、sendcmd等在不同脚本间传递会话参数,配合完成复杂流程的测试实现。
sipp还提供了扩展的3pcc模式,支持master和slave的脚本角色。
该类型的脚本编写和调试较为复杂,本文档中不再赘述,如有兴趣可以翻阅sipp的使用手册等文档,其中有详细说明。
2.4.OCC(Out-of-call)
OCC(Out-of-call)脚本作为特殊类型的脚本,通常不会单独使用,而是与UAC脚本配合使用(也只能与UAC脚本配合,UAS等类型脚本无法支持-occsn等执行命令)。
主要作用为扩展UAC脚本的适用范围,使UAC脚本能够在接收到不同会话内的非预期消息时,不至于直接丢弃。
如注册客户端可能会遇到接收到通知NOTIFY的消息,此时就需要在运行register脚本的时候适用-oocsn或-oocsf参数,配合ooc脚本,实现对NOTIFY消息返回200的操作。
3.命令与属性
3.1.常用命令
SIPp工具提供的命令相当丰富,包括消息操作命令、变量操作、正则表达式、赋值和判断、内部命令、外部命令、日志操作、媒体命令等多种,在一般的使用场景下,通常根据不同的动作,来进行命令的使用。
下面针对比较常用的场景,如发送消息、接收消息、媒体播放等进行描述:
(更详细的命令功能及示例,可以翻阅sipp的使用手册等文档)
一个最基本的sipp脚本,通常包含了send、recv、nop、pause这几个命令。
其中send为发送sip消息,recv为接收sip消息,nop为处理非业务的逻辑,pause为提供暂停时长。
例如一个基本语音呼叫的主叫侧脚本:
首先使用send命令发送INVITE消息,注意在发送消息时,sip消息所有内容均包含在标准的xml数据格式CDATA内,CDATA的语法格式请格外注意,避免因为语法错误导致无法正确发送。
(注:
在构造发送的INVITE消息时,为实现批量发送,使用到了大量的变量和关键字,在后续内容中会详细加以说明。
)
发送出消息后,还需要进行后续响应消息的接收,请注意由于sip协议存在临时响应和最终响应两种,而1xx的响应在业务中可能存在,也可能不存在,因此需要采用可选属性加以区别。
optional=“true”即表示该条消息为可选接收,如果没有收到,也不会影响后续消息的接收及处理,如100/183/180。
而200为必选接收消息,只有当接收到该消息后,脚本才会继续后续流程,因此没有optional参数。
在接收到200ok消息,并发送出ACK后,语音通话接续流程即完成,此时根据实际业务流程,需要进行语音媒体的传输,因此脚本在这里需要增加一个nop命令,用于媒体的播放
nop命令可以用于任何非消息处理的位置,在nop命令中增加action命令,然后即可执行类似媒体处理、变量操作、条件判断等动作。
在执行媒体播放命令后,由于sipp在执行nop相关命令后,不会等待命令执行完毕而是立即执行后续脚本内容,因此为保证媒体播放正常,我们还需要根据实际要求,将脚本暂停一段时间,以确保流程模拟正确。
millisenconds属性可以自定义暂停的时长,单位为ms,如果该属性为空,则可以通过在执行命令中增加“-d10000”来指定暂停时长)
3.2.常用属性列表
命令
属性描述
示例
<
send>
用于消息的发送,常用参数包括
retrans:
udp报文重传时长;
lost:
丢包率;
start_txn:
启动响应时间记录
ack_txn:
记录接收响应时间,与start_txn匹配
sendretrans=“500”lost=“10”start_txn=“invite”ack_txn=“invite”>
/send>
recv>
用于消息的接收,常用参数包括
response:
期望收到的响应消息
request:
期望收到的请求消息
optional:
可选接收消息,值为true或global
timeout:
超时时长,默认超时后直接END
ontimeout:
超时后的跳转处理
action:
收到消息后采取的处理动作
regexp_match:
检查收到消息是否匹配预期
recvresponse=“100”optional=“true”>
/recv>
recvrequest=“ACK"
timeout="
18000"
ontimeout=“5"
>
recvrequest="
MESSAGE|PUBLISH"
regexp_match="
true"
pause>
用于设置暂停时间,常用参数包括
milliseconds:
设置暂停时长,单位ms
variable:
设置当变量出现时暂停
distribution:
使用GSL定义或分布模型定义呼叫时长
pausemilliseconds="
5000"
/>
pausevariable="
1"
/>
pausedistribution="
uniform"
min="
2000"
max="
exponential"
mean="
900000"
/
用于非协议消息处理的命令执行,常用参数包括
执行命令动作
action>
execplay_pcap_audio="
pcap/g711a.pcap"
/action>
/nop>
sendCmd>
用于两个SIPp实例间的交互发送,常用于3PCC场景,常用参数包括
[CDATA[]]>
:
用于3PCC场景的参数传递
dest:
仅用于扩展模式3PCC
[CDATA[
Call-ID:
[call_id]
[$1]
]]>
/sendCmd>
sendCmddest="
s1"
recvCmd>
用于两个SIPp实例间的交互接收,常用于3PCC场景,常用参数包括
接收到命令时的执行命令动作
src:
action
eregregexp="
Content-Type:
.*"
search_in="
msg"
assign_to="
2"
/recvCmd>
sendCmdsrc="
s2"
通用属性:
属性名
描述
start_rtd
启动响应定时器
sendstart_rtd="
invite“>
rtd
停止响应定时器
recvresponse=“200”rtd=“invite“/>
repeat_rtd
重复启用响应定时器
recvresponse=“407”rtd="
invite"
repeat_rtd="
true“/>
crlf
运行界面增加回车换行
sendcrlf="
next
跳转任意label
recvresponse="
403"
optional="
next=“reg_fail"
test
与next一起使用,设置跳转条件
sendnext="
6"
test=“flag1"
chance
与test、next一起使用,当test结果有值时,则概率跳转
next=“reg_fail”test=“flag“chance="
0.90"
<
counter
计数器累加1
recvresponse=“200”counter=“SuccessCALL"
3.3.正则表达式
正则表达式作为sipp中极为重要的功能,在各个场景下应用广泛,最常见的是通过正则表达式,获取接收消息中某个参数,并将该参数赋给变量,用于后续流程的使用。
正则表达式的使用语法如下图所示:
正则表达式的命令为<
ereg/>
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=<
filename>
line=<
number>
]
从外部文件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-->
assignassign_to="
sum"
value="
0"
--将sum加2,然后再赋值给sum-->
addassign_to="
--将sum减3,然后再赋值给sum-->
subtractassign_to="
3"
--将sum乘以4,然后再赋值给sum-->
multiplyassign_to="
4"
--将sum除以5,然后再赋值给sum,此时sum=-0.8-->
divideassign_to="
5"
<
浮点型变量还支持变量比较测试功能,该部分在分支一节中会重点描述。
2.字符串变量
可以使用命令<
assignstr>
创建字符串变量,该命令有两个参数“assign_to”和“value”,例如:
—将外部文件的field0的值,赋给字符串变量str-->
assignstrassign_to="
str"
[field0]"
字符串变量支持比较操作,命令为<
strcmp>
,其对字符串比较的值是一个小于,等于,或大于0的双精度整型值。
通常该功能用在对正则表达式提取结果的操作,以及从外部文件获取值的操作中,例如:
—将变量strvar与字符串”Hello”进行比较,结果赋值给浮点型变量result-->
strcmpassign_to="
result"
variable="
strvar"
Hello"
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命令来完成,并将检查结果赋值给一个布尔变量中。
lookupassign_to="
line"
file="
users.conf"
key="
[$username]"
verifyauthassign_to="
authvalid"
username="
[field0line=\"
[$line]\"
]"
password="
[field3line=\"
5.分支和跳转
5.1.标签
sipp脚本支持自定义标签操作,因此可以通过next、jump等命令,实现对流程逻辑的分支和跳转功能,类似C语言中的goto。
标签的定义语法格式如下:
labelid=”err_ack”/>
其中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
举例如下:
testassign_to="
st"
compare="
less_than"
10"
上述语句中,变量st与10进行比较,如果小于10,则result=1,否则result=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SIPp 脚本 编写 方法 基础 m1 资料