当前位置: 首页 > news >正文

RTPProxy 命令协议

这是一个基于GitHub RTPProxy Wiki文档(RTPProxy Command Protocol)的中文翻译和详解。

由于 Wiki 页面可能会更新,以下内容涵盖了该文档中定义的核心协议标准。RTPProxy 主要是配合 OpenSIPS、Kamailio 或 Sippy B2BUA 使用的媒体代理服务器。


RTPProxy 命令协议 (RTPProxy Command Protocol)

RTPProxy 控制协议使用文本格式(ASCII)。虽然它主要是为通过 UDP 数据报发送而设计的,但也支持 Unix 域套接字(Unix domain sockets)和 TCP 套接字。

1. 一般消息格式

请求格式 (Request)

请求的语法通常如下:

[Cookie] <Command> [Command_Args] <Call-ID> [Command_Args]
  • Cookie: (可选) 一个任意的字符串,用于标识事务。如果请求中包含 Cookie,RTPProxy 会在响应中原样返回它。这有助于发送方将请求与响应进行匹配(类似于异步编程中的 Correlation ID)。
  • Command: 单个字符,表示要执行的操作(例如U,L,D,P,R,S,V,I等)。
  • Call-ID: SIP 消息中的 Call-ID,用于唯一标识一个会话。
  • Command_Args: 命令特定的参数。

响应格式 (Response)

响应的语法通常如下:

[Cookie] <Result> [Result_Args]
  • Cookie: 如果请求中有,这里也会有。
  • Result: 通常是端口号,或者是0(表示错误/忽略)。
  • Result_Args: 附加信息(例如 IP 地址)。

2. 核心命令详解

以下是协议中最常用的命令:

U命令 (Update / 更新)

这是最常用的命令,用于在 RTPProxy 中创建更新一个会话。通常在处理 SIP 的INVITE200 OK时调用。

语法:

U[Flags] [Callback_Socket] [Callback_Tag] <Call-ID> <Remote_IP> <Remote_Port> <From_Tag> [To_Tag]

参数:

  • Flags: 控制 RTPProxy 行为的选项(见下文“常用标志”)。
  • Callback_Socket/Tag: (可选) 用于通知超时或其他事件的回调地址。
  • Call-ID: SIP Call-ID。
  • Remote_IP: 对端(用户代理 UA)的 IP 地址(从 SDP 中获取)。
  • Remote_Port: 对端(UA)的 RTP 端口(从 SDP 中获取)。
  • From_Tag: 调用者的 Tag(用于区分 Caller 和 Callee)。
  • To_Tag: (可选) 被叫者的 Tag。

响应:
返回 RTPProxy 分配的端口号。如果请求中指定了外部 IP(非桥接模式),它可能只返回端口;如果涉及双网卡桥接,可能会返回端口 IP

U命令常用标志 (Flags):
  • a: 即使会话已存在,也记录地址信息(用于更新媒体地址)。
  • e: 外部接口(External)。指示 RTPProxy 在“外部”网络接口上分配端口。
  • i: 内部接口(Internal)。指示 RTPProxy 在“内部”网络接口上分配端口。
    • 注:ei常配合使用以实现双网卡 NAT 穿越/桥接。
  • 6: 使用 IPv6。
  • c: 更改呼叫 ID(较少用)。
  • l: 强制使用特定地址(Lookup)。
  • z: 比较 SSRC(用于检测流变化)。
  • R:Trust address (Latch)。不信任 SDP 中的 IP,而是等待并锁定第一个接收到的 RTP 数据包的源 IP/端口作为目标地址。这对于处理 NAT 后面的客户端至关重要。

L命令 (Lookup / 查找)

用于查找现有会话。通常用于检查会话是否处于活动状态,或者在不更新参数的情况下获取端口。

语法:

L [Call-ID] [Remote_IP] [Remote_Port] [From_Tag] [To_Tag]

响应:
返回现有的端口号;如果会话不存在,返回0


D命令 (Delete / 删除)

用于销毁/关闭会话。通常在处理 SIPBYECANCEL时调用。

语法:

D <Call-ID> <From_Tag> [To_Tag]

响应:
如果不带 Cookie,通常无响应或返回简单的确认。带 Cookie 时返回统计信息。


P命令 (Play / 播放)

用于将预先录制的音频文件注入到 RTP 流中(例如播放“等待音乐”或提示音)。

语法:

P[Flags] <Call-ID> <Rec_File> <Codec> <From_Tag> [To_Tag]

参数:

  • Rec_File: 服务器上的文件名。
  • Codec: 编解码器(如 g711a, g711u, g729 等)。

R命令 (Record / 录音)

用于开始或停止会话录音。RTPProxy 会将媒体流转储到文件中(通常是 pcap 格式)。

语法:

R[Flags] <Call-ID> <From_Tag> [To_Tag]

标志 (Flags):

  • P: 暂停录音。
  • S: 开始/恢复录音。

C命令 (Copy / 复制)

用于流复制(Forking)。通常用于合法监听(LI)或监控,将 RTP 流复制一份发往指定的 IP:Port。

语法:

C <Call-ID> <Dst_IP> <Dst_Port> <From_Tag> [To_Tag]

S命令 (Query / 统计)

检索 RTPProxy 的运行统计信息。

语法:

S

响应示例:

blocks=1000/2000 sent=50000 recv=50000 ...

返回关于数据包收发数量、会话持续时间等统计信息。


V命令 (Version / 版本)

查询支持的协议版本。

语法:

V

响应:
例如20040107(表示协议版本号)。


I命令 (Info / 信息)

返回简要的服务器信息,通常用于健康检查。


X命令 (Delete All / 删除所有)

危险命令。删除当前 RTPProxy 管理的所有活动会话。通常只在关机或重启脚本中使用。


Q命令 (Query Session / 查询会话)

用于获取特定会话的详细统计信息(如 TTL、统计计数器)。

语法:

Q <Call-ID> <From_Tag> [To_Tag]

3. 实际交互示例

假设:

  • SIP Call-ID:50140df0-1
  • Caller Tag:tag-1
  • Cookie:1234
  • Client SDP IP:192.168.1.50, Port:10000

示例 1: 建立会话 (Update)

OpenSIPS/Kamailio 发送请求:

1234 U 50140df0-1 192.168.1.50 10000 tag-1

解释: 带有 cookie “1234”,更新会话,Call-ID 为 “50140df0-1”,客户端媒体地址 192.168.1.50:10000,来自 tag-1。

RTPProxy 响应:

1234 35002 1.2.3.4

解释: 带有 cookie “1234”,分配的 RTPProxy 端口为 35002,RTPProxy 的 IP 为 1.2.3.4。

示例 2: 删除会话 (Delete)

请求:

1235 D 50140df0-1 tag-1

响应:

1235

(或者可能包含该会话的最终统计数据)

4. 总结

RTPProxy 协议是一个简单的请求-响应协议。它的核心在于U命令,通过不同的标志位(Flags)来处理复杂的网络环境(如 IPv4/IPv6 转换、NAT 穿越、内外网桥接)。对于使用 Kamailio/OpenSIPS 的rtpproxy模块的用户来说,这些命令通常被封装在模块函数(如rtpproxy_manage(),force_rtp_proxy())中自动处理,但在调试抓包时,理解上述原始协议非常有帮助。

http://www.jsqmd.com/news/347616/

相关文章:

  • DeepSeek-R1-Distill-Qwen-1.5B完整教程:CI/CD流水线集成模型更新自动化
  • QWEN-AUDIO实战案例:用‘温柔地’‘愤怒地’等自然语言控制语调的真实演示
  • Qwen3-VL-8B AI系统应用场景:保险条款解读与个性化保障建议生成
  • RTPProxy 2.2 用户手册
  • Whisper-large-v3模型监控教程:实时跟踪识别性能与质量
  • AI播客内容生产新方式:VibeVoice语音合成系统行业应用
  • Qwen3-TTS-12Hz-VoiceDesign实战:游戏本地化中多角色方言语音批量生成案例
  • 4个高效轻量模型推荐:Qwen1.5-0.5B-Chat镜像免配置测评
  • 零基础入门Qwen3-Reranker-4B:文本排序效果实测
  • HG-ha/MTools企业级应用:客服素材快速生成系统搭建
  • 小白必看:DeepSeek-R1-Distill-Qwen-1.5B保姆级使用指南
  • Whisper-large-v3在车载系统的应用:智能语音交互方案
  • 学术特供版Nano Banana来了!Google亲自下场,直接对齐NeurIPS审美
  • AcousticSense AI实战教程:用Gradio Event Listener实现音频上传自动分析
  • RexUniNLU效果可视化展示:动态JSON输出+高亮实体+关系图谱生成演示
  • translategemma-27b-it步骤详解:从Ollama拉取模型到响应延迟压测全过程
  • EcomGPT-7B开箱即用:电商场景下的实体识别与情感分析全攻略
  • Clawdbot办公自动化:Excel数据智能处理技能
  • 抖音内容集约化获取解决方案:从痛点诊断到价值挖掘
  • DeepSeek-R1-Distill-Qwen-1.5B性能优化:FlashAttention-2集成后显存降低22%,速度提升1.8x
  • 【C#模式匹配性能跃迁指南】:90%开发者忽略的5个编译器级优化技巧
  • RMBG-2.0高级应用:基于STM32的嵌入式图像处理
  • 深入对比Ceres、G2O与GTSAM:SLAM后端优化的三大框架实战解析
  • Qwen3-ASR-0.6B流式识别效果展示:实时转录会议录音
  • ERNIE-4.5-0.3B-PT在教育培训中的个性化应用
  • Visio流程图:Hunyuan-MT 7B系统架构设计与优化
  • PasteMD体验:一键复制完美Markdown的AI助手
  • 一键部署DeepSeek-R1-Distill-Qwen-7B:小白也能玩转AI推理
  • Sunshine开源部署与性能优化技术指南
  • go语言:实现经典ripple adder涟波加法器算法(附带源码)