保持两个客户端之间的通信,即使他们的 IP 地址发生变化

Maintain communication between two clients even if their IP addresses change

我想弄清楚是否有可能出现类似这种情况的情况:

假设我们有两个人,Alice 和 Bob。 Alice 想发送一些数据(不管这个数据是什么)给 Bob,反之亦然。我知道 WebRTC 可用于无服务器交换消息,但这需要 Alice 和 Bob 知道彼此的 IP 地址。现在,Alice 和 Bob 共享他们的 IP 地址一次以初始化连接相对容易,但是如果他们中的一个碰巧连接到不同的网络会怎样?例如,也许 Bob 在咖啡店里,因此他的 IP 地址不同?先前初始化的连接不会指向他当前的 IP 地址,因此他们必须重新初始化连接;但是如何?

在我看来,两者之间已经需要某种预先存在的通信,以便他们可以共享 IP 地址,但为什么不直接通过他们通信 IP 地址的方法进行通信呢?或者,可能有一个服务器连接两者,但这破坏了系统的无服务器部分。

那么,有没有办法在两个客户端碰巧更改网络并因此更改 IP 地址的情况下保持它们之间的通信?也许有一种比 IP 地址更固定的设备识别方法,就像我在 中看到的那样,但它已经有很多年了,所以也许有一些新的东西?我会在 JS 中跨多个 devices/OSs 实现这个,所以这个答案可能行不通。任何 ideas/examples 将不胜感激;我主要想知道这是否可能,如果可能,如何实现。

是的,有可能。

您需要使用 FQDN(或子域)而不是 IP AddressDNS 服务器,以及客户端实用程序或工具来更新 DNS 记录同时获取 IP地址更改。

网络上有免费的解决方案,例如 no-ip.comcloud-flare

一种更现代的方法是使用 QUIC 进行传输。它在有效载荷中有一个 session ID,并使用 UDP 作为传输方式。这处理了 NAT 将更改它的 Public IP 的非常常见的情况。来自 Cloudflare 的博文:

One of the features QUIC is intended to deliver is called “connection migration” and will allow QUIC end-points to migrate connections to different IP addresses and network paths at will.

所以假设 Alice 和 Bob 通过 QUIC 发送消息,并且他们的连接被赋予一个 session ID。 Alice 的 NAT 更改了它的 public IP 和源端口。由于正在使用 UDP,Alice 的消息仍在发送到 Bob 的 Public IP。 Bob 收到这些 UDP 消息并查看嵌入式 QUIC header,发现它包含与他与 Alice 通话时相同的 session ID。 Bob 然后开始使用 Alice 的新 public IP 和端口作为对话的目的地。

当然这似乎对重定向攻击开放,但在这些机制之上有加密层来防止这种攻击和其他攻击。

参考文献:

简单回答

不,虽然这是可能的,但这是不现实的,也不需要。请参阅下面我更长的解释。另外,如果你真的想这样做,虽然 通过 QUIC 可能的,但不太可能需要它(如下所述)。

思考的时间更长 Answer/Question

简而言之,这不是 WebRTC 所需要的功能。我问你一个问题:
Alice 和 Bob 在数据通道中,通过 WebRTC 交换聊天消息。要创建 WebRTC 连接,您需要使用 ice 服务器 ( first link, second link ) 来让 Alice 和 Bob 连接,引用维基百科:

...to find ways for the two computers to talk to each other as directly as possible..

这意味着它将使用 Alice 当前的 IP 地址通过 STUN 或 TURN 服务器向 Bob 提供报价。如果像您所说的那样,爱丽丝要更改 IP 地址,她将需要更改位置。这意味着她将需要移动足够的距离,以便 IP 地址发生变化。实际上,这可能意味着她开车去某个地方。如果没有,她会叫优步或出租车或骑她的自行车。在大多数情况下,她需要关闭计算机,从而结束 p2p 连接。如果,由于一些奇怪的魔法,她没有关闭她的 computer/the 连接,浏览器很可能会刷新,因此从新的 IP 地址 重新连接到 WebRTC 数据通道 . 您何时需要创建 WebRTC 数据通道并处理 IP 更改? 长篇解释得出结论,客户端在没有 ending/resetting 连接的情况下更改 IP 地址不会发生在练习。

如果您想研究其他替代方案,这里有一些例子:

备选方案

添加IP事件监听器★

现在这不是您可以检查的实际全局变量,但是您可以使用在线 API(列出了一些 here)检查用户的 IP 地址,将其存储在变量(或 localStorage)中,并检查 IP 是否发生变化。在一个循环中,你会做一些简单的逻辑来检查如果是,你重置 WebRTC 连接,如果不是,你继续循环。

使用“管道”服务器

您可以使用 http/https 服务器设置简单聊天,已设置,解释为 here,称为管道服务器。您可以查看这篇文章以获取更多信息,但它推广了一个无服务器聊天系统(无需 创建 服务器即可使用),该系统不会面临更改 IP 地址的困难。但是,您需要知道对方的 ID,他们也需要知道您的 ID,这实际上会使解决方案过时,因为在建立这个简单的聊天之前您需要进行某种交流。

使用 Node.js、Websockets、and/or Socket.io ★

如果您想创建一个简单的聊天应用程序或创建一个数据通道,Node.js 和 Socket.io 是最佳选择。这非常简单,但是,它涉及到服务器,这就是为什么我把它放在最后。但是,我强烈推荐此方法,因为它简单易用,并且不依赖于 IP 地址。参见 here for a very good starting immersion into Node.js and the Express framework. I am far from an expert from Websockets, but MDN is always a good place to start. However good Websockets are, I think that Socket.io is much easier for beginners, so if you are willing to sacrifice a bit of speed over simplicity, you should start here。这些都是很好的服务器端聊天起点。

链接

简单回答

QUIC connection migration

IP 侦听器

SO Question,

冰服务器

MDN docs, Wikipedia

管道服务器

Simple article, Github repo

Node.js、Websockets 和 Socket.io

Node.js and Express setup, Websocket intro, and Socket.io intro

所有加星标(★)的备选方案均为个人推荐。