sipp3.6带媒体测试方案
概述
SIP压测工具sipp,免费,开源,功能足够强大,配置灵活,优点多。
本文档介绍sipp工具如何带媒体测试,并介绍如何制作可用的媒体文件(G729和PCMA)。
环境
centos7.9
freeswitch1.10.7
sipp v3.6.2_rc1
制作媒体流文件
sipp支持通过exec调用play_pcap_audio来发送媒体流,但是要求媒体流是pcap格式。
sipp中自带的只有G711a的媒体流文件,只有8秒长度,并且媒体包抖动过大,不好用。
<exec play_pcap_audio="pcap/g711a.pcap"/>
我们可以通过freeswitch + sngrep抓包自己制作两个媒体流文件。
修改freeswitch注册号码的拨号计划,找一个好听的音乐传到sounds目录。
<include>
<context name="default">
<extension name="test" continue="false">
<condition field="destination_number" expression="^3066(\d+)$" break="on-true">
<action application="answer"/>
<action application="playback" data="/usr/local/freeswitch/sounds/haoting.wav" />
</condition>
</extension>
</context>
</include>
打开sngrep抓包(信令+媒体)
sudo sngrep -c -r
通话30秒后挂断电话,在sngrep中保存抓包,选择“(*) .pcap (SIP + RTP)”模式。
将pcap文件下载到本地,使用wireshark打开。
在wireshark中选择“电话”->“RTP”->“RTP流”,选中fs发送的媒体流,点击“play streams”。
试听抓包的媒体流复合要求。
点击“RTP流”页面上的“prepare filter”按钮过滤当前媒体流的数据包。
选择“文件”->“导出特定分组”,保存到文件“sipp-PCMA-30s.pcap”。
一个符合sipp要求的G711的媒体流文件就制作好了。
G729的媒体流文件的制作过程基本一致,只需要在sipua上修改codec为G729,再通过sngrep抓包,和wireshark过滤G729媒体包并保存即可。
带媒体脚本
在sipp.3.6.2/docs目录下有常用的默认脚本,参考“sipp\docs\uac_pcap.xml”修改自己的带媒体脚本。
在收到200 OK应答之后,播放“sipp-PCMA-30s.pcap”文件。
vi uac-test-pcap.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="Basic Sipstone UAC">
<send retrans="500">
<![CDATA[
INVITE sip:[field1]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 1 INVITE
Contact: 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=-
c=IN IP[media_ip_type] [media_ip]
t=0 0
m=audio [media_port] RTP/AVP 8 18
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=ptime:20
]]>
</send>
<recv response="100" optional="true">
</recv>
<recv response="183" optional="true">
</recv>
<recv response="180" optional="true">
</recv>
<recv response="200" rtd="true">
</recv>
<send>
<![CDATA[
ACK sip:[field1]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 1 ACK
Contact: sip:sipp@[local_ip]:[local_port]
Max-Forwards: 70
Subject: Performance Test
Content-Length: 0
]]>
</send>
<nop>
<action>
<exec play_pcap_audio="./sipp-PCMA-30s.pcap"/>
</action>
</nop>
<pause milliseconds="30000"/>
<send retrans="500">
<![CDATA[
BYE sip:[field1]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 2 BYE
Contact: sip:sipp@[local_ip]:[local_port]
Max-Forwards: 70
Subject: Performance Test
Content-Length: 0
]]>
</send>
<recv response="200" crlf="true">
</recv>
<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>
<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>
</scenario>
UAS脚本不需要修改,略过
测试
服务端uas,带参数“-rtp_echo”使得UAS自动echo媒体流。
sudo sipp -i 10.55.55.138 -p 5555 -sf uas-test.xml -rtp_echo
客户端uac,从uac的显示中可以看到是有正常发包。
sudo sipp -i 10.55.55.138 -p 6666 -inf call-test.csv -sf uac-test-pcap.xml 10.55.55.137:3060 -rp 1000 -r 25 -l 8192 -m 9999
总结
sipp的github地址:https://github.com/SIPp/sipp
后续会有更多的压测方案和脚本慢慢写。
空空如常
求真得真