【问题标题】:Can I make a hole-punch using normal PHP script on apache server?我可以在 apache 服务器上使用普通的 PHP 脚本打孔吗?
【发布时间】:2016-05-12 13:52:06
【问题描述】:

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

这个概念应该允许公共服务器在两台私人(防火墙或路由器后面)计算机之间建立直接连接。 google了一会儿,发现这个概念确实存在,叫Hole punching

它与代理确实不同。看看 - 这是典型的代理/中继连接:

数据流经公共服务器。绿圈代表设备间的socket连接,蓝线是数据流向。

现在服务器向设备 B 发送套接字 A 是什么,反之亦然?

突然之间,两台设备有了彼此的“地址”,可以互相发送任何信息:

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

【问题讨论】:

    标签: php hole-punching


    【解决方案1】:

    这个问题让我有点困惑。您忽略了在方案中提及有关客户端的任何细节,以及在它们之间建立连接的目的。如果您正在考虑尝试在两个 HTTP 客户端之间建立直接连接,那么您的提议是不可能的,因为必须专门设计客户端软件来促进这一点。此外,HTTP 客户端不能充当服务器。

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

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

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

    【讨论】:

    • 是的,整个 PHP 都在那里,因为我不想为服务器付费,而且 PHP 托管是免费的。否则我可以只运行一个用 Node.js、C++ 或其他东西编写的代理。但是我无法想象没有会合服务器如何进行打孔。你有什么细节吗?
    • 特别谈到 TCP,可能需要服务器来促进将地址发送给客户端,因为它们都需要知道彼此的地址。一旦两个客户端都知道主机,它就可以预测 NAT 使用的端口并尝试在两个方向上建立连接,之后其中一个主机可以关闭连接并打开侦听套接字。见en.wikipedia.org/wiki/TCP_hole_punching
    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2021-01-21
    • 2011-11-02
    • 1970-01-01
    • 2014-04-03
    • 2016-05-17
    • 2013-06-16
    • 2021-03-20
    相关资源
    最近更新 更多