发出 sip INVITE 请求时如何保留 rtp 端口

how to reserve rtp port when making a sip INVITE request

我正在开发一个 VOIP 软电话,我需要在我的 INVITE 请求中将 RTP 端口号放在 SDP 部分。我怎样才能找到一个空闲的 UDP 端口号来接受 RTP 数据包。 我找到了 2 个解决方案,但不知道它们是否是正确的方法。

解决方案 1:从一个 UDP 端口号(比如 7000)开始,看看它是否空闲,如果没有则增加 1 并继续直到找到空闲端口。然后在该端口上打开一个 UDP 套接字,这样其他呼叫就无法选择我的呼叫 RTP 端口。 然后发送请求。

解决方案2:从一个UDP端口号(比如7000)开始,看看它是否空闲,把它放在SDP中并发送请求。但是当我从另一方得到 OK 响应时(一段时间后),不能保证我为 RTP 宣布的端口号仍然可用。也许其他电话已经捕获了。

我想知道最好的方法是什么。

解决方案1是唯一一种在特定端口范围内预留端口号的方法。

如果你不在乎靠近特定端口号,只需打开一个值为0的端口以获得一个随机端口,当然该端口是空闲的。然后,用套接字的 API 检索真正打开的端口,并在你的 sdp!

中使用它

正如 AymericM 所建议的,您应该坚持您的解决方案 1。

您需要使用 bind 调用将套接字绑定到端口。

此外,RTP specification 声明 RTP 端口通常应为偶数,RTCP 端口为 rtp_port + 1。

For UDP and similar protocols, RTP SHOULD use an even destination port number and the corresponding RTCP stream SHOULD use the next higher (odd) destination port number.

即使在您通过单个端口支持 RTP/RTCP multiplexing 的情况下,应答者也可能不支持,因此在生成报价时绑定 RTP 和 RTCP 端口可能是个好主意。

总而言之,尝试绑定两个从偶数开始的连续端口,一旦找到两个合适的端口,就生成 offer/INVITE。