测试 rtpengine 的 sip-source 参数

修改 /etc/rtpengine/rtpengine.conf 文件,增加一行配置:

sip-source = true # 一般不需要这样配置,本文仅为说明问题

offfer 部分的日志如下:

[1713246486.390578] DEBUG: [1-5025@192.168.43.126]: [control] Dump for 'offer' from 127.0.0.1:34943: { "supports": [ "load limit" ], "sdp": "v=0
o=XRMG 1704250570 3 IN IP4 10.143.1.14
s=XRMG V2.0
c=IN IP4 10.143.1.14
t=0 0
m=audio 30608 RTP/AVP 8 101
c=IN IP4 10.143.1.14
b=AS:82
b=RS:600
b=RR:2000
a=rtpmap:8 PCMA/8000
a=ptime:20
a=sendrecv
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
", "replace": [ "origin", "session-connection" ], "call-id": "1-5025@192.168.43.126", "via-branch": "z9hG4bK-5025-1-00", "received-from": [ "IP4", "192.168.43.126" ], "from-tag": "5025SIPpTag001", "command": "offer" }

这里 sip-source 的地址(来自 received-from)为 192.168.43.126,端口来自 sdp 里面的 30608

接下来的日志为:

 [core] set FILLED flag for stream, local 192.168.43.126:36912 remote 192.168.43.126:30608

远端地址不是 sdp 的 c 地址,而是 sip-source

源码里面 trust_address 如果为 true 代表采用 sdp 的 c 地址,跟 sip-source 的意思正好是反过来的

// call_interfaces.c

// ...

static void call_ng_flags_flags(struct sdp_ng_flags *out, str *s, void *dummy) {
	str_hyphenate(s);

	switch (__csh_lookup(s)) {
		case CSH_LOOKUP("trust-address"):
			out->trust_address = 1;   // sdp c address
			break;
		case CSH_LOOKUP("SIP-source-address"):
		case CSH_LOOKUP("sip-source-address"):
			out->trust_address = 0;  // sip-source
			break;
// sdp.c
// ...
static int fill_endpoint(struct endpoint *ep, const struct sdp_media *media, struct sdp_ng_flags *flags,
		struct network_address *address, long int port)
{
	struct sdp_session *session = media->session;

	if (!flags->trust_address) {
		if (is_addr_unspecified(&flags->parsed_received_from)) {
			if (__parse_address(&flags->parsed_received_from, NULL, &flags->received_from_family,
						&flags->received_from_address))
				return -1;
		}
		ep->address = flags->parsed_received_from; // sip-source
	}

目前版本的 rtpengine 默认的配置就是 trust-address,不再是 sip-source

熟悉 kamailio 的都知道,havfo 的脚本牛的很,现在可以解读一下了:

request_route {
    # per request initial checks
    route(REQINIT);


    if (nat_uac_test(64)) {
        # Do NAT traversal stuff for requests from a WebSocket
        # connection - even if it is not behind a NAT!
        # This won't be needed in the future if Kamailio and the
        # WebSocket client support Outbound and Path.
        force_rport();
        if (is_method("REGISTER")) {
            fix_nated_register();
        } else if (!add_contact_alias()) {
            xlog("L_ERR", "Error aliasing contact <$ct>\n");
            sl_send_reply("400", "Bad Request");
            exit;
        }
    }
 

# nat_uac_test(64) 就是测试信令是不是 WebSocket

# 如果是 WebSocket,那么需要 force_rport, 因为 Via 地址根本不可达

route[NATMANAGE] {

        # ...

        if (!nat_uac_test("8")) {
            $xavp(r=>$T_branch_idx) = $xavp(r=>$T_branch_idx) + " trust-address";
         }

# nat_uac_test("8") 测试sdp里面的地址是不是 rfc1918

# 如果不是 rfc1918,那么 trust-address,当时写这个脚本的时候,rtpengine 的版本应该比较旧

onreply_route {
    if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT)
        && !(proto == WS || proto == WSS))) {
        xlog("L_WARN", "SIP response received on $Rp\n");
        drop;
    }

    if (nat_uac_test(64)) {
        # Do NAT traversal stuff for replies to a WebSocket connection
        # - even if it is not behind a NAT!
        # This won't be needed in the future if Kamailio and the
        # WebSocket client support Outbound and Path.
        add_contact_alias();
    }
}
 

# reply 路由块的处理

# 先检查接收端口

# 再做 nat_uac_test(64) 检查,也就是终端是不是 WebSocket

# 如果是,那么需要 rewrite contact, 因为 WebSocket 的 contact 地址根本不可达

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAIN-SIP-RI(Java API for Integrated Networks - Session Initiation Protocol Reference Implementation)是一个基于 Java 的开源 SIP(Session Initiation Protocol)协议的参考实现。它提供了一套 Java API,用于开发基于 SIP 的通信应用程序。 JAIN-SIP-RI 是 JAIN(Java API for Integrated Networks)项目的一部分,旨在为开发人员提供一个标准化的、可扩展的 SIP 协议栈来构建 VoIP(Voice over IP)和实时通信应用程序。它实现了 SIP 协议中的核心功能,如建立、修改和终止会话,以及处理 SIP 消息。 JAIN-SIP-RI 提供了一些关键的组件和功能,包括: 1. SIP 协议栈:JAIN-SIP-RI 实现了 SIP 协议的各个层级,包括请求和响应的解析、序列化、路由和事务管理等。 2. SIP 呼叫控制:JAIN-SIP-RI 提供了呼叫控制的功能,包括呼叫建立、呼叫转移、媒体协商等。 3. 事件和监听器:JAIN-SIP-RI 使用事件和监听器模型,可以通过注册监听器来处理 SIP 消息和状态变化。 4. 事务管理:JAIN-SIP-RI 支持事务管理,可以处理 SIP 请求和响应的事务性操作。 5. SDP(Session Description Protocol)支持:JAIN-SIP-RI 提供了对 SDP 协议的支持,用于描述会话中的媒体流和参数。 使用 JAIN-SIP-RI,开发人员可以构建基于 SIP 的应用程序,如 VoIP 客户端、呼叫中心应用程序、实时音视频通信应用程序等。它提供了一套标准化的 API,使开发人员能够更轻松地处理 SIP 协议和相关的通信功能。 您可以在 JAIN-SIP-RI 的官方网站(https://github.com/RestComm/jain-sip)上找到更多关于 JAIN-SIP-RI 的详细信息、文档和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值