Javascript request.connection.remoteAddress现在前缀为node.js中的::ffff
我最近把我的路由器换成了Google为Google Fiber提供的路由器(耶!),现在我注意到在本地服务器上开发时检查request.connection.remoteAddress时看到的情况发生了变化。以前,我经常看到: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 有人能解释发生了什么事吗 我的节点服务
request.connection.remoteAddress; // 192.168.1.10
现在我看到了:
request.connection.remoteAddress; // ::ffff:192.168.1.10
::ffff:192.168.1.10
实际上是IPv6地址还是IPv4地址:
INET\u ATON
的方法将它们更改为大整数。我是否应该放弃这一点,将所有远程地址存储为长度为45个字符(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
}