【发布时间】:2011-10-05 08:45:13
【问题描述】:
情况:
我有一个关于ACK消息(黄色)的问题> 消息(紫色)。我正在谈论的 Asterisk 调用流程如下所示:
我的测试网络:
笔记本电脑+软电话----Asterisk ----笔记本电脑+软电话
问题:
我测试过的所有 Linux 软件电话(Twinkle、SFLPhone、Ekiga-Softon、Linphone 和 QuteCom)都没有等待 ACK 来启动 RTP 会话。我在 Asterisk 服务器上使用 iptables 过滤了 ACK 消息,并且 RTP 会话仍然启动。但是,由于我的项目意图,我想等待 ACK 消息,然后开始 RTP 会话。有没有办法、开关、命令或偏好让软电话等待 RTP 流,直到收到 ACK 消息?
补充:
我用谷歌搜索了很多,找到了一些设备,例如iiNet Branded Belkin VoIP Router 有以下选项:在收到 ACK 之前启动 RTP 会话 [默认值:关闭] 因此,我想一定有办法让 RTP 会话开始收到 ACK 后。
我发现最好的做法是在发送 200 OK + SDP 之后直接开始会话。但是,如上所述,这对我的项目来说还不够。
图源:
http://www.panoramisk.com/101/asterisk-and-voice-transport/en/
【问题讨论】:
-
您为什么要这样做?发送 ACK 是为了确保 INVITE 事务的最终响应通过,而不是作为最终响应加倍。一旦您的 SIP 用户代理获得最终的 2xx 响应,并且如果可以,它应该开始发送 RTP。
-
ACK 与 200 条 OK 消息相关,而不是与 INVITE 相关?!原因是,我想切换一些防火墙规则。但是在发送 200 OK 消息后,第一个 RTP 数据包在大约 1 分钟后开始。 13 毫秒。这还不足以通过 c 中的 system() 命令设置防火墙规则。因此,在设置防火墙规则之前,会发送 3 个 RTP 数据包。如果 RTP 会话在收到 ACK 后开始,那么我有足够的时间来设置 fw 规则。
-
2xx 消息是 INVITE 事务的一部分(注意 INVITE 事务和 INVITE 请求的区别,后者与响应和 ACK 一起是前者的一部分)。初始 RTP 数据包是否会导致防火墙出现问题? 3 个 RTP 数据包通常是大约 60 毫秒,当然少于 1 秒的音频,甚至连远端都不会注意到。
-
是的,我知道没那么多。但 RTP 数据包不只是被过滤。 RTP 数据包被发送到 NFQUEUE 并移交给用户空间。我正在用数据包做一些事情。这就是我需要所有数据包的原因。