我有以下情况:
2 UAC正试图通过远程SIP服务器(openSER / Kamailio 3.1.3)=客户端基础设施进行通话。 UAC软件是在使用Asterisk的本地testing基础架构上开发的,可以在其中build立正常的呼叫。
问题是在客户端基础设施上testing没有audio。
我不了解完整的客户端基础结构,但是从服务器(路由头字段)的日志/响应可以得出结论:有一个代理授权服务器,一个CiscoSystem SIP GW以及PSTN。 而且,不仅仅是我们在NAT后面,客户端也在NAT后面。 AFAIK没有使用STUN服务器。
呼叫stream程的主要区别在于,在testing基础架构中,我们总是收到180个消息(响铃),而在客户端基础架构中,我们收到了183个正在进行的会话。 在日志中可以看到两台设备都开始发送rtpstream,但仍然没有audio。
我也有一个商业软件,我们用这个软件testing了客户端的基础设施,它工作正常。 我们比较了商业软件发送的消息和我们的客户,几乎没有什么区别。
我能find的唯一区别是在inv / 407 / ack循环之后的消息中:
商业软件:
开始新的分支号码x
发送inv + authstring – 分支/转发号码x
获取响应 – 分支/转发号码x
发送确认消息 – 分支/转发号码x
我们的客户:
开始新的分行号码y
发送inv + authstring – 分支/转发号码
获取响应 – 分支/转发号码
发送确认消息 – 新鲜的分支/交易 – z
这可能是导致audio丢失的原因吗? 在Asterisk中,这种情况也可以正常工作。
(我认为涉及的实体是RFC 3261 SIP设备,并且已经忽略了与RFC 2543设备的互操作。)
如果涉及NAT,你应该首先检查的是
c=头中的IP Contact标题中的IP 尤其是这些IP应该都可以被另一方访问。
在你的“inv / 407 / ack”后面,对非2xx应答的ACK应该有相同的branch ID。 但是,2xx响应会终止 INVITE事务,所以对2xx响应的ACK将具有与INVITE 不同的 branch 。
(当然, RFC 3261是SIP基础知识的权威资源,我发现RFC 3665非常有助于了解事情的工作原理。)