SIP:等待被叫方ACK数据包以启动RTP会话

3

情况:

我有一个关于ACK消息(黄色)的问题,该消息从Asterisk发送到被叫方(电话B),在被叫方发送其200 OK + SDP消息(紫色)后发送。我所说的Asterisk呼叫流程如下:

我的测试网络:

笔记本电脑+软电话 ---- Asterisk ---- 笔记本电脑+软电话

问题:

我测试过的所有Linux软电话(Twinkle、SFLPhone、Ekiga-Softon、Linphone和QuteCom)都不等待ACK即可开始RTP会话。我在Asterisk服务器上使用iptables过滤了ACK消息,RTP会话仍然开始了。但是由于我的项目意图,我希望等待ACK消息,然后开始RTP会话。是否有一种方法、开关、命令或首选项可以让软电话等待接收到ACK消息后再开始RTP流?

附加信息:

我搜索了很多资料,并发现一些设备,例如iiNet品牌的Belkin VoIP路由器,它具有以下选项:在接收ACK之前启动RTP会话[默认值:关闭]因此,我想必须有一种方法可以让RTP会话在接收到ACK后开始。

同时,我发现最佳实践是会话直接在发送200 OK + SDP后开始。但是如上所述,这对我的项目来说是不足够的。


图像来源:

http://www.panoramisk.com/101/asterisk-and-voice-transport/en/


你为什么想要这样做呢?ACK是发送的,以确保INVITE事务的最终响应已经通过,而不是作为最终响应的重复。一旦您的SIP用户代理收到最终的2xx响应,并且如果它能够,它应该开始发送RTP。 - sipsorcery
ACK与200 OK消息相关,而不是INVITE?原因是我想切换一些防火墙规则。然而,在发送200 OK消息后,第一个RTP数据包大约在13毫秒后开始。这不足以通过C中的system()命令设置防火墙规则。因此,在设置防火墙规则之前会发送3个RTP数据包。如果在收到ACK后开始RTP会话,则有足够的时间来设置防火墙规则。 - xyz312
2xx消息是INVITE事务的一部分(请注意INVITE事务和INVITE请求之间的区别,后者与响应和ACK一起构成前者)。初始RTP数据包是否对您的防火墙造成问题? 3个RTP数据包通常约为60毫秒,肯定少于1秒的音频,甚至对远程端也不会有任何影响。 - sipsorcery
是的,我知道这不算太多。但是RTP数据包不仅仅被过滤了。RTP数据包被发送到NFQUEUE并交给用户空间处理。我正在对数据包进行一些操作。这就是为什么我需要所有数据包的原因。 - xyz312
1个回答

4
简短回答是不行;没有一个被广泛支持的设置可以让你强制RTP在ACK之后启动。最好的情况是你会发现一些设备/软电话,比如你提到的那个,有一个允许这样做的设置。我曾经在SIP实现者邮件列表上看到过这个问题,并且如果我记得正确的话,RFC并没有明确规定RTP应该在2xx响应或ACK之后启动,但通常认为是2xx响应。
另一个角度是寻找一个设置,或者甚至通过防火墙规则来发送不带SDP的初始INVITE。 RFC 3261支持不带SDP的INVITE,当它们被接收到时,表示2xx响应应该包含初始SDP提供,并且随后的ACK将具有SDP响应。通过这种机制,RTP将无处可去,直到发送ACK。

很遗憾,没有有效载荷的邀请发送不起作用。 - stalkerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接