我们正在使用Unix / Linux套接字构建聊天应用程序。目前我在理解何时需要端口转发时遇到问题。我们希望制作一种点对点类型的系统,其中聊天服务器仅用于将两个客户端连接在一起。在此之后,两个客户直接相互交谈。我的问题是,如果两个客户端正在互相交谈,那么他们在技术上有一个等待传入客户端连接的小型监听器(简单地说它们也有一个小型服务器),在这种情况下我们是否需要端口转发?提前致谢。
答案 0 :(得分:0)
这不是关于谁是服务器或谁是客户端,而是关于谁开始对话。
如果聊天客户端启动连接,则无需转发端口,因为路由器知道将数据包发送到何处。
如果服务器想要启动连接(或其他聊天客户端),他们会将数据包发送到路由器,因此路由器需要知道客户端在哪里,因此您需要转发端口。
TL; DR您不需要端口转发,只需告诉每个客户端其他客户端监听的位置。
答案 1 :(得分: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地址。侦听器接收入站连接的唯一方法是上游路由器是否知道将某个端口上的流量路由到该地址/端口。