我的个人博客
SIPp安装
SIPp 是一个测试 SIP 协议性能的工具软件
安装依赖
RedHat
yum install gcc-c++ gcc automake autoconf libtool make
yum install ncurses ncurses-devel
yum install openssl openssl-devel # TLS support
yum install lksctp-tools lksctp-tools-devel # SCTP support
yum install libpcap libpcap-devel libnet libnet-devel # PCAP play support
yum install gsl gsl-devel # distributed pauses
Debian
apt-get install g++ gcc automake autoconf libtool make
apt-get install libncurses5 libncurses5-dev
apt-get install openssl libssl-dev
apt-get install libsctp1 lksctp-tools libsctp-dev
apt-get install libpcap-dev libnet1 libnet1-dev
apt-get install gsl-bin libgsl0-dev libgsl0ldbl
编译安装
./configure --with-sctp --with-pcap --with-openssl
make
make install
SIPp使用
SIPp 自带用户代理工作流程
可使用命令导出自带的用户代理工作流程(uac、uas、regexp、branchc、branchs、3pcc-C-A、3pcc-C-B、3pcc-A、3pcc-B)到文件中,例如:
sipp -sd uac >> uac.xml
同一台机子进行测试
sipp -sn uas # 本机作为服务端
sipp -sn uac 127.0.0.1 # 本机作为客户端
SIPp 作为 SIP 服务器端
sipp -sf 场景文件 -p 本地端口 -i 本地IP -rsa 对端IP:对端端口 -trace_msg
SIPp 作为 SIP 客户端
sipp -sf 场景文件 -i 本地IP 对端IP:对端端口 -m 最大呼叫量 -trace_msg
sipp 172.16.8.88:5060 -i 172.16.8.181 -sf sipp-uac-register.xml -inf 3001-register.csv -m 10 -l 10 -d 10000 -r 10 -rp 10000
参数 | 说明 |
---|---|
172.16.8.88:5060 | 表示远端服务器的 IP 和端口(Asterisk Server) |
-i 172.16.8.181 | 表示本机(SIPp 端)的IP |
-sf sipp-uac-register.xml | 表示使用的XML场景文件是sipp-uac-register.xml(该场景文件用于注册到 Asterisk,暂停一会儿后取消注册) |
-inf 3001-register.csv | 表示使用的 CSV 统计数据转储文件是 3001-register.csv |
-m 10 | 表示最大呼叫数为 10 |
-l 10 | 表示最大并发数为 10 |
-d 10000 | 对应 XML 文件中使用 pause 的参数,如果 pause 没有指定参数,则使用 -d 选项的参数,表示暂停 10000ms |
-r 10 -rp 10000 | 表示10000ms内发起10次呼叫 |
注意:传递语音流(g711a.pcap)后暂停,暂停时间可由-d指定
CSV 统计数据转储文件
csv 文件是外部配置文件,定义 XML 场景文件中的相关变量,脚本会从 csv 文件中读取配置信息,比如用户账号,鉴权信息等。命令行使用 “-inf 文件名”
第一行申明变量的读取方式:顺序读取(SEQUENTIAL)、随机读取(RANDOM)、基于用户(USER)
之后每一行对应一个呼叫,使用 “;” 分隔符分隔每一项数据,分开的项在脚本中作为变量名 [filed0],[field1]……[fieldn] 来引用
1000;1050;[authentication username=1000 password=1234]
RANDOM
1000;1050;[authentication username=1000 password=1234]
SEQUENTIAL
1000;1050;[authentication username=1000 password=1234]
USERS
user000;password000
SEQUENTIAL,PRINTF=120,PRINTFMULTIPLE=1,PRINTFOFFSET=1,
1%04d;1%04d;[authentication username=1%04d password=1%04d];1%04d
# 10001~10120
# PRINTF:用户个数
# PRINTFMULTIPLE:步长
# PRINTFOFFSET:基数(起始数据)
XML的场景文件
xml 文件是 sipp 的执行脚本,描述 SIP 工作流程,sipp 按照脚本定义的流程来完成 sip 协议的流程
选项 | 说明 |
---|---|
[field0] | 匹配 CSV 配置文件第二行开始的每行第一列数据 |
[field1] | 匹配 CSV 配置文件第二行开始的每行第二列数据 |
[fieldn] | 匹配 CSV 配置文件第 n 行开始的每行第二列数据 |
[remote_ip] | 匹配命令行参数的远端服务器 IP |
[remote_port] | 匹配命令行参数的远端服务器 PORT |
[local_ip] | 匹配命令行参数 –i 设置的本地 IP |
其他’[]’ | 表示的参数SIPp可自动获取 |
一个 xml 场景文件必须以如下语句开始:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="Basic Sipstone UAC">
以如下语句结束:
</scenario>
根据不同的场景在中间加入不同的控制命令,若一个场景中很有多段,可以使用标号 label 来区分,标号的写法为:<label id="x"/>,其中,“x”为标号 ID
控制界面
按键 | 作用 |
---|---|
+ | 以 1 倍于 rate_scale 的速率增加呼叫 |
- | 以 1 倍于 rate_scale 的速率减少呼叫 |
* | 以 10 倍于 rate_scale 的速率增加呼叫 |
/ | 以 10 倍于 rate_scale 的速率减少呼叫 |
c | 进入命令控制模式 |
q | 待所有呼叫完成后退出 sipp |
Q | 立即退出 sipp |
s | 转储当前状态到日志文件 |
p | 暂停当前工作 |
1 | 显示场景页面 |
2 | 显示统计页面 |
3 | 显示分部页面 |
4 | 显示变量页面 |
5 | 显示 TDM 页面 |
6-9 | 显示其它分部页面 |
按 c 进入命令模式后,可以输入如下命令控制:
命令 | 描述 |
---|---|
dump tasks | 把错误信息转储到日志文件 |
set rate x | 设置呼叫率 |
set rate-scale x | 设置 rate-scale |
set users x | 设置用户数 |
set limit x | 设置呼叫限制 |
set hide true/false | |
set display main/ooc | 改变视图 |
set index true/false | 设置场景视图中的索引信息 |
trace log on/off | 设置开启或关闭日志跟踪 |
场景页面:显示呼叫的信令个数,呼叫率,呼叫限制、超时次数,重传次数,接收到异常的数据包个数
统计视图:显示呼叫的统计信息
分部视图:显示呼叫的平均响应时间以及平均通话时长
检查 SIPp 网络状态
netstat -lpn |grep sipp
8888 is the port for SIPp control. Use the option -cp in the command line to change the base number.
5067 is the port for SIP signaling. Use the option -p in the command line to change it.
6000 is the default local RTP echo port.Use the option -mp in the command line to change it. RTP/UDP packets received on this port are echoed to their sender
6002 is the RTP echo port +2. RTP/UDP packets coming on this port are also echoed to their sender.
自制 SIPp 语音流
工具
- Server:Asterisk Server
- Client:Eyebeam、Wireshark
Server 端配置:
1. SIP Trunk
[88001]
username=88001
secret=88001
context=from-sip
type=friend
host=dynamic
disallow=all
allow=alaw
2. Routing Rules
[from-sip]
exten => _X.,1,Answer()
exten => _X.,n,Playback(demo-instruct)
exten => _X.,n,Hangup()
; 抓取 DTMF 按键
[from-dtmf]
exten => _X.,1,Answer()
exten => _X.,n(background),BackGround(demo-instruct)
exten => _X.,n,Hangup()
exten => 0,1,Playback(digits/0)
exten => 0,n,Goto(from-1234,_X.,background)
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(from-1234,_X.,background)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(from-1234,_X.,background)
exten => 3,1,Playback(digits/3)
exten => 3,n,Goto(from-1234,_X.,background)
exten => 4,1,Playback(digits/4)
exten => 4,n,Goto(from-1234,_X.,background)
exten => 5,1,Playback(digits/5)
exten => 5,n,Goto(from-1234,_X.,background)
exten => 6,1,Playback(digits/6)
exten => 6,n,Goto(from-1234,_X.,background)
exten => 7,1,Playback(digits/7)
exten => 7,n,Goto(from-1234,_X.,background)
exten => 8,1,Playback(digits/8)
exten => 8,n,Goto(from-1234,_X.,background)
exten => 9,1,Playback(digits/9)
exten => 9,n,Goto(from-1234,_X.,background)
exten => *,1,Playback(digits/*)
exten => *,n,Goto(from-1234,_X.,background)
exten => #,1,Playback(digits/#)
exten => #,n,Goto(from-1234,_X.,background)
Client 端抓包
- Wireshark 抓包
- Eyebeam 使用 88001 注册到 AsteriskServer,呼叫任意号码等待对端挂机
- Wireshark 停止抓包
注:Wireshark 中查看语音流编码
- Telephony - RTP - Show All Streams - g711A
- Telephony - VoIP Calls - Flow -> RTP (g711A)
生成 SIPp 支持的语音流
- 过滤:ip.src == AsteriskServerIP and ip.dst == EyebeamIP and rtp
- 导出:Export Specified Packets - All packages - Displayed - 保存类型:wireshark/tcpdump - 后缀.pcap
注:
- 过滤 RTP 包使用 rtp
- 过滤 dtmf 使用 rtpevent.event_id == ${num}
- rtpevent.event_id == 10 表示 *(star)
- rtpevent.event_id == 11 表示 #(pound)