【问题标题】:Client-Server Unix Sockets and port forwarding客户端-服务器 Unix 套接字和端口转发
【发布时间】:2016-02-23 20:15:01
【问题描述】:
我们正在使用 Unix/Linux 套接字构建一个聊天应用程序。目前我在理解何时需要端口转发时遇到问题。我们想创建一个点对点类型的系统,其中聊天服务器仅用于将两个客户端连接在一起。在此之后,两个客户直接相互交谈。我的问题是,如果两个客户端正在相互交谈,那么从技术上讲,它们有一个小型侦听器来等待传入的客户端连接(简单地说,它们也有一个小型服务器),在这种情况下我们是否需要端口转发?提前致谢。
When is port forwarding necessary?
【问题讨论】:
标签:
linux
sockets
client-server
portforwarding
【解决方案1】:
这不是关于谁是服务器或谁是客户端,而是关于谁开始对话。
如果聊天客户端启动连接,您不需要转发端口,因为路由器知道将数据包发送到哪里。
如果服务器想要启动连接(或其他聊天客户端),它们会将数据包发送到路由器,因此路由器需要知道客户端在哪里,因此您需要转发一个端口。
TL;DR 你不需要端口转发,只需告诉每个客户端另一个客户端在哪里监听。
【解决方案2】:
无论两个聊天客户端如何发现彼此,在某些时候,一个都必须启动与另一个的直接连接。
让我们称这两个端为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 地址。侦听器接收入站连接的唯一方法是上游路由器知道将某个端口上的流量路由到该地址/端口。