我可以在apache服务器上使用普通的PHP脚本进行打孔吗?

时间:2016-02-03 11:30:03

标签: php hole-punching

有一个概念,也许是一个黑客,我一直在困扰自己很长一段时间。我认为基本上, TCP连接套接字是一个变量。它包含有关目标的一些信息,它由程序内存中的某些特定字节表示。 字节可以通过互联网发送到其他计算机

该概念应该允许公共服务器在两个私有(防火墙或后面的路由器)计算机之间建立直接连接。谷歌搜索了一段时间后,我发现这个概念确实存在并被称为Hole punching

这与代理完全不同。看看 - 这是典型的代理/中继连接:

image description

数据流经公共服务器。绿色圆圈表示设备之间的套接字连接,蓝色线条表示数据流。

现在服务器将套接字A发送到设备B,反之亦然?

image description

突然间,两台设备都互相拥有“地址”,可以互相发送任何信息:

image description

我的问题是:PHP脚本是否允许获取共享该套接字信息所需的信息?如何防止套接字在PHP时间限制30秒后被终止?

1 个答案:

答案 0 :(得分:0)

这个问题对我来说有点混乱。您忽略了有关该计划中客户的任何细节,以及在它们之间建立联系的目的。如果您在尝试在两个HTTP客户端之间建立直接连接方面考虑这一点,那么您提出的建议是不可能的,因为客户端软件必须经过精心设计才能实现此目的。此外,HTTP客户端不能充当服务器。

我不同意将网络连接视为变量甚至是状态结构是有用的。虽然它在某种程度上是正确的,但网络连接的完整状态通常存在于许多不同的地方:

  • 应用程序状态 - 两个端点通常包含有关网络连接的高级状态,例如正在使用的第7层协议以及该协议的更多详细信息。
  • 内核状态 - 操作系统的网络状态将包含保存连接的某些低级详细信息的结构,例如TCP状态,MTU和许多其他内容。同样,对于两个主机都是如此。
  • NAT状态表 - 当涉及打孔时,这是一个棘手的问题。除了两个通信主机的状态之外,两端的NAT路由器都包含状态表,列出了每个相应NAT路由器所服务的主机的已建立连接。当数据包到达互联网时,该表用于确定在内部网络上发送数据包的位置。

打孔主要是为了欺骗NAT路由器在其状态表中设置正确的条目。这样做的确切方法取决于使用的第4层协议。您问题中的原理图显示了UDP打孔的典型流程,这需要一个可公开访问的服务器。在TCP的情况下,可能是您真正感兴趣的,服务器不一定需要开始。