这个问题显然是问很久以前,但仍...
聊天和语音/视频通话,通常的处理方式完全不同。在聊天的情况下,您可能会使用XMPP协议,其中两端将连接到服务器并通过它交换数据。 XMPP驻留在第4层上的TCP上,因为可靠性优先于此情况下的延迟。由于客户端是打开和维护连接的客户端,因此在这种情况下您不会遇到NAT问题。
在另一方面,语音/视频通话更加复杂了一点,所以你通常有:
- 信令部分,在那里你洽谈必要的网络(IP地址和端口)和编解码器的详细信息设置呼叫(称为SDP - 会话描述协议)
- 媒体部分,您可以在两个呼叫方之间有效交换语音/视频内容。
信令通常通过使用SIP(会话发起协议)等一些更高层协议进行TCP。该通信将通过服务器。媒体使用RTP(实时传输协议)等高层协议通过UDP,这部分通信通常是点对点通信。单个UDP端口可用于传输和接收一个语音/视频通道的流量。此外,您可能希望在通话就绪时获得有关通话质量的信息,因此您可以减少使用的带宽以避免/减少数据包丢失。为此,您需要使用像RTCP(实时传输控制协议)这样的协议。在这种情况下,NAT穿越至关重要!由于客户都不知道他们的公共IP地址,所以你需要一个内部网络服务器(在公共互联网上),它可以告诉你“如何从外部看到”,即在NAT后面。在例如WebRTC这个服务器的世界知道ICE。当对方发现它在互联网上是如何显示的时候,它会将这些信息放入信令消息的SDP片段中,以便另一端可以通过互联网到达它。请记住,执行NAT的路由器可能还需要一些其他设置,以保持语音/视频UDP端口的使用情况(将NAT上的流量从互联网NAT转回给您)。
最后,还有其他解决方案在这些情况下使用,但这取决于您的设置。如果您正在为最终用户编写软件,则以前的解释将适用。但是,如果您正在为企业市场编写软件,那么在企业网络边界处的附加服务器(称为EDGE)等解决方案将是一种常见方法。
我可以写几个小时,但这应该是足够的开始... :)