我编写了一个程序来建立对等链接。该程序可在http://basyl.co.uk/code/punch/doc/files/Readme-txt.html找到,它分为两部分:在公共主机上运行的服务器;以及由所需对等链路的每一端使用的客户端。
我可以访问两个公共服务器:“bonn”(home.contextshift.co.uk)和“entropy”(home2.contextshift.co.uk)
如果服务器在 bonn 并且客户端在 bonn、entropy 和我的家用 PC(在 NAT 之后)上运行,则 entropy 的穿孔连接可以毫无问题地与我的 PC 通信。但是,从波恩到 PC 的连接失败;来自 PC 的数据到达波恩,但从波恩通过 NAT 孔返回的数据永远不会到达。
如果服务器再次处于熵状态,则客户端在波恩、熵和我的 PC 上运行,所有客户端之间的穿孔连接都可以正常工作。
这是令人困惑的,因为服务器不参与对等数据流。如果你还和我在一起,这里是流程:
- Client-A 通过 TCP 链接连接到 Server 并获得唯一的令牌;
Client-B 通过 TCP 链接连接到 Server 并获得唯一的令牌;
Client-A 和 Client-B 通过他们的 TCP 链路接收更新,告诉他们还有谁连接;
客户端 A(或 B)通过新创建的 UDP 链接向服务器发送请求,传递其令牌和客户端 B 的名称;
服务器从令牌中识别出Client-A,并通过其TCP链接将请求转发给Client-B,在请求中包括A的UDP地址/端口号;
客户端 A(或 B)通过新创建的 UDP 链接向服务器发送确认,传递其令牌和客户端 A 的名称;
服务器从令牌中识别出Client-B,并通过其TCP链接将请求转发给Client-A,在请求中包括B的UDP地址/端口号;
A 和 B 现在有了对方的 UDP 地址/端口,可以互相 ping 通并交换数据。
如您所见,服务器从不讨论客户端为他们的请求创建的 UDP 链接,只在 TCP 链接上进行对话。
因此,总而言之,当服务器位于同一主机上时,客户端无法在特定主机上工作。关于这种行为的原因或我可以进一步调查的方法有什么建议吗?
请注意,此测试是人为的,因为打孔的目的是在 NAT 后面的两个主机之间进行通信。这实际上是有效的,无论服务器在哪里,所以这个问题可能被认为是学术问题。
另请注意,在编写程序之前,我尝试使用名为“NatCheck”的公共应用程序。这也以类似的方式失败,尽管我没有对其进行太多调查 - 它需要三个公共主机,我修改它只使用我的两个。当它无法工作时,我认为我以某种方式搞砸了并丢弃了该应用程序。
对代码的任何评论也非常受欢迎(我可能会将其发布在代码审查网站上)。