2013-04-02 17 views
0

在某些消息系统中,两个消息传递客户端在聊天或语音呼叫中直接发送/接收数据包。我认为基本的机制是(例如TCP):这些客户端程序打开一个侦听的TCP套接字并告诉消息/协调服务器他们的IP/PORT对。然后客户端程序从消息/协调服务器中检索对方的IP/PORT。其中一个(比方说A)然后用另一个(比方说B)与检索到的IP/PORT对B启动TCP。NAT或代理如何对传入的TCP SYN数据包做出反应?

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

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

回答

0

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

0

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

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

在另一方面,语音/视频通话更加复杂了一点,所以你通常有:

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

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

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

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

相关问题