javascript - 双IP堆栈地址相等比较

标签 javascript browser ipv6 equality ipv4

我试图通过修改和使用此 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/

相关文章:

javascript - 有没有办法将在浏览器中创建为 blob 的文件附加到电子邮件中

http - 在哪里可以找到所有浏览器的默认超时设置?

ios - 如何测试 iOS 应用程序是否支持 IPv6?

c++ - C++ 中的 IPv6 连接测试

javascript - fullcalendar 拖动的事件在 getEventSources 中不可见

javascript - 点击功能不适用于第二次点击

javascript - 单击按钮时将变量从 html 传递到 Javascript Format If 语句

javascript - GridStack 如何禁用移动或拖动网格小部件

javascript - html页面是如何按顺序渲染的?

mysql - 通过 IP (IPv4,IPv6) 获取国家位置