当前位置:首页 > CN2资讯 > 正文内容

SIP服务器 JAVA sip服务器软件

1天前CN2资讯


1      安装及概述:

SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。

它包含了一些基本的SipStone用户代理工作流程(UAC和UAS),并可使用INVITE和B YE建立和释放多个呼叫。它也可以读XML的场景文件,即描述任何性能测试的配置文件。它能动态显示测试运行的统计数据(呼叫速率、信号来回的延迟,以及消息统计)。周期性地把CSV统计数据转储,在多个套接字上的TCP和UDP,利用重新传输管理的多路复用。在场景定义文件中可以使用正规表达式,动态调整呼叫速率。

SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x网关,SIP PBX,等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。

SIPp的网址:http://sipp.sourceforge.net/,这里可以下载最新版的SIPp软件,并且有英文资料可供查阅。

1.1      SIPp安装

SIPp提供Linux,Windows和HPUX平台的版本。Windows平台上的安装很简单,下面说一下Linux下的安装。

首先,可以从 http://sourceforge.net/projects/sipp/files/sipp/3.2/ 下载最新版的SIPp,解压之后就得到一个rpm文件,你可以使用rpm命令来完成安装。如果你拿到的是绿色版的SIPp,那么你需要对其重新编译才能使用。SIPp是用C++写的,因此系统必须支持G++才可成功编译。

SIPp支持四种不同的安装模式:

1) 没有TLS支持与密码验证支持:

a) # tar -xvf sipp-1.1rc6.tar.gzb)      

# cd sipp-1.1.rc6c)      

# makeMake  

出来的sipp文件就是一个可执行的文件,只需要搭配场景xml文件与csv文件即可进行SIP测试,这是最常用的安装。

 

2) 拥有TLS支持与密码验证支持,但是不支PCAP语音播放:

a) # tar -xvf sipp-1.1rc6.tar.gzb)

   # cd sipp-1.1.rc6c)

   # make ossl

这样编译出来的文件就加入了TLS至于与密码验证支持功能sipp软件了。

 

3) 支持PCAP Play,但是没有密码验证支持:(PCAP Play即为可以进行RTP语音,但是没有407 AUTH验证)

a) # tar -xvf sipp-1.1rc6.tar.gzb)

   # cd sipp-1.1.rc6c)

       # make pcapplay

 

4) 支持PCAP 声音文件播放,而且支持密码验证支持:(支持407 auth验证支持)

a) # tar -xvf sipp-1.1rc6.tar

b) # cd sipp-1.1.rc6

c) # make pcapplay_ossl

1.2      SIPp使用

用SIPp做测试的时候需要准备五个文件:uac.bat, uas.bat, uac.xml, uas.xml, data.csv。

uac.bat:调用sipp命令,并传入相应参数的批处理文件,模拟UAC(例如主叫)。

uas.bat:调用sipp命令,并传入相应参数的批处理文件,模拟UAS(例如被叫),当然也可不准备此文件直接输入sipp命令执行程序,但是写成文件执行更加方便可靠。

uac.xml:根据需要编写的uac侧的sip信号流程。

uas.xml:根据需要编写的uas侧的sip信号流程。

data.csv:用于uac.xml和uas.xml中需要引入的相应数据。

下面就举例来说明这五个文件的编写方法和用法。

 

1.2.1        uac.bat:

例:

sipp -sn uac 172.31.89.4:5060 -r 1 -rp 3000 -inf data.csv -p 7098 -i 172.31.89.242 -s 8001 -sf uac_onecall.xml –m 1000 –l 900

各个参数说明:

172.31.89.4:5060:远端地址和端口(在脚本中用[remote_ip],[remote_port]引入)

-r 1 -rp 3000:每三秒钟发一个呼

-inf data.csv:引入数据配置文件

-p 7098:本地端口(在脚本中用[local_port]引入)

-i 172.31.89.242:本地地址(在脚本中用[local_ip]引入)

-s 8001:被叫号码(在脚本中用[service]引入)

-sf uac_onecall.xml:引入脚本文件,根据需要模拟的呼叫流程编写

-sn uac :执行默认的uac流程,如需执行自己编写的流程文件,命令中应不含此参数

-m 1000:发送1000次呼叫后停止并退出。

-l 900 :最大同时保持呼叫量,默认值为3*caps值*呼叫时长,当因种种原因导致现存呼叫总数达到此值时,SIPp将停止产生新的呼叫,等待现存呼叫总数低于此值时才继续产生呼叫。

1.2.2        data.csv:

例:

SEQUENTIAL

8000;

第一行为取号码方式,通常为SEQUENTIAL或RANDOM

此例中只有一个数据,引入时用[field0],如果有多个数据,用分号隔开,在引用时编号递增如[field1],[field2]。

 

1.2.3        uac.xml:

例:

<scenario name="branch_client"> <send retrans="500"> <![CDATA[ INVITE sip:[service]@[remote_ip] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch];rport Allow: INVITE,CANCEL,ACK,BYE,OPTIONS,REFER,NOTIFY,MESSAGE,SUBSCRIBE,INFO From: "[field0]" <sip:[field0]@[local_ip]>;tag=[call_number] To: "[service]" <sip:[service]@[remote_ip]> Call-ID: [call_id] CSeq: 1 INVITE Contact: <sip:[field0]@[local_ip]:[local_port]> Max-Forwards: 70 Content-Type: application/sdp Content-Length:[len] v=0 o=[field0] 00 INIP4 [local_ip] s=SIP Call t=0 0 c=IN IP4 [local_ip] m=audio [media_port] RTP/AVP 0 a=rtpmap:0 PCMU/8000 ]]> </send>

  注:

1.需要sipp命令赋值的参数,请参考关于uac.bat的说明

[local_ip]、[local_port]、[remote_ip]、[remote_port]、[service]

2.sipp自动检测生成的参数:

[call_number]、[call_id]、[cseq]、[len]、[branch]

3.从数据配置文件引入的参数,请参考data.csv,第一个值为field0

4.CSeq: 1 INVITE:此处本来应该写成CSeq: [cseq] INVITE,而在对应的ACK中写成CSeq: [cseq] ACK,但在INVITE和ACK的中间夹杂有PRACK的时候,ACK如果写成上述形式,将不能与INVITE对应,所以可以写死。

5. 在测试业务时,应在头域中添加<Route:被叫侧地址>以保证呼叫会从AS路由到被叫,否则AS会发消息到默认的地址。

 

<recv response="100" optional="true">

  </recv>

注:按照预期,发出INVITE之后有可能受到100 Trying,也有可能收不到,所以加上可选标记

 

  <recv response="180">

  </recv>

注:此时如果收到180以外的响应,会异常退出。

 

<recv response="200"> </recv> <send> <![CDATA[ ACK sip:[service]@[remote_ip] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch];rport [last_From:] [last_To:] Call-ID: [call_id] Contact: <sip:[field0]@[local_ip]:[local_port]> CSeq: 1 ACK Max-Forwards: 70 Content-Length: 0 ]]> </send>

注:发送请求的时候不需要也不可能重新填写所有字段(比如说From字段是不需要,因为一个dialog里的From字段都是相同的;而To字段是没办法自己填写,必需从上一个响应中引入,因为To-tag是远端加上的,本地并不知道),所以可以用[last_字段名]的方式从上一个消息中取得。

通常From,To字段从上一个消息中取得,200的ACK时,Via从初始INVITE拷贝就可以,此时branch参数会自动生成跟初始INVITE不一样的值;非200的ACK时,采用从上一个消息引入的方式。

 

  <pause milliseconds="30000"/>

注:在通话状态维持30秒,以模拟实际通话持续通话的时间。

 

<nop> <action> <exec play_pcap_audio="C:\711.pcap"/> <exec play_pcap_video="C:\h263.pcap"/> </action> </nop>

注:在通话状态如果有需要的话可以发送媒体流。前提是在相应的目录下有媒体流文件

 

<send retrans="500"> <![CDATA[ BYE sip:[service]@[remote_ip] SIP/2.0 Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch];rport [last_From:] [last_To:] Call-ID: [call_id] CSeq: 2 BYE Max-Forwards: 70 Content-Length: 0 ]]> </send>

注:加入retrans参数之后可在没收到响应的情况下,在设定的时间之后重传,此例中为500毫秒。

 

<recv response="200"> </recv> <pause milliseconds="3000"/> <!-- 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>

 

2      常见问题:

1.Unable to bind main socket, errno = 125。

想绑定的本地端口已经被占用,换一个应该就可以了。

 

2、 while expecting '180' response, received 'SIP/2.0 200 OK

脚本中在发出INVITE之后要收100或者180,结果直接就收到了200。可以在180后面也加上optional="true"就行。

 

3、消息发出后无响应

需要确认远端即服务器端系统正常,并且uac.bat中的远端地址和端口正确,另外可能需要将本地地址加入为服务器的可信节点。

 

4、Can't open PCAP file '711.pcap'.

需要确认媒体流文件确实存在且路径正确,并且媒体流文件可用。

 

2.1      uas.bat

例:

sipp -sn uac 172.31.89.4:5060 -inf data.csv  -i 172.31.89.242 -p 8890 -s 8001 -sf uas_onecall.xml

关于各个参数的说明请参考uac.bat的说明

 

2.2      uas.xml

例:

<scenario name="branch_server"> <recv request="INVITE"> <action> <ereg regexp=".*" search_in="hdr" header="CSeq:" assign_to="6" /> <ereg regexp=".*" search_in="hdr" header=“Via:" assign_to="5" /> </action> </recv>

正则表达式使用说明:在本例中原本是不需要使用的,但在很多情况下需要使用,所以列出来说明一下。当sequence中带有PRACK时,UAS发送INVITE的200 OK时,某些字段(比如Via和Cseq)则不能使用[last_字段名]方式从上一个收到的消息中引入,因为此时上一个消息是PRACK,而不是INVITE,所以需要先将INVITE的这两个字段保存下来供以后使用。上面的用法便是将INVITE的CSeq字段的值保存为数字6,在以后发送INVITE的200 OK的时候使用,方式为:CSeq: [$6]

 

<send> <![CDATA[ SIP/2.0 100 Trying [last_Via:] [last_From:] [last_To:] [last_Call-ID:] [last_CSeq:] Content-Length: 0 ]]> </send>

注:基本上所有的字段都可以从上一个消息中引入。

 

<send> <![CDATA[ SIP/2.0 180 Ringing [last_Via:] [last_From:] [last_To:];tag=[call_number] [last_Call-ID:] [last_CSeq:] [last_Record-Route:] Contact: <sip:[local_ip]:[local_port]> P-Asserted-Identity: "[service]" <sip:[service]@[local_ip]> Content-Length:[len] ]]> </send>

注:To字段从上一个消息中引入的时候,需要添加To-tag,call_number为sipp自动生成的,在连续呼叫的时候会加1。从上一个消息引入相关字段的时候,如果上一个消息没有这个字段,则在本消息中也不会有。

 

<pause milliseconds="5000"/> <send> <![CDATA[ SIP/2.0 200 OK [last_Via:] Allow: INVITE,CANCEL,ACK,BYE [last_From:] [last_To:];tag=[call_number] [last_Call-ID:] [last_CSeq:] [last_Record-Route:] Contact: <sip:[local_ip]:[local_port]> P-Asserted-Identity: "[service]" <sip:[service]@[local_ip]> Content-Type: application/sdp Content-Length:[len] v=0 o=[service] 00 INIP4 [local_ip] s=SIP Call t=0 0 c=IN IP4 [local_ip] m=audio 10000 RTP/AVP 0 a=rtpmap:0 PCMU/8000 ]]> </send>

注:100,180,200的上一个消息都是INVITE消息,所以此时To字段中还是要加入To-tag,并且在一个dialog中call_number是相同的,所以能与180的To-tag保持一致。

 

<recv request="ACK"> </recv> <recv request="BYE"> </recv> <send> <![CDATA[ SIP/2.0 200 OK [last_Via:] [last_From:] [last_To:] [last_Call-ID:] [last_CSeq:] Contact: <sip:[local_ip]:[local_port];transport=[transport]> Content-Length: 0 ]]> </send>

注:cantact字段一定不能从上一个消息中引入。

 

<!-- 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="3000"/> <!-- 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>

 

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/20728.html

    分享给朋友:

    “SIP服务器 JAVA sip服务器软件” 的相关文章

    中国电信CN2网络费用解析:高效稳定,助力全球互联

    在全球化快速发展的今天,企业对国际网络的需求日益增长。无论是跨国企业的数据传输、海外分支机构的互联,还是个人用户对高质量国际带宽的需求,中国电信CN2网络凭借其卓越的性能和稳定的连接,成为了用户的首选。随着需求的增加,用户对CN2网络的费用结构也愈发关注。本文将深入解析中国电信CN2网络的费用体系,...

    探索日本V文化:从排球V联赛到Vtuber的多元化发展

    在谈到日本的多元化时,首先无法忽视的是“日本 v”这个词汇所涵盖的多个领域。它不仅代表了排球运动的一个新平台,也象征着现代金融科技,以及独特的二次元文化。这些领域虽然各自独立,但它们共同描绘出日本社会在多个层面上的文化与技术的融合。 1.1 日本排球V联赛 自2018年启幕以来,日本排球V联赛(V....

    使用getenforce命令管理SELinux执行模式的技巧与经验

    getenforce的基本概念 当我开始接触Linux系统的时候,SELinux这个名字总是让我感到神秘。经过逐渐的探索,我了解到SELinux(Security-Enhanced Linux)是一个强大的安全模块,它为Linux系统提供了细致的访问控制。这时候,getenforce命令便进入了我的...

    elkupi - 提供灵活抗投诉主机服务的领先选择

    在我探寻各种主机服务商时,elkupi是个让我印象深刻的名字。这家公司在业内存在已久,专注于提供一些特殊主机服务,尤其是在欧美国家法律限制较多的情况下,elkupi的优势尤为明显。它不仅能容纳一些法律上不太允许的内容,在抗投诉方面也表现得非常出色,几乎可以忽略不计。这一特点无疑吸引了很多需要这类服务...

    如何在PVE中使用OVA文件进行高效虚拟机管理

    在探讨PVE和OVA之前,我想分享一下我的个人体验。近年来,随着云计算和虚拟化技术的飞速发展,我们越来越频繁地接触到这些概念。PVE,即Proxmox Virtual Environment,成为了许多企业青睐的虚拟化解决方案。而OVA,则丰富了我们对动画内容的理解。接下来,我将分别介绍这两个重要的...

    P100 GPU价格分析及购买指南 - 如何选择性价比最高的GPU

    在如今的计算技术中,P100 GPU扮演了一个至关重要的角色。尤其是对于那些需要进行大量并行计算的任务,比如深度学习、科学模拟和数据分析,P100 GPU是一款极具吸引力的选项。作为NVIDIA推出的高性能计算单元,P100 GPU不仅具备强大的计算能力,还拥有一系列先进的技术规格,使其在行业中脱颖...