SIP压力测试最好的工具,SIPp的安装与使用 (第二章)

第一章如何编写场景xml文件

在编写场景xml文件之前,首先要懂得SIP得整个消息流程。SIPp是通过xml场景文件读取后,根据xml定义得流程去分析下一步要进行得动作。因此,熟悉了xml文件得定义内容、同时也要了解整个SIP消息发送流程,那么就很容易编写xml文档了。

1

模拟若干个注册包到AST,AST回 407 authentication,SIPp发送invite带auth验证消息到AST,AST回100 tring 和200 ok。SIPp回Bye消息,AST回200 ok。

Register­-----------àAST

401ß----------------AST

Register-----------àAST

100ß----------------AST

200ß----------------AST

编写该SIP得发包流程得场景xml文件内容如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

 

<!-- This program is free software; you can redistribute it and/or      -->

<!-- modify it under the terms of the GNU General Public License as     -->

<!-- published by the Free Software Foundation; either version 2 of the -->

<!-- License, or (at your option) any later version.                    -->

<!--                                                                    -->

<!-- This program is distributed in the hope that it will be useful,    -->

<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of     -->

<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      -->

<!-- GNU General Public License for more details.                       -->

<!--                                                                    -->

<!-- You should have received a copy of the GNU General Public License  -->

<!-- along with this program; if not, write to the                      -->

<!-- Free Software Foundation, Inc.,                                    -->

<!-- 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA             -->

<!--                                                                    -->

<!--                 Sipp default 'branchc' scenario.                   -->

<!--                                                                    -->

 

<!— 首先发送SIP注册消息,Register。里面的From与To是注册的号码       à

<scenario name="branch_client">

  <send retrans="500">

    <![CDATA[

 

      REGISTER sip:[remote_ip] SIP/2.0

      Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]

      From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[call_number]

      To: [field0] <sip:[field0]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 1 REGISTER

      Contact: sip:[field0]@[local_ip]:[local_port]

      Content-Length: 0

      Expires: 300

 

    ]]>

   </send>

 

  <!--  SIPp会收到来自AST要求验证的401 消息体,Recv意思为Receive,接收到来自AST的401要求验证的消息,Next为如果收到401,那么转至Label为1的地方进行操作           à     

  <recv response="401" auth="true" next="1">

  </recv>

   

  <!--  send invite with authentication messages -->

  <!—  开始发送Register消息,里面将把验证的密码消息发送给对方,在消息体里面是抓不到密码消息的,而且已经被md5方式加密过。因此通过ethereal是无法抓到的。à

<label id="1"/>

  <send retrans="500">

  <![CDATA[

 

      REGISTER sip:[field0]@[remote_ip]:[remote_port] SIP/2.0

      Via: SIP/2.0/[transport] [local_ip]:[local_port]

      From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[call_number]

      To: [field0] <sip:[field0]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 2 REGISTER

      Contact: sip:[field0]@[local_ip]:[local_port]

      [field1]

      Content-Length: [len]

      Expires: 3600

    ]]>

  </send>

 

  <!--   收到来自AST的200 ACK消息后,系统转至等待1000ms,或者可以直接去掉该设置 à

  <recv response="200"  next="2">

  </recv>

 

  <label id="2"/>

  <pause milliseconds="1000"/>

  

  

  <!-- 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

模拟多个封包发送Invite消息到AST,AST回407要求验证,SIPp发送invite消息带407 请求验证的消息到AST,AST返回200 ok。SIPp收到200 ok,延迟1000ms后发送bye消息到AST,AST返回200 ok。

Invite ―――――――――>AST

401 ß-----------------AST

Invite with auth--------àAST

200 ok <------------------AST

Pause 1000

Bye---------------------àAST

200 ok ß-----------------AST

XML文件内容如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

 

<!-- This program is free software; you can redistribute it and/or      -->

<!-- modify it under the terms of the GNU General Public License as     -->

<!-- published by the Free Software Foundation; either version 2 of the -->

<!-- License, or (at your option) any later version.                    -->

<!--                                                                    -->

<!-- This program is distributed in the hope that it will be useful,    -->

<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of     -->

<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      -->

<!-- GNU General Public License for more details.                       -->

<!--                                                                    -->

<!-- You should have received a copy of the GNU General Public License  -->

<!-- along with this program; if not, write to the                      -->

<!-- Free Software Foundation, Inc.,                                    -->

<!-- 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA             -->

<!--                                                                    -->

<!--                 Sipp default 'uac' scenario.                       -->

<!--                                                                    -->

 

<!--  发送Invite消息到asterisk,from为主叫号码,to为被叫号码         -à

<scenario name="Basic Sipstone UAC">

  <!-- In client mode (sipp placing calls), the Call-ID MUST be         -->

  <!-- generated by sipp. To do so, use [call_id] keyword.              -->

  <send retrans="500">

    <![CDATA[

 

      INVITE sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 1 INVITE

      Contact: sip:[field0]@[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 0

      a=rtpmap:0 PCMU/8000

 

    ]]>

  </send>

<!--  收到来自AST的407要求验证消息                                   -à

  <recv response="407" auth="true">

  </recv>

<!--  首先发送200 ACK消息到AST                                        --à

  <!-- Packet lost can be simulated in any send/recv message by         -->

  <!-- by adding the 'lost = "10"'. Value can be [1-100] percent.       -->

  <send>

    <![CDATA[

 

      ACK sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

      Call-ID: [call_id]

      CSeq: 1 ACK

      Contact: sip:[field0]@[local_ip]:[local_port]

      Max-Forwards: 70

      Subject: Performance Test

      Content-Length: 0

 

    ]]>

<!---  接着发送invite带407请求验证消息                                ―――>

  </send>

 

  <!-- This delay can be customized by the -d command-line option       -->

  <!-- or by adding a 'milliseconds = "value"' option here.             -->

 

  <!-- Send 407 Authentication messages                                 -->

  <send retrans="500">

  <![CDATA[

 

      INVITE sip:[field0]@[remote_ip]:[remote_port] SIP/2.0

      Via: SIP/2.0/[transport] [local_ip]:[local_port]

      From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 2 INVITE

      Contact: sip:[field0]@[local_ip]:[local_port]

      [field2]

      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=-

      t=0 0

      c=IN IP[media_ip_type] [media_ip]

      m=audio [media_port] RTP/AVP 0

      a=rtpmap:0 PCMU/8000

    ]]>

  </send>

  <!---    SIPp收到来自AST的100 trying消息                         ――>

  <recv response="100" >

  </recv>

  <!--  延迟5000ms后,发送Bye消息到AST                              ――>

  <pause milliseconds="5000"/>

  <!-- The 'crlf' option inserts a blank line in the statistics report. -->

  <send retrans="500">

    <![CDATA[

 

      BYE sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

      Call-ID: [call_id]

      CSeq: 2 BYE

      Contact: sip:[field0]@[local_ip]:[local_port]

      Max-Forwards: 70

      Subject: Performance Test

      Content-Length: 0

 

    ]]>

  </send>

  <!-- SIPp收到200 OK消息                                            ――>

  <recv response="200" crlf="true">

  </recv>

 

  <!-- 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>

 

3

SIPp发送Invite消息到AST,AST回407要求密码验证,SIPp返回200 ok,并发送invite带密码消息到AST,AST返回200 OK,接着返回180,SIPp此时开始传输RTP到AST,延迟5000ms发送DTMF=1的号码,然后SIPp发送Bye消息到AST,AST返回200 ok给SIPp。

Invite-―――――---――>AST

407 <-------------------->AST

Invite with auth--------àAST

200 ok<------------------>AST

180 ring<---------------->AST

    RTP==================>AST

    DTMF digits 1========>AST

    BYE------------------>AST

200 OK<-------------------AST

XML文档描述如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

 

<!-- This program is free software; you can redistribute it and/or      -->

<!-- modify it under the terms of the GNU General Public License as     -->

<!-- published by the Free Software Foundation; either version 2 of the -->

<!-- License, or (at your option) any later version.                    -->

<!--                                                                    -->

<!-- This program is distributed in the hope that it will be useful,    -->

<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of     -->

<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      -->

<!-- GNU General Public License for more details.                       -->

<!--                                                                    -->

<!-- You should have received a copy of the GNU General Public License  -->

<!-- along with this program; if not, write to the                      -->

<!-- Free Software Foundation, Inc.,                                    -->

<!-- 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA             -->

<!--                                                                    -->

<!--                 Sipp 'uac' scenario with pcap (rtp) play           -->

<!--                                                                    -->

 

<scenario name="UAC with media">

  <!-- In client mode (sipp placing calls), the Call-ID MUST be         -->

  <!-- generated by sipp. To do so, use [call_id] keyword.                -->

  <send retrans="500">

    <![CDATA[

 

      INVITE sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 1 INVITE

      Contact: sip:[field0]@[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[local_ip_type] [local_ip]

      t=0 0

      m=audio [auto_media_port] RTP/AVP 8

      a=rtpmap:8 PCMA/8000

      a=rtpmap:101 telephone-event/8000

      a=fmtp:101 0-11,16

 

    ]]>

  </send>

 

  <recv response="407" auth="true">

  </recv>

 

  <!-- 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.                             -->

  <!-- Packet lost can be simulated in any send/recv message by         -->

  <!-- by adding the 'lost = "10"'. Value can be [1-100] percent.       -->

  <send>

    <![CDATA[

 

      ACK sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

      Call-ID: [call_id]

      CSeq: 1 ACK

      Contact: sip:[field0]@[local_ip]:[local_port]

      Max-Forwards: 70

      Subject: Performance Test

      Content-Length: 0

 

    ]]>

  </send>

 

  <send retrans="500">

  <![CDATA[

 

      INVITE sip:[field0]@[remote_ip]:[remote_port] SIP/2.0

      Via: SIP/2.0/[transport] [local_ip]:[local_port]

      From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 2 INVITE

      Contact: sip:[field0]@[local_ip]:[local_port]

      [field2]

      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=-

      t=0 0

      c=IN IP[media_ip_type] [media_ip]

      m=audio [auto_media_port] RTP/AVP 0

      a=rtpmap:0 PCMU/8000

    ]]>

 </send>

 

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

 </recv>

 

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

 </recv>

 

 <recv response="200" rtd="true" crlf="true">

 </recv>

  <!-- Play a pre-recorded PCAP file (RTP stream)                       -->

  <nop>

    <action>

      <exec play_pcap_audio="pcap/g711a.pcap"/>

    </action>

  </nop>

 

  <!-- Pause 8 seconds, which is approximately the duration of the      -->

  <!-- PCAP file                                                        -->

  <pause milliseconds="5000"/>

 

  <!-- Play an out of band DTMF '1'                                     -->

  <nop>

    <action>

      <exec play_pcap_audio="pcap/dtmf_2833_1.pcap"/>

    </action>

  </nop>

 

  <pause milliseconds="5000"/>

 

  <!-- The 'crlf' option inserts a blank line in the statistics report. -->

  <send retrans="500">

    <![CDATA[

 

      BYE sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

      Call-ID: [call_id]

      CSeq: 2 BYE

      Contact: sip:[field0]@[local_ip]:[local_port]

      Max-Forwards: 70

      Subject: Performance Test

      Content-Length: 0

 

    ]]>

  </send>

 

  <recv response="200" crlf="true">

  </recv>

 

  <!-- 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>

 

3

SIPp发送Invite消息到AST,AST回407要求密码验证,SIPp返回200 ok,并发送invite带密码消息到AST,AST返回200 OK,接着返回180,SIPp此时开始传输RTP到AST,延迟5000ms发送DTMF=1的号码,然后SIPp发送Bye消息到AST,AST返回200 ok给SIPp。

Invite-―――――---――>AST

407 <-------------------->AST

Invite with auth--------àAST

200 ok<------------------>AST

180 ring<---------------->AST

    RTP==================>AST

    DTMF digits 1========>AST

    BYE------------------>AST

200 OK<-------------------AST

XML文档描述如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE scenario SYSTEM "sipp.dtd">

 

<!-- This program is free software; you can redistribute it and/or      -->

<!-- modify it under the terms of the GNU General Public License as     -->

<!-- published by the Free Software Foundation; either version 2 of the -->

<!-- License, or (at your option) any later version.                    -->

<!--                                                                    -->

<!-- This program is distributed in the hope that it will be useful,    -->

<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of     -->

<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      -->

<!-- GNU General Public License for more details.                       -->

<!--                                                                    -->

<!-- You should have received a copy of the GNU General Public License  -->

<!-- along with this program; if not, write to the                      -->

<!-- Free Software Foundation, Inc.,                                    -->

<!-- 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA             -->

<!--                                                                    -->

<!--                 Sipp 'uac' scenario with pcap (rtp) play           -->

<!--                                                                    -->

 

<scenario name="UAC with media">

  <!-- In client mode (sipp placing calls), the Call-ID MUST be         -->

  <!-- generated by sipp. To do so, use [call_id] keyword.                -->

  <send retrans="500">

    <![CDATA[

 

      INVITE sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 1 INVITE

      Contact: sip:[field0]@[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[local_ip_type] [local_ip]

      t=0 0

      m=audio [auto_media_port] RTP/AVP 8

      a=rtpmap:8 PCMA/8000

      a=rtpmap:101 telephone-event/8000

      a=fmtp:101 0-11,16

 

    ]]>

  </send>

 

  <recv response="407" auth="true">

  </recv>

 

  <!-- 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.                             -->

  <!-- Packet lost can be simulated in any send/recv message by         -->

  <!-- by adding the 'lost = "10"'. Value can be [1-100] percent.       -->

  <send>

    <![CDATA[

 

      ACK sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

      Call-ID: [call_id]

      CSeq: 1 ACK

      Contact: sip:[field0]@[local_ip]:[local_port]

      Max-Forwards: 70

      Subject: Performance Test

      Content-Length: 0

 

    ]]>

  </send>

 

  <send retrans="500">

  <![CDATA[

 

      INVITE sip:[field0]@[remote_ip]:[remote_port] SIP/2.0

      Via: SIP/2.0/[transport] [local_ip]:[local_port]

      From: [field0] <sip:[field0]@[local_ip]:[local_port]>;tag=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>

      Call-ID: [call_id]

      CSeq: 2 INVITE

      Contact: sip:[field0]@[local_ip]:[local_port]

      [field2]

      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=-

      t=0 0

      c=IN IP[media_ip_type] [media_ip]

      m=audio [auto_media_port] RTP/AVP 0

      a=rtpmap:0 PCMU/8000

    ]]>

 </send>

 

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

 </recv>

 

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

 </recv>

 

 <recv response="200" rtd="true" crlf="true">

 </recv>

  <!-- Play a pre-recorded PCAP file (RTP stream)                       -->

  <nop>

    <action>

      <exec play_pcap_audio="pcap/g711a.pcap"/>

    </action>

  </nop>

 

  <!-- Pause 8 seconds, which is approximately the duration of the      -->

  <!-- PCAP file                                                        -->

  <pause milliseconds="5000"/>

 

  <!-- Play an out of band DTMF '1'                                     -->

  <nop>

    <action>

      <exec play_pcap_audio="pcap/dtmf_2833_1.pcap"/>

    </action>

  </nop>

 

  <pause milliseconds="5000"/>

 

  <!-- The 'crlf' option inserts a blank line in the statistics report. -->

  <send retrans="500">

    <![CDATA[

 

      BYE sip:[field0]@[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=[call_number]

      To: [field1] <sip:[field1]@[remote_ip]:[remote_port]>[peer_tag_param]

      Call-ID: [call_id]

      CSeq: 2 BYE

      Contact: sip:[field0]@[local_ip]:[local_port]

      Max-Forwards: 70

      Subject: Performance Test

      Content-Length: 0

 

    ]]>

  </send>

 

  <recv response="200" crlf="true">

  </recv>

 

  <!-- 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值