Nodejs - 无状态地区分独特的设备

Nodejs - differentiating unique devices statelessly

你好!假设我们正在尝试区分联系我们的节点 http 服务器的独特设备:

require('http').createServer((req, res) => {

  let uniqueDeviceId = getUniqueDeviceId(req);
  res.end(`Our unique id for you is "${uniqueDeviceId}"!`);

}).listen(80, '<my public ip>', 511);

我正在研究 getUniqueDeviceId:

的实现
let getUniqueDeviceId = ({ connection }) => `${connection.remoteAddress}:${connection.remotePort}`;

我了解 HTTP 架构旨在防止未经同意识别特定设备。我知道要正确识别设备,必须使用登录机制。因此我知道我的 getUniqueDeviceId 实现一定有缺点和失败案例(但我不知道它们是什么)。

在什么情况下这个实现会失败?

在充满 IPv4 地址的世界中,它会失败,因为 public IP 地址在本地网络之间共享。查看网络地址转换 (NAT) 的工作原理。例如,如果您家中有一个 WiFi 路由器,并且您有一定数量的设备通过该路由器连接到互联网,它们将具有相同的 public IP。部分这样做是为了减少 IPv4 地址消耗。总共只有 4,294,967,296 台,在那个时代,人们根本想不到世界上会有如此多的 public 互联网设备。那就是我们正在慢慢转向 IPv6,其容量 大。

在您的特定情况下,来自相同 IP 地址的不同设备对您的应用来说看起来是一样的。此外,如果设备 A 从网络 N 切换到网络 M,您的应用将无法识别它是同一台设备 A,因为它将具有不同的 public IP。

此外,请记住,当客户端连接到您的网络服务器时,远程端口在 0 到 65535 之间是随机的。服务器侦听的端口是静态的,但客户端将通过其与您建立连接的端口仅在连接初始化期间在底层 OS.

的帮助下建立