6

我需要专家意见,如果我的问题本身是一个令人困惑的问题,我很抱歉。

我正在阅读有关 VOIP 应用程序(客户端/服务器)的结构。大多数情况下,建议将 UDP 用于语音流。我还检查了一些语音聊天应用程序,如 paltalk 和 inspeak,他们的网站提到他们使用 udp 语音流,这似乎不正确,原因如下。

我检查了 paltalk 和 inspeak 使用的流量/端口。他们打开了 UDP 和 TCP 端口,使用数据包嗅探器我可以看到没有太多的 UDP 通信,但主要是 TCP 通信正在进行。

另外据我所知,在 UDP 协议中,服务器无法将数据发送到 NAT(DSL 路由器)后面的客户端。并且“UDP Braodcast”不是基于“互联网”的语音聊天应用程序的选项。这就是为什么雅虎在他们的文档中提到,如果无法进行 udp 通信,雅虎信使会切换到 tcp。

所以我的问题是......

  1. 我在上述陈述中是否理解错误?

  2. 如果 UDP 不可行,那么那些聊天应用程序使用 TCP 流进行语音?

  3. 由于我经历过 TCP 语音流会产生延迟,没有语音中断但语音延迟,那么语音聊天服务器/客户端通信的最佳结构应该是什么?

到目前为止,我认为,如果客户端将数据作为 udp 数据包发送到服务器并且服务器通过 TCP 流将数据包分发给客户端,这是一个合适的解决方案吗?我的意思是这就是商业语音聊天应用程序的作用吗?

感谢您的回答将帮助我和许多其他程序员。

杰夫

4

2 回答 2

3

UDP 的开销较小(就总数据包大小而言),因此您可以将更多音频压缩到通道的带宽中。

UDP 也是不可靠的——发送的数据包可能永远不会被接收到或者可能被乱序接收——这对于语音应用来说实际上是可以的,因为你可以容忍一些信号质量的损失并继续前进。可以容忍少量丢失的数据包(与下载文件相反,其中每个字节都很重要)。

你可以使用 TCP 吗?当然,为什么不......它的开销略大,但这可能无关紧要。

SIP是一种支持 UDP 和 TCP 的语音/媒体标准。由于开销较低,大多数部署都使用 UDP。

Skype 协议在可能的情况下首选 UDP,并回退到 TCP。

在 SIP 情况下,NAT 问题通过使用 nat keep-alive 数据包(任何请求/响应数据)来保持通道打开和打开,并利用大多数 NAT 将在同一源端口上接受连接的事实来解决是从...打开的,这不是万无一失的,并且通常需要代理服务器来调解 2 个 nat'd 对等点之间的连接,但它在许多部署中都有使用。

STUN、TURN 和 ICE 是有助于 NAT 场景的附加方法,尤其是在 p2p(无服务器)情况下。

有关 NAT 问题和媒体的信息:

http://www.voip-info.org/wiki/view/NAT+and+VOIP

http://en.wikipedia.org/wiki/UDP_hole_punching

http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html

如果您正在实施某种语音服务,像 FreeSwitch 这样的系统提供了将媒体传送到分布式客户端所需的大部分工具:

http://www.freeswitch.org/

于 2010-01-19T22:10:09.400 回答
1

我看到这个问题逾期 3 年,但我没有看到任何答案被接受,所以我会试一试

1-你的陈述是正确的

2-正确,TCP或UDP可用于音频流。

3- 为音频流结合 tcp 和 udp 没有用。如果 UDP 用于传输到服务器,它将用于接收,这就是所有 NAT 防火墙的工作方式,即它们在更改 ip 标头以使数据包看起来来自它们之后,将从内部主机接收到的数据报发送到远程主机,并且当他们收到响应时,他们会将其转发回内部主机。NAT 防火墙之间的区别在于 NAT 隧道将保持活动的时间,但这对于呼叫的音频部分并不重要,因为在呼叫过程中双向都有持续的音频流。这对于使用 SIP 协议的呼叫的信令部分更为重要。因此,我建议将 TCP 用于 SIP,因为 TCP 会话的默认超时时间为 900 秒,从而减少了需要保持活动消息的频率。

现在您提到的一些应用程序不使用 SIP 进行会话启动,因此具有专有的信令方式。

其他应用程序利用称为“打孔”的东西来允许客户端到客户端的直接通信(或点对点),例如 Skype。这样做的好处是服务器不会停留在语音流的中间,这可以有效地减少延迟,使 TCP 成为音频流的潜在选择。

Asterisk(著名的开源 PBX)开发者已经意识到 SIP 中需要打开大量端口的问题,他们开发了自己的协议,称为 IAX,通过一个端口传输信令和媒体。我鼓励您考虑为您的客户端/服务器实现 IAX,因为它确保如果客户端能够连接(通过信令),那么它就能够进行调用。

于 2013-12-03T12:04:06.537 回答