我了解 IPv4 和 IPv6 本质上是不兼容的。IPv4 客户端能否访问使用 IPv6 的网站,IPv6 客户端能否访问 IPv4 网站?
如果没有某种转换机制,只有 ipv4 的客户端将无法与只有 ipv6 的服务器通信,反之亦然。
最初的想法是整个世界将从“单栈ipv4”转向“双栈”。然后,一旦每个人都使用双栈,我们就可以开始关闭 IPv4 并转向“单栈 ipv6”。
然而这并没有发生,网络运营商几乎没有看到部署 IPv6 和 IANA 的压力,而且大多数 RIR 已经用完了 IPv4 地址。因此,我们最终处于这样一种情况:大量 IPv4 的时代已经结束,但仍然有许多仅 v4 的客户端和服务器。
各种过渡机制应运而生。包含:
- 隧道机制,包括“自动隧道”(如 6to4 和 teredo)以及到固定端点的配置隧道。这些允许仅 v4 网络上支持 v6 的主机连接到仅 v6 服务。但是它们并没有太大帮助,因为您无法控制其他人网络上的机器是否启用了它们。
- NAT64,无状态 (1:1) 和有状态 (1:many)。这允许管理员运行仅 v6 的网络,并且仍然与 Internet 上的仅 v4 机器进行交互。这对于客户端来说是一个合理的解决方案,但对于服务器来说,它并不能真正解决地址耗尽的问题,因为您仍然发现自己需要为每台服务器提供一个专用的 ipv4 地址。
- 反向代理,这些可以查看应用程序级别的数据,因此如果更高级别的协议给出主机名的指示(例如带有主机标头的 HTTP,带有 SNI 的 TLS),那么代理可以侦听单个公共 IPv4 地址并直接请求到多个内部服务器。
它们都不能解决所有问题,其中一些会产生自己的问题,但结合使用它们可以让您运行一个仅使用 v6 的内部网络,只有相对少数的 IPv4 地址可以与世界其他地方通信。
我检查我的 Spring MVC 网站访问者的 IP 地址,如下所示:....到目前为止,这总是以 abcd 格式返回 IPv4 地址如果使用 IPv6 的客户端连接到我的网站,这会改变吗?或者是否会发生各种隧道技术使 IPv6 客户端根据我的网站设置将自己伪装成 IPv4 客户端?
如果您的服务器直接接受 ipv6 连接,它显然会看到一个 ipv6 地址。
如果您的服务器通过使用“::”上的套接字侦听 ipv4 和 ipv6 连接(Linux 默认启用此功能,Windows 需要特定的套接字选项来启用它),那么 ipv4 地址将使用套接字传递给应用程序为“ IPv4 映射地址”。您使用的库可能会或我不会向您隐藏这一点(我不熟悉 spring MVC 的功能)。
如果您接受来自 nat64 或代理的连接,您显然会看到 nat/proxy 的地址。在代理的情况下,可以根据代理发送的信息确定客户端的真实 IP 地址。
在检索和处理 IP 地址时,我可能会面临其他 IPv6 问题吗?
任何将 IPv4 地址存储/传输为 32 位整数或长度限制较短的字符串的地方都可能需要返工。
我强烈建议你自己建立一个测试网络并开始试验这些东西。