Python端口转发

Python端口转发,python,port,forwarding,Python,Port,Forwarding,我正在用python开发一个客户机-服务器游戏,我想了解更多关于端口转发的知识 例如,我正在做的是将我的路由器(192.168.0.1)配置为允许我的真实IP地址请求重定向到我的本地地址192.168.0.X.它工作得非常好。但是我想知道我是否可以通过自动编码来实现它 我认为skype的工作原理类似于一种p2p,我可以在我的路由器中看到skype自动端口转发到我的pc地址。我也可以用Python来做吗 对于使用python实现端口转发,有一个奇妙的ActriveState配方,它只使用pytho

我正在用python开发一个客户机-服务器游戏,我想了解更多关于端口转发的知识

例如,我正在做的是将我的路由器
(192.168.0.1)
配置为允许我的真实IP地址请求重定向到我的本地地址
192.168.0.X.
它工作得非常好。但是我想知道我是否可以通过自动编码来实现它


我认为skype的工作原理类似于一种
p2p
,我可以在我的路由器中看到skype自动端口转发到我的pc地址。我也可以用Python来做吗

对于使用python实现端口转发,有一个奇妙的ActriveState配方,它只使用python标准库(套接字、晕厥)实现异步端口转发服务器。看


您可以这样看(假设您的路由器支持):

因此,如果我理解正确,您的应用程序需要进行TCP/UDP网络连接。这意味着至少有一个连接客户端需要一个正确打开的端口,如果它们都在NAT(路由器)后面,并且没有配置的打开端口,则您的客户端无法连接

对此,有几种可能的解决方案,但并非所有解决方案都是可靠的:如本文所述,UPnP可以按需打开端口,但并非所有路由器都支持(或启用)(这是一种安全威胁),而且P2P解决方案非常复杂,在某些客户端上仍然需要打开端口


唯一可靠的解决方案是拥有一个所有客户端都可以连接的专用服务器,该服务器将协商连接,并可能在它们之间进行代理。

这里有不同的解决方案,但大多数都不是微不足道的,您必须进行一些阅读,并且需要某种回退


这是最简单的。如果您的路由器支持它,并且配置为允许它,并且您知道如何编写低级网络代码或老式的SOAP web服务代码,那么您可以要求路由器为您分配一个端口。如果它成功响应,开始使用该端口,那么基本上就完成了


如果您可以为所有用户运行带有公共地址的(非常低带宽)服务器,则可能会解决此问题

想一想NAT客户端后面的服务器如何与公共服务器通信。您向某个IP和端口发出请求,但服务器看到的是您的路由器的IP,而不是您的(这是一件好事,因为您的路由器无法访问)。当它回复时,路由器必须知道如何将它转发给您,只要记住您是刚刚向该服务器发送请求的NAT客户机的后台

如果您不是与公共服务器交谈,而是与其他对等方在其单独的NAT后面交谈,该怎么办?嗯,你的路由器不知道区别;只要你从同一个地方得到回复,它就会通过。但是当你的信息无法通过他的NAT时,你如何得到回应呢?当然,他也做同样的事情。其中一条消息可能会丢失,但另一条会通过,然后你们两人都准备好了,可以交流了。你需要定期发送keep-alives,这样路由器就不会忘记你在通信,但除此之外,没有什么棘手的事情

唯一的问题是,您需要知道另一个对等方的公共IP地址,以及他希望您来自的端口,并且他需要知道关于您的相同信息。这就是为什么您需要一个服务器来充当对等方之间的介绍人

打孔可以在大多数家庭网络中使用UDP。它不适用于来自许多家庭网络的TCP,也不适用于来自许多公司网络的UDP或TCP。(此外,在公司网络中,您可能有多层NAT,这意味着您需要在每个接口处引入介绍人,而不是在internet上只有一层,或者是对称NAT,因为它们不能穿孔。)


您可以使用(或类似)服务,如ICE或TURN。这仅在有ICE、TURN等服务可供使用的情况下有效,而这通常不适用于不同家庭NAT上的两个对等方,除非您部署自己的服务器并构建介绍人来提供帮助,如果您要这样做,您可以使用打孔。但在企业环境中,这可能是为P2P应用程序提供连接的最佳方式


最后,您可以让用户手动配置端口转发,并在问题中输入转发的端口号。这并不理想,但您应该始终将其作为备用方案提供(可能只适用于公司部署的应用程序除外),因为其他任何东西都不适用于您的所有用户



我相信Skype使用了所有这些。如果您启用UPnP,它将尝试IGD您的路由器。或者您可以将其配置为使用TURN服务器。或者,您可以只输入手动转发的特定端口。如果您不执行上述任何操作,它将尝试使用UDP打孔,并使用Skype运行的介绍人。

Skype用户是连接到skpye服务器的客户端。开始“对话”时,不需要端口转发。查看不同可能技术的概述。这是个难题。在游戏的其他部分完成之前,不要担心这个问题。如何在Python中设置它?