gpt4 book ai didi

javascript - request.connection.remoteAddress 现在在 node.js 中以::ffff 为前缀

转载 作者:IT老高 更新时间:2023-10-28 21:59:34 35 4
gpt4 key购买 nike

我最近将我的路由器更改为由 Google 为 Google Fiber 提供的路由器(耶!),现在我注意到当我在本地服务器上开发时检查 request.connection.remoteAddress 时看到的内容发生了变化。以前,我曾经看到过:

request.connection.remoteAddress; // 192.168.1.10

现在我看到了:

request.connection.remoteAddress; // ::ffff:192.168.1.10
  1. 谁能解释发生了什么?
  2. 我的 Node 服务器是否在监听 IPv6 地址?
  3. ::ffff:192.168.1.10 究竟是 IPv6 地址还是 IPv4 地址?
  4. 判断一个 remoteAddress 是否是 IPv6 以检查字符串是否包含 :: 是最简单的方法吗?
  5. 在数据库中存储 IPv4 地址时,我曾经使用类似 INET_ATON 之类的东西将它们更改为大整数。我是否应该放弃这一点并将所有远程地址存储为长度为 45 个字符的字符串(IPv6 地址字符串的最大长度)

最佳答案

Is my Node server listening to IPv6 addresses?

是的。您的服务器正在监听 IPv6 连接,并且未设置 IPV6_V6ONLY 标志,结果 IPv4 连接由同一个套接字处理。您可以在 this question 中阅读更多关于此标志的信息。 .

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

Is ::ffff:192.168.1.10 actually an IPv6 address or is it an IPv4 address?

两者兼而有之。 IPv6 地址可以嵌入 IPv4 地址 - 这是这些嵌入地址之一。见 IPv4-mapped IPv6 addresses .

Is the easiest way to tell if a remoteAddress is IPv6 to check if the string contains ::?

IPv6 地址不一定包含 ::,它是一个简短的符号,表示一些零个数。 ::ffff:192.168.1.10 等价于 0:0:0:0:0:ffff:192.168.1.100:0:0:0 :0:ffff:c0a8:010a(见 IPv6 address presentation)。因此,为了区分 IPv6 和 IPv4 地址,您只需检查一个冒号 - :.

When storing IPv4 addresses in the database I used to use something like INET_ATON to change them into large integers. Should I abandon this and just store all remote addresses as strings that can be 45 characters long (maximum length of an IPv6 address string)

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

关于javascript - request.connection.remoteAddress 现在在 node.js 中以::ffff 为前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24896386/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com