其它:
vim中末行去掉^M: shift: %s/\r//g
vim撤销操作: u
vim恢复撤销: ctrl+r

SIPp官网
SIPp使用手册(中文)
SIPp使用手册(英文)

脚本运行指令

sipp -sf notify_event_reboot_authentication.xml -i 192.168.120.101 192.168.125.119:5084 -m 1 -f 5 -au 3005 -ap s1ptest

-sf 指定运行的脚本
-i 指定SIPp服务器IP(UAC的脚本好需要指定UAS的话机IP、Port,如:192.168.125.119:5084)
-p 指定SIPp服务器端口
-f 指定脚本视图刷新频率
-au 指定authentication username
-ap 指定authentication password
也可以直接在脚本中写死用户名和密码:[authentication username="admin" password="admin1"]

脚本运行视图切换
执行脚本后按数字1-9,切换视图
1:脚本视图,显示脚本的流程和一些重要信息
2:统计视图,显示主要的统计信息
Cumulative:从SIPp运行以来的所有统计信息
Periodic:每次刷新时间里的统计情况
3:区间视图,显示响应时间和呼叫长度的分布区间(脚本中可定义)

   <!-- definition of the response time repartition table (unit is ms)   --><ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/><!-- definition of the call length repartition table (unit is ms)     --><CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

4:变量视图,显示变量信息

附件脚本:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario (View Source for full doctype...)>
<scenario name="Basic Sipstone UAC">
<send>
<![CDATA[NOTIFY sip:[remote_ip]:[remote_port] SIP/2.0Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]From: <sip:[local_ip]:[local_port]>To: <sip:[remote_ip]:[remote_port]>Call-ID: [call_id]CSeq: 1 NOTIFYContact: sip:[local_ip]:[local_port]Max-Forwards: 69Event:rebootContent-Type: application/simple-message-summaryContent-Length:[len]Subscription-State:terminated
]]>
</send><recv response="401" auth="true" /><send>
<![CDATA[NOTIFY sip:[remote_ip]:[remote_port] SIP/2.0Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]From: <sip:[local_ip]:[local_port]>To: <sip:[remote_ip]:[remote_port]>Call-ID: [call_id]CSeq: 2 NOTIFYContact: sip:[local_ip]:[local_port]Max-Forwards: 69Event:reboot<!--  [authentication username="admin" password="admin1"] -->[authentication username  password]Content-Type:application/simple-message-summaryContent-Length:[len]Subscription-State:terminated
]]>
</send><recv response="200" auth="true"/>

脚本编辑

Reference //抑制未用到的变量,当脚本运行提示有存在未用到的变量时,可以使用该命令来禁用它。

运行脚本提示:

root@gs-desktop:/home/gxv33xx/sipp# sipp -sf uas_two_regexp.xml -i 192.168.120.101
In pcap /home/changli/555.pcap, npkts 8930
max pkt length 1121
base port 50042
2019-02-12      14:50:13.382441 1549954213.382441: Variable $1 is referenced 1 times!

在脚本中添加如下消息,责不再弹出提示

<Reference variables="1" />

多个变量用逗号隔开

<Reference variables="1,2" />

SIPp作为UAS,主动发送Bye,UAC未响应200OK的场景

执行命令:sipp -sf uas_two_regexp.xml -i 192.168.120.101 -m 1
发送的Bye的Request_URI未携带[remote_ip]:[remote_port],主叫未响应200OK

执行命令:sipp -sf uas_two_regexp.xml -i 192.168.120.101 192.168.125.119:5060 -m 1
发送的Bye的Request_URI为 192.168.125.119:5060

remote IP、remote_port可以不添加参数,也可以通过-s参数指定:sipp -sf uas_no_regexp.xml -i 192.168.120.101 -s 192.168.125.119:5060 -m 1

[peer_tag_param]的使用场景
SIPp作为UAC,将UAS响应的To-Tag带入UAC发送的消息中,如下ACK和BYE消息

    <send><![CDATA[ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0Via:SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]From:UAC<sip:UAC@[local_ip]:[local_port]>;tag=[call_number]To:UAS<sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]Call-ID:[call_id]CSeq:1 ACKContact:<sip:UAC@[local_ip]:[local_port];transport=[transport]>Max-Forwards:70Content-Length:0]]></send><send retrans="500"><![CDATA[BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]Call-ID: [call_id]CSeq: 2 BYEContact: sip:sipp@[local_ip]:[local_port]Max-Forwards: 70Subject: Performance TestContent-Length: 0]]></send>注意:sipp使用时分号”;”不用写,[remote_port]>[peer_tag_param],虽然实际数据是需要分号的

在 SIPp 中使用正则表达式可以实现如下功能:

  • 提取SIP消息中的内容或者SIP头并存储到变量中以在后续中用到(称之为再注入)
  • 检查 SIP 消息中的内容是否满足要求

SIPp作为UAC时,鉴于存在[peer_tag_param] 参数,发送BYE消息并不需要引入变量来再注入以保证To-Tag的一致性

SIPp作为UAS时,参数[peer_tag_param] 失效,需要引入变量来再注入,以保证To-Tag的一致【Call-ID、from-tag以及to-tag三个值的组合能够唯一标识一次对话】

附件脚本:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="UAS response 180"><!-- By adding rrs="true" (Record Route Sets), the route sets         --><!-- are saved and used for following messages sent. Useful to test   --><!-- against stateful SIP proxies/B2BUAs.                             --><recv request="INVITE" crlf="true"></recv><send><![CDATA[SIP/2.0 100 Trying[last_Via:][last_From:][last_To:][last_Call-ID:][last_CSeq:]Contact: <sip:[local_ip]:[local_port];transport=[transport]>Content-Length: [len]]]></send><send><![CDATA[SIP/2.0 180 Ringing[last_Via:][last_From:][last_To:];tag=[call_number][last_Call-ID:][last_CSeq:]Contact: <sip:[local_ip]:[local_port];transport=[transport]>Content-Length: 0]]></send><pause milliseconds="2000"/><send retrans="500"><![CDATA[SIP/2.0 200 OK[last_Via:][last_From:][last_To:];tag=[call_number][last_Call-ID:][last_CSeq:]Contact: <sip:[local_ip]:[local_port];transport=[transport]>Content-Type: application/sdpContent-Length: [len]v=0o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]s=Talkc=IN IP[media_ip_type] [media_ip]b=AS:512t=0 0m=audio [auto_media_port] RTP/AVP 8 101a=rtpmap:8 PCMU/8000a=rtpmap:101 telephone-event/8000m=video [auto_media_port] RTP/AVP 111a=rtpmap:111 H264/90000a=fmtp:111 profile-level-id=42801F; packetization-mode=1a=sendrecv]]>// !!! SIPp作为UAS,引入正则表达式<action><ereg regexp=".*" search_in="hdr" header="From:" check_it="true" assign_to="1"/>     <ereg regexp=".*" search_in="hdr" header="To:" check_it="true" assign_to="2"/><ereg regexp=".*" search_in="hdr" header="Via:" check_it="true" assign_to="3"/></action></send><recv request="ACK" ></recv><nop> <action> <exec play_pcap_video="/home/changli/555.pcap"/> </action> </nop><pause milliseconds="5000"/><send retrans="500"><![CDATA[BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0// !!! SIPp作为UAS,引入变量Via: [$3]From:[$2]To:[$1]Call-ID: [call_id]Cseq:2 BYEContact: <sip:125@[local_ip]:[local_port]>Max-Forwards: 70      Content-Length:[len]]]></send><recv response="200" rrs="true"></recv><!-- Keep the call open for a while in case the 200 is lost to be     --><!-- able to retransmit it if we receive the BYE again.               --><pause milliseconds="4000"/>  <!-- definition of the response time repartition table (unit is ms)   --><ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/><!-- definition of the call length repartition table (unit is ms)     --><CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>
</scenario>

SDP在Message Body中,与头域所在的Message Header之间有一个换行符

<send retrans="500"><![CDATA[SIP/2.0 200 OK[last_Via:][last_From:][last_To:];tag=[call_number][last_Call-ID:][last_CSeq:]Contact: <sip:[local_ip]:[local_port];transport=[transport]>Content-Type: application/sdpContent-Length: [len]v=0   //协议的版本信息,目前只有版本0o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]  //owner/creator和session信息格式:<用户名> <会话id> <版本> <网络类型> <地址类型> <地址>s=Talk  //会话名称c=IN IP[media_ip_type] [media_ip]  //连接信息  格式:<网络类型> <地址类型> <地址>b=AS:512 //本端带宽信息  格式:<类型>:<带宽>t=0 0 //起始时间  格式:<开始时间> <结束时间>a=sendrecv  //媒体属性 sendrecv、sendonly、recvonly、inactivem=audio [auto_media_port] RTP/AVP 8 101   //媒体信息 格式:<媒体类型> <媒体端口> <传输协议> <编码信息>a=rtpmap:8 PCMU/8000  //媒体属性。可选a=rtpmap:101 telephone-event/8000  //媒体属性。可选m=video [auto_media_port] RTP/AVP 111    //媒体信息 格式:<媒体类型> <媒体端口> <传输协议> <编码信息>a=rtpmap:111 H264/90000  //媒体属性。可选a=fmtp:111 profile-level-id=42801F; packetization-mode=1  //媒体属性。可选]]></send>//通过Wireshark保存单向的RTP数据,且保存为/Wireshark/tcpdump... - nanosecond pcap<nop><action><exec play_pcap_video="/home/changli/555.pcap"/>     //视频流:play_pcap_video  音频流:play_pcap_audio</action></nop><pause milliseconds="5000"/>   //时长

简单学习SIPp使用手册相关推荐

  1. 重磅!谷歌发布《深度学习调优手册》!Hinton转发点赞!

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入->CV微信技术交流群 丰色 Pine 发自 凹非寺 转载自:量子位(QbitAI) 各位炼丹 ...

  2. PyTorch学习教程、手册

    文章目录 PyTorch学习教程.手册 PyTorch视频教程 NLP&PyTorch实战 CV&PyTorch实战 PyTorch论文推荐 PyTorch书籍推荐 PyTorch学习 ...

  3. 【0基础快速入门】Python学习快速参考手册

    Python学习快速参考手册 目录 文章目录 Python学习快速参考手册 目录 @[toc] 下载 Python下载与配置 IDE下载与配置 第一章 · Python的基本语法 变量 数据类型 注释 ...

  4. SQL Server中的锁的简单学习

    原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但 ...

  5. [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...

    [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Python学习] ...

  6. JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  7. 表盘时针的html代码,html5画布操作的简单学习-简单时钟

    html5画布操作的简单学习-简单时针 效果图 一.什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. ...

  8. QuickSkin简单学习--控制结构

    QuickSkin简单学习 3.控制结构 if if ... endif 结构帮助模板的条件选择. QuickSkin支持和PHP相同的操作符. 比较操作符, 作为名称暗示,允许你比较两个值. 可以是 ...

  9. PL/SQL编程的简单学习

    PL/SQL简单学习 1.PL/SQL块的组成部分: ① 声明部分:该部分包含了变量和常量的定义,以及变量和常量的初始值定义,这部分由关键字declare开始,如果PL/SQL块中不需要声明变量或常量 ...

  10. php get 传循环出来的参数_简单学习PHP中的反射

    和Java一样PHP中也提供了一套完整的反射API,何为反射?以前我们是先写类,再在类中添加各种方法和属性,最后实例化一个类对象调用属性和方法.那有我们没有办法只通过这个实例对象获取到关于这个类的全部 ...

最新文章

  1. bzoj3295:[CQOI2011]动态逆序对
  2. 只使用了符号的Ruby程序
  3. 高并发服务器开源项目,百万级高并发WebRTC流媒体服务器设计与开发(示例代码)...
  4. Pandas系列(十)Merge语法
  5. 手机麦克风结构原理图_麦克风工作原理是什么
  6. centos7.6安装maven
  7. 「云原生上云」后的聚石塔是如何应对 双11 下大规模应用挑战的
  8. mysql就业方向_SQL数据库专业的就业方向
  9. 解决笔记本屏幕颜色偏变白问题
  10. React Native入门-实战解析(上)
  11. Codeforces 1292C Xenon's Attack on the Gangs
  12. 什么是库存周转率周转天数?
  13. 在追梦的路上,唯独脚踏实地,才能梦想成真
  14. 立足现实 与时俱进:C++ 1991-2006 reference
  15. CCFL的完整形式是什么?
  16. PowerBuilder篇(2)——如何连接Oracle数据库
  17. 关于计算机、数据的存储单位(bit, Byte, KB, MB, GB, TB, PB, EB, ZB, BB)
  18. 数学史在数学教育中的重要性
  19. 拍卖网html模板,html5织梦高端复古婚纱/影楼/摄影工作室网站模板
  20. (18) DeepCut DeeperCut vote(have a rough understanding)

热门文章

  1. docker安装mysql后无法执行mysql命令
  2. 产品读书《设计心理学1-4》-设计
  3. android通过经纬度获取地址,android之location 根据接口获取经纬度信息
  4. Niushop 快递打印单模板设置
  5. 搜狗输入法linux版怎么安装,Linux 搜狗输入法的安装(Ubuntu版)
  6. Java车辆牌照识别
  7. 用友业务单据生成凭证如何修改凭证金额
  8. 关于DXP2004的安装
  9. 有关BT5破解wifi密码的流程及当中经历问题的总结——从寻找ISO镜像到破解wifi密码
  10. EPSON清零软件sscserve40使用方法