2015-11-21 147 views
0

我们正在构建一个使用Unix/Linux套接字的聊天应用程序。目前我在理解何时需要端口转发时存在问题。我们希望制作一个聊天服务器仅用于将两个客户端连接在一起的系统的点对点类型。在此之后,两个客户直接对话。我的问题是,如果两个客户端正在相互交谈,那么他们在技术上就有一个等待客户端连接的小监听器(简单地说他们有一个小服务器),在这种情况下我们需要端口转发吗?提前致谢。客户端 - 服务器Unix套接字和端口转发

When is port forwarding necessary?

回答

0

这不是关于谁是服务器或谁的客户端,但关于谁开始了谈话。

如果聊天客户端启动连接,则不需要转发端口,因为路由器知道在哪里发送数据包。

如果服务器想要启动连接(或其他聊天客户端),他们会将数据包发送到路由器,以便路由器需要知道客户端在哪里,因此您需要转发端口。

TL; DR您不需要端口转发,只需告诉每个客户端其他客户端在哪里侦听。

0

无论两个聊天客户端如何相互发现,在某个点上,必须启动与另一个聊天客户端的直接连接。

我们称双方为connecting方和publishing方(因为第一方建立到另一方发布的IP地址的连接)。

这个connecting这边有简单的工作,因为它知道publishing这边的外部IP地址和端口。它可以发送SYN数据包来建立连接,并且您的住宅路由器将它发送到互联网。路由器将透明地将此连接NAT,因此入站流量将被正确路由到建立连接的计算机。

但是...... publishing侧应该暴露什么IP地址?如果有多台电脑坐在住宅路由器后面,那么这些电脑都会有内部IP地址(例如10.0.0.1,10.0.0.2等)。路由器有一个“真实”的外部IP地址,但是任何去往那里的流量(不是NAT)都会在路由器上停止,因为它不知道要去哪个内部IP地址。

一种解决方案是在已知端口(例如7876)上的路由器上配置端口转发。任何发往7876的入站数据包将路由到配置的内部地址(可能不同)的端口。

这是相当不灵活,无法进入许多用户来说,这样一种技术是打孔 - 看Can P2P be done without port forwarding?

问题,在问题中提到的“听众”,是它需要绑定到一个内部IP地址。监听器接收入站连接的唯一方法是上游路由器知道将某个端口上的流量路由到该地址/端口。

相关问题