SIP服務器性能測試工具SIPp使用指導(轉)


 

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>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM