在使用 Live Messenger 等即时消息应用程序或 Google Talk 的桌面客户端时,计算机可以在彼此之间传输文件。我不能肯定地说,但我相当肯定计算机之间传输的数据不会通过微软或谷歌的 IM 服务器,而是两台装有 IM 软件的计算机直接相互通信。我想知道客户端之间的这种直接连接是否或如何建立,以及我将如何自己实现类似的东西。
我有一些使用个人网络的经验,但我只了解客户端-服务器关系,其中服务器始终在侦听(并且端口不会被防火墙阻止)并且客户端在需要数据时向服务器发出请求。
在使用 Live Messenger 等即时消息应用程序或 Google Talk 的桌面客户端时,计算机可以在彼此之间传输文件。我不能肯定地说,但我相当肯定计算机之间传输的数据不会通过微软或谷歌的 IM 服务器,而是两台装有 IM 软件的计算机直接相互通信。我想知道客户端之间的这种直接连接是否或如何建立,以及我将如何自己实现类似的东西。
我有一些使用个人网络的经验,但我只了解客户端-服务器关系,其中服务器始终在侦听(并且端口不会被防火墙阻止)并且客户端在需要数据时向服务器发出请求。
许多客户使用的一种方法称为“针孔”:
我向你发送了一个 UDP 数据包,这在我的防火墙上戳了一个洞(允许 UDP 数据包,假设是我的防火墙的响应,由你发送并由我接收)。该数据包被您的防火墙丢弃。
你向我发送了一个 UDP 数据包,在你的防火墙上戳了一个洞。该数据包应该到达我,此时我可以发送另一个数据包到达您,我们可以通过我们的防火墙通过 UDP 进行通信。
我使用了一个名为Hamachi的程序,它有点像点对点 vpn(虚拟网络到网络)。然后我按原样编写客户端服务器应用程序。这是一种快速获得通过 Internet 连接的功能的方法,而无需处理 NAT 路由器所需的技巧。
If you need to do it 'properly', one of the common methods is udp hole punching. When you send a web request your firewall knows to expect back data in response. The trick is that both client A and client B contact a server on the Internet. The server passes details of the request client A made to client B and and vice versa. Once the initial connection is established they can continue communicate even if the main server is no longer there.
如果我正在实施这个,我会考虑几个选项。
让防火墙将给定端口转发到网络内的 PC。这将让您从外部世界连接到服务器。
让防火墙后的客户端连接到防火墙外的可见服务器。
简而言之,对话中的至少一方需要对其他方可见(服务器),以便他们可以连接到它。无论如何,一旦建立连接,客户端和服务器将能够毫无问题地来回通信。
If both clients are behind a firewall that hasn't been pinholed and no VPN software is being employed they are communicating through a 3rd party server. Period.
做大多数木马会做的事情:
反向连接
编辑:
在防火墙后面有两台机器,你需要某种第三个“代理”