我最近将路由器更改为Google为Google Fiber提供的路由器(是的!),现在我注意到在本地服务器上进行开发时检查request.connection.remoteAddress时看到的内容发生了变化。以前,我曾经看到过:
request.connection.remoteAddress; // 192.168.1.10
现在我看到了:
request.connection.remoteAddress; // ::ffff:192.168.1.10
::ffff:192.168.1.10
::
INET_ATON
我的节点服务器正在侦听IPv6地址吗?
是。您的服务器正在侦听IPv6连接,并且IPV6_V6ONLY未设置该标志,导致IPv4连接由同一套接字处理。
IPV6_V6ONLY
在这种情况下,是否可以进行IPv6连接(可以路由到您的服务器)无关紧要-重要的是,侦听IPv6连接的套接字会接收IPv4连接。
是::ffff:192.168.1.10实际上是一个IPv6地址或者是IPv4地址?
都。IPv6地址可以嵌入IPv4地址- 这是这些嵌入地址之一。请参阅IPv4映射的IPv6地址。
判断remoteAddress是否为IPv6以检查字符串是否包含的最简单方法是::吗?
IPv6地址不一定包含::,而是一种简短的表示法,表示一定数量的零。::ffff:192.168.1.10等价于0:0:0:0:0:ffff:192.168.1.10或0:0:0:0:0:ffff:c0a8:010a(请参阅IPv6地址表示法)。因此,为了区分IPv6和IPv4地址,您只需检查单个冒号- 即可:。
0:0:0:0:0:ffff:192.168.1.10
0:0:0:0:0:ffff:c0a8:010a
:
在数据库中存储IPv4地址时,我曾经使用INET_ATON之类的东西将其更改为大整数。我应该放弃此做法,而是将所有远程地址存储为字符串,该字符串可以为45个字符长(IPv6地址字符串的最大长度)
IPv6地址是一个128位数字- 即使您可以将其存储为数字(例如,BIGINT在MySQL中为两个数字),但这种方法是否真的有意义却值得怀疑。我能想到的唯一需要考虑数字的地方是评估子网掩码,因为其他所有字符串都足够且易于处理。
BIGINT