双IP堆栈地址相等比较

时间:2014-06-13 21:46:26

标签: javascript browser ipv6 equality ipv4

我试图通过修改和使用此regex验证然后在连接之前测试相等性来允许从潜在恶意来源收到的IPv4和IPv6地址来阻止浏览器中的冗余WebSocket连接。

但是,我没有使用IPv6的经验,也不知道如何测试相等性,尤其是IPv4 to IPv6 mapped addresses的特殊情况。

如何比较所有类型的IP地址是否相等?

1 个答案:

答案 0 :(得分:1)

IPv4和IPv6是单独的协议,因此通常无法在IPv4和IPv6地址之间进行映射。然而,有一些转换机制将(部分)IPv4地址放在IPv6地址中。大多数IPv6用户虽然不会使用这些机制,但通常根本不可能进行映射。

我会尽量在这里列出尽可能多的人。如果我忘了相关内容,请发表评论!

IPv4兼容的IPv6地址

RFC 4291中定义。引用RFC:

  

" IPv4兼容的IPv6地址"被定义为协助IPv6过渡。   [...]   " IPv4兼容的IPv6地址"现在已弃用,因为   当前的IPv6过渡机制不再使用这些地址。

它们看起来像::192.0.2.123(写入IPv4地址的最后32位)或::c000:027b(最后32位用通常的十六进制编写)。

IPv4映射的IPv6地址

也在RFC 4291中定义。当软件在内部使用IPv6时,这些地址在软件中使用,但实际上是在谈论IPv4协议(另请参阅Socket listener for IPv6 and IPv4)。它们看起来像::ffff:192.0.2.123(最后32位写为IPv4地址)或::ffff:c000:027b(最后32位像往常一样用十六进制写)。它们从未在真正的数据包中使用,但它们是一种软件结构,使软件更容易同时支持IPv4和IPv6。

6to4地址

RFC 3056中定义。 6to4是一种机制,其中每个公共IPv4地址自动具有IPv6 / 48网络。例如:如果您的家庭路由器具有公共IPv4地址192.0.2.123,那么您可以使用IPv6前缀2002:c000:027b::/48(固定的16位前缀2002: + IPv4地址的32位= 48位)你家里面。因此,从6到4,您可以再次提取IPv4地址。然后隧道传输IPv6流量。与另一个6to4站点通信时,您的路由器会将流量直接隧道传输到另一个站点的IPv4地址。与正常人交谈时#39; IPv6互联网您的路由器将隧道到公共6to4中继。因为这些继电器是由志愿者提供的,所以质量是不可预测的,因此可能会或可能不会很好。

6RD

RFC 5969中定义。 6rd就像ISP提供的6to4版本。由于它由ISP管理,因此可以保证可靠性。第6部署使用的IPv6地址由ISP确定,因此它们与正常的其他IPv6地址无法区分。部分IPv4地址由ISP映射到IPv6地址的一部分,但您必须知道所使用的映射参数(IPv4地址的哪些位被复制到IPv6地址的哪些位,这是IPv4地址的非映射位,以便能够从IPv6地址确定IPv4地址。

第6次部署可以将IPv4地址192.0.2.123映射到IPv6前缀2001:db8:6d02:7b00::/56。在此示例中,我使用IPv6前缀2001:db8:6d00::/40,然后附加IPv6地址的最后16位以获得/ 56前缀。

的Teredo

RFC 4380中定义。 Teredo是一种用于将公共IPv6地址提供给NAT后面的主机的协议。 Teredo IPv6地址包含IPv4地址的模糊版本。可以识别Teredo地址,因为地址的前32位始终为2001:0000:。 Teredo地址的最后32位包含IPv4地址,但所有位都被翻转。因此,具有外部IPv4地址192.0.2.123的NAT设备后面的主机将获得最后32位为:3fff:fd84的Teredo地址。