sipp是一个针对SIP协议进行测试的免费开源工具,可运行于windows/mac/linux,官方地址:http://sipp.sourceforge.net/。
一、安装
本文只介绍mac上的安装方式,其它平台(windows/linux)的安装,可参考官方文档 (注:感谢黄龙舟做的中文翻译)
brew install sipp
mac上,直接用brew 一行命令搞定安装,完成后,可用sipp -v查看版本号,参见下图,目前的版本号是SIPp v3.6.0-PCAP-RTPSTREAM
二、uac/uas初体验
安装好以后,相信大家已经等不及要体验一把,既然是打电话,就得有“主叫方(uac)”和“被叫方(uas)” (注:对uac、uas第1次接触的同学,建议先移步 SIP协议学习笔记 )
2.1 启动内置的uas场景
sipp -sn uas
如上图所示,启动uas后,会在本机开1个端口5061,然后下面会一些SIP信令的实时统计,INVITE文字在“右方向箭头”右侧,表示当前收到的INVITE请求数,180左侧的“左方向箭头”表示回应的振铃消息数。现在只有被叫,并没有主叫来电,所以Messages这一栏全是0
2.2 启动内置的uac场景
sipp -sn uac 127.0.0.1:5061
注:最后的“ip:端口”,即为上一步uas启动的ip地址和端口号,必须匹配。
此时,再回到uas的界面,Messages栏,就不再全是0了
这样,主叫方(uac)打电话,被叫方(uas)接电话,基本的呼叫流程就通了。
三、理解配置文件
流程虽然跑通了,可能有同学会好奇,uas/uac这2个内置场景,具体逻辑长啥样?为什么uac的界面,会有100/180/183这些响应码,没有其它4xx或5xx之类的码?除uac/uas,还有其它内置场景吗?
如上图,直接输入sipp,会看到有很多参数说明,其中-sn 表示加载默认的场景,除了uas/uac,还有regexp/branchc/branchs...等其它场景,有兴趣的同学可以每种场景都试一下。
另外,还有一个很有用的-sd参数,可以把默认的场景配置,直接导出来,参考下面的命令:
这样,就把默认的uac/uas这2个场景,导出成xml文件,方便后续研究。打开这2个文件看一下:
3.1 uac.xml
1 <?xml version="1.0" encoding="ISO-8859-1" ?> 2 <!DOCTYPE scenario SYSTEM "sipp.dtd"> 3 4 <scenario name="Basic Sipstone UAC"> 5 <send retrans="500"> 6 <![CDATA[ 7 8 INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0 9 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] 10 From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number] 11 To: [service] <sip:[service]@[remote_ip]:[remote_port]> 12 Call-ID: [call_id] 13 CSeq: 1 INVITE 14 Contact: sip:sipp@[local_ip]:[local_port] 15 Max-Forwards: 70 16 Subject: Performance Test 17 Content-Type: application/sdp 18 Content-Length: [len] 19 20 v=0 21 o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip] 22 s=- 23 c=IN IP[media_ip_type] [media_ip] 24 t=0 0 25 m=audio [media_port] RTP/AVP 0 26 a=rtpmap:0 PCMU/8000 27 28 ]]> 29 </send> 30 31 <recv response="100" 32 optional="true"> 33 </recv> 34 35 <recv response="180" optional="true"> 36 </recv> 37 38 <recv response="183" optional="true"> 39 </recv> 40 41 <recv response="200" rtd="true"> 42 </recv> 43 44 <!-- Packet lost can be simulated in any send/recv message by --> 45 <!-- by adding the 'lost = "10"'. Value can be [1-100] percent. --> 46 <send> 47 <![CDATA[ 48 49 ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0 50 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] 51 From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number] 52 To: [service] <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param] 53 Call-ID: [call_id] 54 CSeq: 1 ACK 55 Contact: sip:sipp@[local_ip]:[local_port] 56 Max-Forwards: 70 57 Subject: Performance Test 58 Content-Length: 0 59 60 ]]> 61 </send> 62 63 <!-- This delay can be customized by the -d command-line option --> 64 <pause/> 65 66 <send retrans="500"> 67 <![CDATA[ 68 69 BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0 70 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch] 71 From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number] 72 To: [service] <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param] 73 Call-ID: [call_id] 74 CSeq: 2 BYE 75 Contact: sip:sipp@[local_ip]:[local_port] 76 Max-Forwards: 70 77 Subject: Performance Test 78 Content-Length: 0 79 80 ]]> 81 </send> 82 83 <recv response="200" crlf="true"> 84 </recv> 85 86 <!-- definition of the response time repartition table (unit is ms) --> 87 <ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/> 88 89 <!-- definition of the call length repartition table (unit is ms) --> 90 <CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/> 91 92 </scenario>