![TCP/UDP 端口与端口转发](https://linux22.com/image/1503932/TCP%2FUDP%20%E7%AB%AF%E5%8F%A3%E4%B8%8E%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91.png)
我觉得自己对网络/互联网协议了解不够多。所以我的问题可能有点愚蠢。
如果我理解正确的话,TCP/UDP 端口对于服务器和客户端软件来说是“本地的”,并且仅与维持连接的设备相关;而用冒号附加到外部 IP 地址的端口对于路由器来说是“本地的”,因为它们仅与路由器相关,并且是为了找到没有唯一外部地址的设备。
因此,如果我是正确的,我只是想确保,如果您定义了一个函数:
TCPserver.listen(string ip, int port)
然后我可以这样做(当然取决于实施):
TCPserver.listen("123.456.789:18735", 1337)
而且两个端口之间互相没有任何关系,也不会互相干扰?
如果我说的不正确,那么我错在哪里?
答案1
监听器位于本地机器上。监听器指定的 IP 告诉它要监视哪个硬件(网络)接口,显然是在指定的端口上。
如果监听器配置在外部地址(机器外部,即不是localhost
)上,那么可能会从网络上的其他机器接收传入请求。
在大多数情况下,就像您的情况一样,互联网连接和计算机之间会安装一个路由器。
路由器的作用是将流量引导到正确的机器。因此,为了使您的服务可以从互联网上访问,您需要告诉路由器,必须将公共 IP(WAN/互联网)上的请求转发到正确的服务器。
这是通过在路由器的配置中启用端口转发,选择公共端口和目标私有 IP 和端口来完成的。
下面是一个 Web 服务器设置的简单示例,它可以绕过 ISP 对传入端口 80 请求的阻止:
WAN/public IP: 1.2.3.4
LAN: 192.168.0.0/24 (router's IP would typically be 192.168.0.1)
web server: 192.168.0.10:80
由于 ISP 阻止了端口 80,我们将改用端口 8080,因此我们的链接将是http://1.2.3.4:8080
。在路由器中,我们将把端口 8080 转发到192.168.0.10:80
。