Javascript request.connection.remoteAddress现在前缀为node.js中的::ffff

Javascript request.connection.remoteAddress现在前缀为node.js中的::ffff,javascript,node.js,networking,ip-address,Javascript,Node.js,Networking,Ip Address,我最近把我的路由器换成了Google为Google Fiber提供的路由器(耶!),现在我注意到在本地服务器上开发时检查request.connection.remoteAddress时看到的情况发生了变化。以前,我经常看到: request.connection.remoteAddress; // 192.168.1.10 现在我看到了: request.connection.remoteAddress; // ::ffff:192.168.1.10 有人能解释发生了什么事吗 我的节点服务

我最近把我的路由器换成了Google为Google Fiber提供的路由器(耶!),现在我注意到在本地服务器上开发时检查request.connection.remoteAddress时看到的情况发生了变化。以前,我经常看到:

request.connection.remoteAddress; // 192.168.1.10
现在我看到了:

request.connection.remoteAddress; // ::ffff:192.168.1.10
  • 有人能解释发生了什么事吗
  • 我的节点服务器正在侦听IPv6地址吗
  • ::ffff:192.168.1.10
    实际上是IPv6地址还是IPv4地址
  • 判断远程地址是否为IPv6的最简单方法是检查字符串是否包含
  • 在数据库中存储IPv4地址时,我通常使用类似于
    INET\u ATON
    的方法将它们更改为大整数。我是否应该放弃这一点,将所有远程地址存储为长度为45个字符(IPv6地址字符串的最大长度)的字符串
  • 我的节点服务器正在侦听IPv6地址吗

    对。您的服务器正在侦听IPv6连接,并且未设置
    IPv6\u V6ONLY
    标志,从而导致IPv4连接由同一套接字处理。您可以在中阅读有关此标志的更多信息

    在这种情况下,IPv6连接是否可行(是否可以路由到您的服务器)无关紧要-重要的是,IPv4连接由侦听IPv6连接的套接字接收

    ::ffff:192.168.1.10
    实际上是IPv6地址还是IPv4地址

    两者都有。IPv6地址可以嵌入IPv4地址,这是其中一个嵌入地址。看

    判断远程地址是否为IPv6的最简单方法是检查字符串是否包含

    IPv6地址不一定包含
    ::
    ,它是一个指示一些零的简短符号
    :ffff:192.168.1.10
    相当于
    0:0:0:0:ffff:192.168.1.10
    0:0:0:0:0:ffff:c0a8:010a
    (请参阅)。因此,为了区分IPv6和IPv4地址,您只需检查单个冒号-

    在数据库中存储IPv4地址时,我使用类似INET_-ATON的方法将其更改为大整数。我是否应该放弃这一点,将所有远程地址存储为长度为45个字符(IPv6地址字符串的最大长度)的字符串

    IPv6地址是一个128位的数字-即使您可以将其存储为一个数字(例如,在MySQL中存储为两个
    BIGINT
    数字),这种方法是否真的有意义仍然值得怀疑。我能想到的唯一需要处理数字的场景是评估子网掩码,对于其他所有内容,字符串就足够了,而且更容易处理。

    re:#4,类似库的功能很好,例如:

    var ipString = request.connection.remoteAddress;
    if (ipaddr.IPv4.isValid(ipString)) {
      // ipString is IPv4
    } else if (ipaddr.IPv6.isValid(ipString)) {
      var ip = ipaddr.IPv6.parse(ipString);
      if (ip.isIPv4MappedAddress()) {
        // ip.toIPv4Address().toString() is IPv4
      } else {
        // ipString is IPv6
      }
    } else {
      // ipString is invalid
    }