我试图通过修改和使用此 regex 仅允许从潜在恶意源接收的 IPv4 和 IPv6 地址来防止浏览器中出现冗余 WebSocket 连接。在连接之前进行验证并测试是否相等。
但是,我没有 IPv6 经验,并且不知道如何测试相等性,尤其是对于 IPv4 to IPv6 mapped addresses 的特殊情况。 .
如何比较所有类型的 IP 地址是否相等?
最佳答案
IPv4 和 IPv6 是独立的协议(protocol),因此 IPv4 和 IPv6 地址之间通常不可能进行映射。然而,有一些转换机制将 IPv4 地址(部分)放入 IPv6 地址内。不过,大多数 IPv6 用户不会使用这些机制,因此通常根本无法进行映射。
我会尽力在这里列出尽可能多的内容。如果我忘记了相关内容,请发表评论!
IPv4 兼容的 IPv6 地址
定义于 RFC 4291 。引用 RFC:
The "IPv4-Compatible IPv6 address" was defined to assist in the IPv6 transition. [...] The "IPv4-Compatible IPv6 address" is now deprecated because the current IPv6 transition mechanisms no longer use these addresses.
它们看起来像 ::192.0.2.123
(最后 32 位写成 IPv4 地址)或 ::c000:027b
(最后 32 位写成十六进制像往常一样)。
IPv4 映射的 IPv6 地址
也在 RFC 4291 中定义。当软件内部使用 IPv6 时,这些地址会在软件中使用,但实际上是使用 IPv4 协议(protocol)(另请参阅 Socket listener for IPv6 and IPv4 )。它们看起来像 ::ffff:192.0.2.123
(最后 32 位写成 IPv4 地址)或 ::ffff:c000:027b
(最后 32 位写成像平常一样的十六进制)。它们从未在实际数据包中使用,而是一种软件构造,使软件更容易同时支持 IPv4 和 IPv6。
6to4 地址
定义于 RFC 3056 。 6to4 是一种机制,其中每个公共(public) IPv4 地址自动具有 IPv6/48 网络。例如:如果您的家庭路由器有公共(public) IPv4 地址 192.0.2.123
,那么您可以使用 IPv6 前缀 2002:c000:027b::/48
(固定 16 位前缀 2002:
+ 您家中的 IPv4 地址的 32 位 = 48 位)。因此,您可以从 6to4 中再次提取 IPv4 地址。然后通过隧道传输 IPv6 流量。当与另一个 6to4 站点通信时,您的路由器会将流量直接传输到另一个站点的 IPv4 地址。当与“普通”IPv6 互联网通信时,您的路由器将通过隧道连接到公共(public) 6to4 中继。由于这些中继是由志愿者提供的,因此质量无法预测,因此它可能会或可能不会发挥作用。
第六次
定义于 RFC 5969 。 6rd 就像 ISP 提供的 6to4 版本。由于它是由ISP管理的,所以可靠性可以得到保证。第六部署使用的 IPv6 地址由 ISP 确定,因此它们与普通的其他 IPv6 地址没有区别。 ISP 将 IPv4 地址的一部分映射到 IPv6 地址的一部分,但您必须知道所使用的映射参数(IPv4 地址的哪些位被复制到 IPv6 地址的哪些位,以及哪些位是非映射参数)。 -IPv4 地址的映射位),以便能够根据 IPv6 地址确定 IPv4 地址。
例如,第六次部署可以将 IPv4 地址 192.0.2.123
映射到 IPv6 前缀 2001:db8:6d02:7b00::/56
。在此示例中,我采用了 IPv6 前缀 2001:db8:6d00::/40
,然后附加 IPv6 地址的最后 16 位以获得/56 前缀。
特雷多
定义于 RFC 4380 。 Teredo 是一种用于将公共(public) IPv6 地址获取到 NAT 后面的主机的协议(protocol)。 Teredo IPv6 地址包含 IPv4 地址的模糊版本。 Teredo 地址可以被识别,因为地址的前 32 位始终为 2001:0000:
。 Teredo 地址的最后 32 位包含 IPv4 地址,但所有位都翻转。因此,具有外部 IPv4 地址 192.0.2.123
的 NAT 设备后面的主机将获得一个 Teredo 地址,其中最后 32 位为 :3fff:fd84
。
关于javascript - 双IP堆栈地址相等比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214226/