介绍几种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等监控平台可以及时有效的发现问题。

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

空空如常

求真得真

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个只有几百K大小的绿色刻录软件。别看他小,功能却不少 ONES是一款高品质的“数字绿色刻录软件”。支持CD-ROM、CD、视频文件、MP3, WMA 或 WAV等。可自动识别错误。 简介:   ONES使用了新的刻录引擎,引入了全新的模糊逻辑“选项检查”引擎,可以对用户输入的所有选项与设定进行检查,报告刻录时可能出现的问题。这样就降低了出错的机率,防止用户作出不合理的设定。使用动态用户界面,可以同时适应新手和高手。支持各种刻录格式,并支持 RAW 模式以及直接复制。可以从MP3、WMA、WAV 等格式创建音乐辑。完全支持 CD Text,CD Extra,Pre-Gap,UPC 与 ISRC。 “绿色刻录软件”ONES使用教程:    偶然得知这个软件并试用后感觉很不错,就推荐给几个网友,本以为它的易用性不错使用应该不麻烦,不过从反馈来看,很多人觉得它并不好用,今天买了Pioneer DVR-107AXL刻录机后,用它烧了几张DVD-R刻录盘,很顺利而且读取流畅,就顺便写个使用教程,呵呵。   软件启动的速度很快,运行后,可以从图中看到它列出了我所有的光驱(包括用Daemon Tools和酒精虚拟的两个DVD驱动器),并能直观看到DVD刻录机里刻录盘的类型(DVD+R)和容量(4.37GB)。     软件功能区简介   Recording Actions / 刻录动作   Disc Copy 光盘复制   Audio Compilation 刻录CD光盘,源文件可以是wav、mp3和wma格式   Data Mastering 刻录CD/DVD数据光盘,这是我用的最多的功能,将进行详细介绍   Record DiscImage 将软件自己生成的di映像文件刻录成光盘,如何生成这种映像文件将在下文中提到   Record BIN/CUE Image 顾名思义,将cue/bin格式的映像文件刻录成光盘   Record Generic Image 将常用的映像文件刻录成光盘,支持这几种格式:iso、ima、bin、udi、udf   Record VIDEO_TS 刻录DVD影碟   Erase Disc 清除CD-RW/DVD±RW盘上的数据   Extraction & Tools / 扩展工具   Rip Audio 将CD唱片上的歌曲转换为wav或wma格式,帮助里说因为mp3经常被用于不正当的用途(也就是盗版)而wma的音质不差且支持的播放器众多所以ONES不支持转换为mp3格式,看来这个功能偶是不太会去用它了   Extract DiscImage 将di映像文件里的内容释放出来   Manage DiscImage 管理di映像文件,你可以复制、移动或删除映像文件,以及显示映像文件里的内容或调用Record DiscImage功能烧录映像文件   Compare Files 比较两个文件夹的内容异同,可以按数据方式进行精确对比 软件详细功能:   这个软件个头虽小,功能还是不少的,先来看看我的DVD刻录机信息吧,右击DVD刻录机盘符,选Drive Properties菜单项,可以看到这款先锋DVD刻录机支持的格式还是不少的,不过没有标识出对各种格式支持的最大读取/刻录速度是个不足之处。    软件对初学刻录者提供了向导功能,Action -> Wizard,然后按提示一步步做就行,但是在这种模式下受到一些限制,比如只能直接刻录而不能先测试及烧录完毕校验数据,不能修改卷标及用后文将提到的Reparent功能修改光盘布局,不建议使用。   刻录数据盘功能   ①工具栏,共14个按钮,从左至右分别为:   Open 打开预先存储的光盘排版布局文件.pth   Save 将排版好的光盘布局存储为.pth文件   Add Files/Folders 添加硬盘上的文件或文件夹,也可以直接从资源管理器中拖放过来   Remove 将选中的文件/文件夹从排版中移除   Reparent 和Nero或NTI等软件不同,如果你要在排版中改变某个文件/文件夹所在的文件夹名称或者放到一个子文件夹中,不是事先建好文件夹而是用这个按钮来进行修改,点击后将会弹出一个窗口,输入Folder文件夹名称后(为描述方便假设为test),再根据实际需要选择:   Add 将文件/文件夹放到test文件夹下   Subtitles 这项只对文件夹有效,就是在排版中修改文件夹的名称   Reset to default 修改过名称后若是发现改错了可以用这项恢复默认值   Force full path 文件/文件夹在硬盘上是什么路径,在光盘上也同样   Re-adjust Volume Name 将光盘卷标调整为默认的:月 日 年 时间   Move to Beginning 将光标所在处的文件/文件夹移至顶部   Move Up 将光标所在处的文件/文件夹移上一格   Move Down 将光标所在处的文件/文件夹移下一格   Move to End 将光标所在处的文件/文件夹移至底部   Refresh 刷新显示   Tile Explorer Horizontally 打开资源管理器并与其上下排列   Tile Explorer Vertically 打开资源管理器并与其左右排列   Untile 在按过上面两个按钮中的一个后这个按钮后这个按钮才可用,将资源管理器的窗口最小化并将ONES窗口大小恢复排列前的值   ②这两个地方是有关联的,所以一起标注,注意看右上的②,那个标识所需光盘容量的灰度条只有在你放入刻录盘后才会显示出来,再看左下角的②,光盘字的信息用红色显示表示要刻录的数据已经超过光盘容量,这时不但在右上角的②里显示Not enough space in disc说明光盘没有足够的空间,而且Record刻录按钮也变灰不可用必须移除一些文件或者设置超刻才行,这点可能是从DiscJuggler学来的   ③在第一贴中提到的生成的di映像文件功能就是这个按钮了,除了Record DiscImage和Erase Disc外其它的刻录动作中都有这个按钮   ④对RW可擦写光盘,选中此项可在刻录前先擦除光盘上的原有数据,一般用Quick快速擦除即可   ⑤超刻设置,如果要超刻的话点击下拉菜单选择一个容量即可,这点比Nero方便   ⑥自动弹出光驱仓门,默认为自动弹出,也可设置为不弹出及弹出后隔较短或较长时间后自动收回 刻录完成后的动作:   有:   Do Nothing 什么也不做   Result dialog 弹出一个结果窗口,显示刻录的时间等信息,这是默认值   Play sound 发声以提示刻录完毕   Result & Sound 发声并弹出结果窗口   Shut down 刻录完成后自动关机   最后再提一下菜单里的一个功能,View -> Keep as Default。   软件默认是用Mode 2不封盘烧录CD-R,每次都要调整为Mode 1封盘烧录?不需要这么麻烦,用这个菜单就行,View -> Keep as Default -> These options for new Data Mastering
1、 QAC介绍和使用说明 其他的功能概括 1、提供一种可量化措施的代码度量值属性:33基于功能 32基于文件和4个项目级别 2、功能结构关系图,以提供控制流动洞察 3、展示全局调用函数的关系图引用和文件树结构 4、提供统计分析对代码质量的全面评估 5、跨模块分析能力(CMA)、分析递归功能和全局标识符的各种问题 6、简化的旧代码修改的设置基准模块 Source..c文件通过分析工具生成3种文件source.c.i、source.c.met、source.c.err。source.c.i文件可以直接生成报告文件,.met、.err这两个文件可以分析出功能结构、关系、特征标准、报告或者进行跨模块分析,对于跨模块分析和剖析器分析需要进行配置,source.c.met、source.c.err、配置文件可以在信息浏览器中显示 2、 规划 2.1、自动生成文件及参数说明 生成自动文档步骤: 1、从文件菜单中选者Auto-Create Project 2、进入Root Folder Name,这是工程的根目录,后面的自动生成的文件都会对应此根目录产生 3、进入Starting Directory,这个源代码目录与工程的根目录相连 4、进入Output File Path,这里可以选择QAC分析后的输出文件,好的情况就是用一个专门的目录和工程根目录相连 5、Replicate source tree structure in output paths通常是为输出部分建立一个子目录结构,这里可以有2种选择,可以选择Parallel to Source Structure为源代码建立一个平行的目录结构,或者选择Sub-path to each source location把规定的输出的子目录嵌入到源工程目录下面 6、选择File Extensions可以加入项目,通常只要选择一个.C文件,包括对.H文件也就被加入 7、为文件夹选择一个个性,可能会使用默认设置为起始点,可以在QAC中选择Configuration菜单 8、点击OK就是建立了工程,包含源文件工程和子文件夹 9、保存文件,外部扩展名为.prj 注意:也可以在已有的项目上自动生成一个文件夹,点击菜单Edit > Auto-create Sub-Folders,其余步骤和以上相同 文件夹参数:包括文件夹名称、默认源路径、输出路径和三种个性 可以进入Edit > Folder Parameters只可以改变文件夹参数,进入Edit > Propagate Changes to Sub-Folders可以改变所有子文件夹参数 2.2、手动生成文档及参数说明 生成手动文档步骤: 1、从菜单File中选择New Project,显示一个对话框New Project Parameters 2、进入Root Folder Name,输入一个项目名称 3、进入Default Source Path为项目初始化文件夹,这个路径可以改变所有子文件夹 4、在Output File Path中选择需要输出的分析文档 5、为工程选个个性 6、点击 OK创建项目,这工程的配置是唯一的文件夹 7、按要求增加更多的子文件夹和文件按要求 8、保存文件,外部扩展名为.prj 文件夹参数;在File > Reopen这项中可以有10多个选项,当没用的文件可以选择Clean-up。 文件和目录的位置时重新打开项目,将检查的存在。如果不存在一个条目将显示下面的对话框。有的更正可以自动应用的过程。 2.3、选择输出文件 一般文件夹的层次结构在在左边显示,选择的列表在文件的右边显示 所有的选择都在Browse 和d Reports这两个菜单中 A、如果选择单个文件或一组文件,则使用 B、否则当前所选文件夹,再加上所有子其文件夹,窗体所选内容。这意味着使用这些文件夹中的所有文件。 在浏览器内修改,有可能会改变开始的选择,用Select Files…在File菜单内 2.4、互相比较和环境变化的报告 2.4.1、根路径 2.4.2、基于GUI的环境变量创建 2.4.3、相对路径和环境变量的运用 选择Apply Relative Paths项可以选择相对路径减少的所有文件条目,根目录在右上角,表示保存项目文件的位置,确定路径是否合适相对路径减少。 选择Make file paths in each folder relative to its Default Source Path entry项,如果想要应用一个虚拟的环境变量表达默认每个文件的源路径到其他文件条目下。 在Available Environment Variables列表下,可以添加EVs to Apply至右边框中,将这种替换只发生在项目中的项的文件或关联的路径不受相对路径减少的个性 选择Apply path reduction to personality file entries associated with the project项,为了继续应用相对路径和环境变量在文件路径下的个性定义 选择Remove all path reduction from the project and associated personalities项若要撤消所有的相对路径和环境变量从相关个性设置项目恢复到完全在所有情况下限定的路径 例如,一个被重建的“Diff”项目如下所示与充分的relative道路实施 3、 配置QAC 为应用程序配置主要通过可访问Configuration > Options选项卡,有以下几点: Annotated Source 附加说明源 Cross-Module Analysis 跨模块分析 Custom Reports 自定义报告 Default Personalities 默认特性 Editor Preferences 编辑选项 Environment 环境 (Product)Extensions (产品)条目 Project File Options 项目文件选择 要查看您的安装与那些一起中的个性的一组在您的项目中定义,可以在Configuration下选择Message Personalities, Analyser Personalities or Compiler Personalities这几个选项 当创建了一个额外的特性,也可以设置它们成为系统默认,在Configuration>Options>Default Personalities下设置 3.1、配置编译器特性 看附录A 3.1.1、设置系统头文件 在系统包括系统标题选项卡上的标题,设置您系统标头包含路径 可以点击Suppress Output阻止这些头文件,当阻止了那些头文件,一些从特定的头文件或路径中产生的分析数据也不能在.err、.met文件中出现 您可以手动输入是相对于当前项目的路径位置,虽然建议进行完整路径选择和然后将任何选择的道路减少保存项目的过程中的应用操作 3.1.2、设置系统宏 在System Macro Defines下的Project Macros菜单中,设置宏同编译器或开发环境一致,宏可以在Compiler Personality或Analyser Personality设置 3.1.3、设置实现定义的类型 在c编译器里有3中类型定义,在“implementation defined”中选择,如下: size_t 一种无符号必需类型通过sizeof操作表示返回类型 ptrdiff_t 一种有有符号必需类型用减法运算的两个指针来表示 wchar_t 它反映了类型的范围内的整数类型字符文本和宽字符字符串 在Data Types下的Intrinsic Types条目控制这些类型的方法实施,需要以匹配编译器配置环境。所载入的任何相应类型声明头文件(e.g. stddef.h, stdio.h)必须反映内在匹配值类型。如果不符合,qac提示等级9的警告,如有必要,检查您的头文件确定适当的设置这些选项。 如上所述:QAC随提供一套标准库的头文件,如果想改变这些类型定义,必须先明白QAC内部的定义类型,因为那些头文件包含一些声明ptrdiff_t, size_t 和wchar_t,还有3种宏指令定义PRQA_PTRDIFF_T, PRQA_SIZE_T,和PRQA_WCHAR_T, 3.1.4、编译器扩展 许多编译器制造商实施 ISO C 的扩展语言定义来利用特定的硬件环境。特别是在嵌入式软件代码的速度和空间是重要 使用的语言扩展的危险是他们妥协可移植性。源代码越来越依赖于编译器和硬件环境。 QA C 是能够分析各种不同的语言变体和扩展,但它不是通常能够解释扩展在语义上。通常,必须配置该工具等,非标准关键字将被忽略。 有几种方法可以为此配置QAC,看附录B–extensions部分

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值