我正在用python开发一个客户端服务器游戏,我想了解更多关于端口转发的知识。
例如,我正在做的是将它配置到我的路由器(192.168.0.1)并将其配置为允许将请求重定向到我的本地adress 192.168.0.X.,它运行得非常好。但我想知道我能不能通过自动编码来做到这一点?
我认为skype的工作方式类似于一种p2p,我可以在我的路由器中看到skype是自动转发到我的个人电脑附件的。我也可以用Python做吗?
发布于 2014-07-31 21:36:12
这里有不同的解决方案,但大多数都不是琐碎的,您将不得不做一些阅读,您将需要某种形式的退步。
UPnP/IGD是最简单的。如果您的路由器支持它,并被配置为允许它,并且您知道如何编写低级的网络代码或老式的SOAP服务代码,您可以要求路由器为您分配一个端口。如果它成功地响应了,开始使用这个端口,您基本上就完成了。
如果您可以为所有用户运行一个具有公共地址的(非常低带宽)服务器,Hole punching可能会解决这个问题。
想想NAT背后的客户是如何与公共服务器对话的。您向某个IP和端口发出请求,但服务器看到的是路由器的IP,而不是您的IP(这是一件好事,因为您的路由器无法访问)。当路由器回复时,你的路由器必须知道如何将它转发给你--它只需要记住你是刚刚向服务器发送请求的NAT客户端。
如果你不是和一个公共服务器交谈,而是和他自己的另一个NAT后面的其他人交谈呢?嗯,你的路由器不知道有什么区别;只要你从同一个地方得到响应,它就能通过。但是,当你的信息无法通过他的NAT时,你如何得到回应呢?当然,他也是这么做的。其中一条信息可能会丢失,但另一条信息会传递出去,然后你们双方都可以进行交流。您需要定期发送“保持生命”,这样路由器就不会忘记您正在进行通信,但除此之外,没有什么棘手的问题。
唯一的问题是,您需要知道其他对等方的公共IP地址,以及他希望您来自的端口,而他也需要知道有关您的相同信息。这就是为什么你需要一台服务器-作为同龄人之间的介绍人。
打孔工作将与UDP从大多数家庭网络。它不适用于来自许多家庭网络的TCP,也不适用于来自许多公司网络的UDP或TCP。(此外,在企业网络中,您可能有多层NAT,这意味着您需要在每个接口上都有介绍者,而不仅仅是互联网上的一个,或者对称的NAT,它们不能被击打。)
您可以使用STUN (或类似的)服务,如ICE或转身。只有在有ICE、转弯等服务可以使用的情况下,这才能起作用--对于不同家庭not上的两个对等方来说,这通常不是这种情况,除非您部署了自己的服务器,并建立了一个介绍器来帮助解决问题,如果要这样做,您可以使用打孔方法。但在企业环境中,这可能是为P2P应用程序提供连接的最佳方式。
最后,您可以让用户手动配置端口转发,并在问题中输入转发端口号。这并不理想,但您应该始终将其作为后盾(除了仅用于企业部署的应用程序之外),因为对所有用户来说,其他功能都是行不通的。
我相信Skype会使用所有这些。如果您启用UPnP,它将尝试对您的路由器进行IGD。或者您可以将其配置为使用转服务器。或者只需输入手动转发的特定端口即可。如果你没有做上述任何一件事,它会尝试使用UDP打孔,并使用Skype运行的介绍器。
发布于 2014-07-31 21:22:55
因此,如果我正确理解,您的应用程序需要进行TCP/UDP网络连接。这意味着至少有一个连接客户端需要一个正确的开放端口,如果这两个客户端都位于NAT (一个路由器)之后,并且没有配置好的开放端口,则您的客户端无法连接。
对此有几种可能的解决方案,但并不是所有的解决方案都是可靠的:正如这里所建议的,UPnP可以按需打开端口,但不支持(或启用)所有路由器(这是一个安全威胁),而且P2P解决方案很复杂,仍然需要在某些客户端上打开端口。
唯一可靠的解决方案是拥有一个所有客户端都可以连接到的专用服务器,该服务器将协商连接,并可能在它们之间进行代理。
发布于 2014-07-31 21:17:50
您可以查看类似的内容(假设您的路由器支持它):traversal
https://stackoverflow.com/questions/25069005
复制相似问题