首页 > 其他分享 >介绍几种OPTIONS检测的方法

介绍几种OPTIONS检测的方法

时间:2023-07-05 18:26:11浏览次数:46  
标签:sip 检测 request 几种 10.55 SIP sipexer OPTIONS

 

概述

日常的VOIP开发中,OPTIONS检测是常用的网络状态检测工具。

OPTIONS原本是作为获取对方能力的消息,也可以检测当前服务状态。正常情况下,UAS收到OPTIONS心跳,直接回复200即可。

与ping不同的是,OPTIONS检测不仅仅针对网络状态,也针对sip server的端口状态进行检测,在VOIP问题定位中更精准。

环境

CentOS  release 7.0 (Final)或以上版本

freeswitch v1.10.7

new bing

sipp.3.6.2

sipexer-v1.1.0-linux-amd64

可选方案

freeswitch自带的OPTIONS检测

python脚本

sipp工具

sipexer工具

freeswitch自带的OPTIONS检测

freeswitch自带的OPTIONS检测可以通过配置gateway网关来启动,也可以针对注册的在线用户设置OPTIONS心跳检测,配置方法简单介绍如下。

gateway网关设置。修改conf/sip_profile/external/gw-137.xml

<include>

    <gateway name="gw-137">

        <param name="realm" value="10.55.55.137:5080"/>

        <param name="caller-id-in-from" value="true"/>

 

        <param name="register" value="false"/>

 

        <!--send an options ping every x seconds, failure will unregister and/or mark it down-->

        <param name="ping" value="20"/>

        <param name="ping-min" value="2"/>

        <param name="ping-max" value="3"/>

    </gateway>

</include>

 

针对注册的在线用户设置OPTIONS心跳检测,修改conf/sip_profile/internal.xml

    <param name="unregister-on-options-fail" value="true"/>

    <!-- Send an OPTIONS packet to all registered endpoints -->

    <param name="all-reg-options-ping" value="true"/>

    <!-- Send an OPTIONS packet to NATed registered endpoints. Can be 'true' or 'udp-only'. -->

    <param name="nat-options-ping" value="true"/>

    <param name="registration-thread-frequency" value="30"/>

    <param name="ping-mean-interval" value="30"/>

    <param name="ping-thread-frequency" value="1"/>

 

python脚本

github上很多,缺点是需要自己调试,适配符合的场景模式。

下面的脚本是使用new bing自动生成的脚本,未测试仅供参考。

好的,您可以使用Python内置的SIP库`sip`来发送OPTIONS请求。这个库可以在Python 3.7及以上版本中使用。您可以使用以下代码来实现您的需求:

 

```python

import sip

import sys

 

def send_options(remoteip, remoteport):

    sip.setapi('sip', 2)

    from sip import SIPRequest, SIPResponse

    from socket import socket, AF_INET, SOCK_DGRAM

    import time

 

    # Check if the IP address is valid

    try:

        socket(AF_INET, SOCK_DGRAM).connect((remoteip, remoteport))

    except OSError:

        print("Invalid IP address")

        return

 

    # Send OPTIONS request

    s = socket(AF_INET, SOCK_DGRAM)

    s.settimeout(5)

    sip_request = SIPRequest('OPTIONS', 'sip:{}:{};transport=udp'.format(remoteip, remoteport), 'SIP/2.0')

    sip_request.add_header('Via', 'SIP/2.0/UDP {}:{};branch=z9hG4bK-{}'.format(s.getsockname()[0], s.getsockname()[1], int(time.time())))

    sip_request.add_header('From', '<sip:test@{}:{}>;tag=1234'.format(s.getsockname()[0], s.getsockname()[1]))

    sip_request.add_header('To', '<sip:test@{}:{}>'.format(remoteip, remoteport))

    sip_request.add_header('Call-ID', '{}@{}'.format(int(time.time()), s.getsockname()[0]))

    sip_request.add_header('CSeq', '1 OPTIONS')

    sip_request.add_header('Contact', '<sip:test@{}:{}>'.format(s.getsockname()[0], s.getsockname()[1]))

    sip_request.add_header('Max-Forwards', '70')

    s.sendto(bytes(sip_request), (remoteip, remoteport))

 

    # Receive response

    try:

        data = s.recv(1024)

        response = SIPResponse(data.decode())

        print("Response received: {}".format(response.status_code))

        print(response.headers)

        print(response.body)

    except Exception as e:

        print("Error receiving response: {}".format(e))

```

 

其中,`send_options()`函数接受两个参数:`remoteip`和`remoteport`。这个函数会发送一个SIP OPTIONS请求到指定的IP地址和端口,并打印响应消息。如果请求失败,则会打印错误消息。

 

请注意,在使用此代码之前,请确保您已经安装了Python 3.7或更高版本,并且已经安装了`sip`库。

 

以上内容为new bing自动生成,未经测试。

sipp脚本

配置sipp号码文件call-test.csv,内容如下。

SEQUENTIAL

123456;13712345678;

 

增加sipp脚本文件uac-options.xml,内容如下。

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

<!DOCTYPE scenario SYSTEM "sipp.dtd">

 

<scenario name="Basic options UAC">

  <send retrans="500">

    <![CDATA[

 

      OPTIONS sip:[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=[pid]SIPpTag00[call_number]

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

      Call-ID: [call_id]

      CSeq: 10 OPTIONS

      Max-Forwards: 10

      Content-Length: 0

 

    ]]>

  </send>

 

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

  </recv>

 

  <ResponseTimeRepartition value="10, 20, 30"/>

 

  <CallLengthRepartition value="10, 50, 100"/>

 

</scenario>

 

使用sipp命令发起OPTIONS检测

sipp -i 10.55.55.138 -p 6666 -inf call-test.csv -sf uac-options.xml 10.55.55.137:5080 -rp 1000 -r 100 -l 8192 -m 1

 

可以查看sipp结果是成功或失败。

sipexer

sipexer工具内置OPTIONS功能,只需要简单的参数即可测试。

下载sipexer的发布包,并解压,即可得到sipexer的可执行程序。

wget https://github.com/miconda/sipexer/releases/download/v1.1.0/sipexer-v1.1.0-linux-amd64.tar.gz

tar -zxvf sipexer-v1.1.0-linux-amd64.tar.gz

ll

-rwxr-xr-x.  1 admin admin 8637840 6月  30 16:57 sipexer

 

测试,从本地发送OPTIONS检测到10.55.55.137:5080。

./sipexer sip:10.55.55.137:5080

 

[info] [sipexer.go:1578] main.SIPExerDialogLoop(): local socket address: 10.55.55.138:45585 (udp)

[info] [sipexer.go:1579] main.SIPExerDialogLoop(): local via address: 10.55.55.138:45585

[info] [sipexer.go:1580] main.SIPExerDialogLoop(): sending to udp 10.55.55.137:5080: [[---

OPTIONS sip:10.55.55.137:5080 SIP/2.0

Via: SIP/2.0/UDP 10.55.55.138:45585;rport;branch=z9hG4bKSG.29529ee2-2cad-47b6-b68e-d26cdccbc940

From: <sip:alice@localhost>;tag=d2c84867-447e-4d94-9216-bfb4c81d7441

To: <sip:bob@localhost>

Call-ID: 8b74f427-6458-407c-ad80-d52157041eee

CSeq: 596582 OPTIONS

Date: Mon, 03 Jul 2023 13:56:33 CST

User-Agent: SIPExer v1.1.0

Max-Forwards: 10

Content-Length: 0

 

 

[info] [sipexer.go:1582] main.SIPExerDialogLoop(): ---]]

 

[info] [sipexer.go:1633] main.SIPExerDialogLoop(): response-received: from=10.55.55.137:5080 bytes=597 data=[[---

SIP/2.0 200 OK

Via: SIP/2.0/UDP 10.55.55.138:45585;rport=45585;branch=z9hG4bKSG.29529ee2-2cad-47b6-b68e-d26cdccbc940

From: <sip:alice@localhost>;tag=d2c84867-447e-4d94-9216-bfb4c81d7441

To: <sip:bob@localhost>;tag=5Dta8ca41BQBF

Call-ID: 8b74f427-6458-407c-ad80-d52157041eee

CSeq: 596582 OPTIONS

Contact: <sip:10.55.55.137:5080>

User-Agent: FreeSWITCH-mod_sofia/1.6.19~64bit

Accept: application/sdp

Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY

Supported: timer, path, replaces

Allow-Events: talk, hold, conference, refer

Content-Length: 0

 

 

[info] [sipexer.go:1635] main.SIPExerDialogLoop(): ---]]

测试成功,OPTIONS正常收到200 OK响应。

总结

OPTIONS心跳检测在voip的应用过程中还是挺重要的,对于线路和sip应用的正常检测必不可少,配合zabbix等监控平台可以及时有效的发现问题。

不同的工具使用方式各有不同,需要根据实际场景确定。

 

空空如常

求真得真

标签:sip,检测,request,几种,10.55,SIP,sipexer,OPTIONS
From: https://www.cnblogs.com/qiuzhendezhen/p/17529480.html

相关文章

  • JAVA微服务分布式事务的几种实现方式
    基础理论CAP理论一致性(Consistency):在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误;可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致;分区容错性(Partitiontolerance):分布式......
  • STC89C52+DS18B20实现环境温度检测(数码管显示温度)
    一、项目介绍温度检测是工业自动化、生产线等众多领域中常见的应用场景之一,能及时准确地监测温度对于保障生产安全和提高生产效率有着非常重要的作用。而在现代的电子制造行业中,使用单片机和传感器等电子元器件进行温度检测已经成为了一个比较成熟的技术方案。本项目选择STC89C52单......
  • 目标检测数据增强之mosaic
    1、技术原理Mosaic是YOLOV4中提出的新方法,适用于目标检测,主要思想是将四张图片进行拼接到一张图上作为训练样本。由于Mosaic用于目标检测,进行拼接时目标框的坐标也要做相应的变化。Mosaic的主要操作如下:对每一张图进行随机裁剪得到A;crop的目标是选择原图的某一块区域,而不是全......
  • Sentieon实战:NGS肿瘤变异检测流程
      肿瘤基因突变检测是NGS的一个重要应用,其分析难点主要在于低频变异的准确性。不同于遗传病检测,肿瘤样本类型多样,测序方法和参数复杂,且缺乏对应各种场景的公共标准真集。再加上常用开源软件经常遇到的准确性低,稳定性差,速度慢等问题。这使得广大诊断公司在评估肿瘤变异检测工具......
  • 加速体细胞突变检测分析流程-系列2(ctDNA等高深度样本)
    Sentieon●体细胞变异检测系列-2  Sentieon致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率、准确度和可靠性。 针对体细胞变异检测,Sentieon软件提供两个模块:TNscope和TNhaplotyer2。 TNscope:此模......
  • 体细胞突变检测分析流程-系列1( WES&Panel)
    Sentieon●体细胞变异检测-系列1 Sentieon致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率、准确度和可靠性。 针对体细胞变异检测,Sentieon软件提供两个模块:TNscope和TNhaplotyer2。 TNscope:此模块......
  • 分布式事务的几种实现方式
    基础理论CAP理论一致性(Consistency):在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误;可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致;分区容错性(Partitiontolerance):分布式......
  • 41.C++中有几种类型的new
    41.C++中有几种类型的new在C++中,new有三种典型的使用方法:plainnew,nothrownew和placementnew(1)plainnew言下之意就是普通的new,就是我们常用的new,在C++中定义如下:void*operatornew(std::size_tsize)throw(std::bad_alloc){void*ptr=std::malloc(size);......
  • 34.C++有哪几种的构造函数
    34.C++有哪几种的构造函数C++中的构造函数可以分为4类:默认构造函数:在没有显式定义构造函数时,C++会自动生成一个默认构造函数,该函数没有参数,不执行任何操作。初始化构造函数(有参数)拷贝构造函数:当使用现有对象初始化新对象时,拷贝构造函数被调用。它的语法是在函数声明时使用一......
  • Java框架中常用的几种成熟的token生成框架对比
    Java框架中常用的几种成熟的token生成框架有:SpringSecurity:一个基于Spring的安全框架,提供了声明式的安全访问控制解决方案,支持多种认证和授权机制,如OAuth2.0、JWT等。ApacheShiro:一个轻量级的Java安全框架,提供了身份认证、授权、加密、会话管理等功能,支持多种数据源和缓存实......