0

在某些消息传递系统中,两个消息传递客户端在聊天或语音通话中直接相互发送/接收数据包。我认为基本机制是(例如 TCP):这些客户端程序打开一个侦听 TCP 套接字并告诉消息/协调服务器他们的 IP/PORT 对。然后客户端程序从消息/协调服务器检索另一端的 IP/PORT。然后其中一个(假设 A)与另一个(假设 B)使用检索到的 B 的 IP/PORT 对启动 TCP。

当被动客户端 B(等待 TCP SYN 数据包)不在 NAT 或代理之后,这很好。但如果 B 在 NAT 或代理之后,那么 IP/PORT 对实际上是 NAT 或代理的公共网络接口。

所以我的问题是,当 NAT 或代理收到 TCP SYN 时,它的反应是什么?他们如何将 TCP SYN 中继到其后面的相应主机/进程?

4

2 回答 2

0

我怀疑您最初的假设是否正确。更有可能的是,它们都打开了与服务器的活动连接,并且服务器在它们之间路由数据。它更简单,您描述的问题消失了。

于 2013-04-02T22:59:33.083 回答
0

这个问题显然是很久以前提出的,但仍然......

聊天和语音/视频通话的处理方式通常完全不同。在聊天的情况下,您可能会使用 XMPP 协议,两端都将连接到服务器并通过它交换数据。XMPP 驻留在第 4 层的 TCP 上,因为在这种情况下,可靠性比延迟优先级更高。由于客户端是打开和维护连接的客户端,因此在这种情况下您不会遇到 NAT 问题。

另一方面,语音/视频通话要复杂一些,因此您通常需要:

  • 信令部分,您可以在其中协商设置呼叫所需的网络(IP 地址和端口)和编解码器详细信息(称为 SDP - 会话描述协议)
  • 媒体部分,您可以在其中有效地在 2 个通话方之间交换语音/视频内容。

信令通常通过 TCP 使用一些更高层的协议,如 SIP(​​会话发起协议)。这种通信将通过服务器。媒体使用 RTP(实时传输协议)等更高层协议通过 UDP,这部分通信通常是点对点的。单个 UDP 端口可用于传输和接收一个语音/视频通道的流量。此外,您可能希望在通话到位时获得有关通话质量的信息,因此您可以例如减少使用的带宽以避免/减少数据包丢失。为此,您将使用诸如 RTCP(实时传输控制协议)之类的协议。在这种情况下,NAT 穿越至关重要!由于两个客户端都不知道他们的公共 IP 地址,您需要一个位于您的内部网络(在公共互联网上)的服务器,它可以告诉“从外部如何看到您”,即在 NAT 后面。在例如 WebRTC 世界中,该服务器知道 ICE。在对等方发现它是如何从互联网上看到的之后,它将把该信息放在信令消息的 SDP 片段中,以便另一端可以通过互联网到达它。请记住,执行 NAT 的路由器可能还需要一些额外的设置来跟踪正在使用的语音/视频 UDP 端口(将来自 Internet 的流量 NAT 回传给您)。我会将该信息放在信令消息的 SDP 片段中,以便另一端可以通过互联网到达它。请记住,执行 NAT 的路由器可能还需要一些额外的设置来跟踪正在使用的语音/视频 UDP 端口(将来自 Internet 的流量 NAT 回传给您)。我会将该信息放在信令消息的 SDP 片段中,以便另一端可以通过互联网到达它。请记住,执行 NAT 的路由器可能还需要一些额外的设置来跟踪正在使用的语音/视频 UDP 端口(将来自 Internet 的流量 NAT 回传给您)。

最后,在这些情况下还使用了其他解决方案,但这取决于您的设置。如果您正在为最终用户编写软件,那么前面的解释将适用。但是,如果您正在为企业市场编写软件,那么在您的企业网络边界添加额外服务器(称为 EDGE)等解决方案将是一种常见的方法。

我可以写几个小时,但这应该足以开始...... :)

于 2017-08-31T16:22:34.163 回答