通过SDP连接RTP和SIP的过程地面线

时间:2010-05-23 09:05:06

标签: networking network-protocols sip rtp sdp

我在启动媒体会话并将其与我的SIP客户端相结合时遇到问题。我设计了一个递归的SIP客户端,根据RFC中提到的可接受序列和我读过的例子,重用相同的请求模板将下一个请求发送到服务器。据我所知,SIP部分正在为服务器邀请工作,并进行身份验证。我没有完成对客户端的任何调用,因为内容标题需要填写(我还没有这样,所以我从服务器获得了503,我猜)。

很长一段时间我都不知道从哪里开始媒体会话,慢慢学会了如何使用JMF,我构建了一个处理RTP传输的对象,现在我站在十字路口,一方面我有我的SIP信令,但它需要SDP内容头来完成邀请,另一方面我有RTP知道如何p2p。

为了完成我的设计,我需要您的帮助以解决以下问题:

  1. 是否轻松 // 简单 // 已实施方式转换JMF的音频/视频格式进入SDP媒体标头?或者甚至是生成器,我会输入内容标题的所有参数,它会快速生成内容标题,还是我必须自己实现?

  2. 一旦我完成了SDK的构建并且SIP启动并运行,我从服务器得到了一个OK响应(在响铃之后),我该如何启动媒体会话?根据我在SIP邀请中发送的来电者详细信息连接p2p?

  3. 如果2是正确的,那么与陆地线的连接将如何?陆地线是否知道一旦他们向服务器发送OK,他们就会在特定端口上监听/启动RTP会话?

  4. 还是我弄错了? : - /

    我真的很感激我能得到的任何帮助,我看着每个地方寻找答案,但他们不清楚,他们忽略问题2,好像这是显而易见的事情,但对我而言,事实并非如此。

    提前感谢, 亚当泽哈维。

    加了:

    首先感谢您的回复以及您帮助我的时间。

    我将回到问题2:

      

    一旦收到Ok响应,您就会知道SIP用户代理服务器(UAS)正在侦听的IP套接字(您的意思是地址:PORT是否正确?)以及它接受的编解码器可以开始发送您的RTP。

    好的,我明白了,我想知道另一件事,在这个通话时间我将RTP数据包发送到UAS,UAS用作两个UAC之间的桥梁。

    现在......我可以使用SIP实例化对话,然后将客户端信息从一个发送到另一个并在两台计算机之间建立P2P,没有任何中间人(UAS),然后处理SIP会话吗?

    我希望我现在能更好地解释自己......

    谢谢, 亚当。

1 个答案:

答案 0 :(得分:4)

对于1,我对JMF一无所知,因此无法直接回答,但SDP实际上并不是一个复杂的标准,与SIP不同,因此构建SDP数据包应该不那么困难。构建SDP数据包所需的最小值是您提供的编解码器和您接受RTP的IP套接字。

对于2,一旦得到Ok响应,您将知道SIP用户代理服务器(UAS)正在侦听的IP套接字以及它接受的编解码器,并且可以开始发送您的RTP。同时你应该开始从UAS接收RTP,因为它会在发送Ok的同时开始发送。当然,您还需要发送SIP ACK请求以响应Ok响应,否则一些UAS将假设响应未通过,并且一段时间后将终止呼叫。如果您刚刚开始编写自己的SIP堆栈,那么还有很长的路要走!

对于3,是的,虽然通过固定电话你真的是指SIP-to-PSTN网关(PSTN端将类似于ISDN,SSL或模拟)。 PSTN网关的SIP端与任何其他SIP UAS相同,一旦接受INVITE请求,它将开始向请求中指定的套接字发送RTP tp,同样将开始在它已放置的套接字上侦听RTP。响应将被发送回您的SIP客户端。

<强>更新

  

现在......我可以使用SIP实例化对话,然后将客户端信息从一个发送到另一个并在两台计算机之间建立P2P,没有任何中间人(UAS),然后处理SIP会话吗?

答案是肯定的,但你的术语有点令人困惑。已建立的SIP呼叫称为会话,始终位于用户代理客户端(UAC)和用户代理服务器(UAS)之间。每个SIP代理都应该能够扮演UAC或UAS的角色,这两个角色之间的主要区别在于UAC启动呼叫并且UAS应答它。对于它启动的呼叫,特定的SIP设备将处于UAC角色,而对于它应答的呼叫,UAS角色将处于UAS角色。

为什么此UAC和UAS描述相关?因为所有SIP通信都是点对点的。 SIP不是客户端/服务器协议。这是一种点对点协议。现在它确实变得混乱,因为你将拥有运行SIP代理服务器或SIP PSTN 网关的VoIP提供商,这使得它看起来好像SIP确实在客户端 - 服务器模型上运行但事实并非如此。

所以我认为你真正想问的问题是UAC到B2BUA到UAS之间的SIP呼叫(实际上是两个独立的呼叫或SIP会话:UAC到UAS / UAC到-UAS)让媒体绕过B2BUA,而是直接在UAC和UAS之间直接传输。这个问题的答案是肯定的。像Asterisk这样的B2BUA有一个名为canreinvite的SIP配置选项,如果设置为yes将导致它一旦响应就将re-INVITE发送到呼叫的任一端,以使RTP直接在呼叫端点之间流动,而不是通过自身桥接当然,如果需要编解码器转码,录制或等效功能,它将不会尝试重新邀请。不同的方法是传统的SIP代理方法,例如OpenSER使用的方法,它根本不用于桥接媒体,通过它的所有呼叫将始终导致RTP直接位于呼叫两端的SIP设备之间。工作方式是OpenSER只是简单地将从UAC收到的请求转发到UAS,除了添加和/或修改额外的SIP报头或两个INVITE请求之外,就好像UAC已将其直接发送到UAS

一切都清楚如泥?以下是一些有助于您进一步阅读的链接。

Tech-invite - 非常好的SIP场景示例,

RFC5359 Session Initiation Protocol Service Examples - 更多例子,

SIP Sorcery forums - 我运行的公共服务的论坛网站,如果你有更深入的SIP问题,那么一些知识渊博的人经常光顾这些问题。