IPv4和IPv6的区别:地址、NAT与归属地,以及怎么查你实际走哪一个

博客 / 网络基础

IPv4和IPv6的区别:地址、NAT与归属地,以及怎么查你实际走哪一个

IPv4和IPv6的区别,最直接的一条是地址长度:IPv4 是 32 位,IPv6 是 128 位,所以 IPv6 不再需要靠 NAT 让一群设备共用一个公网地址。对日常使用影响更大的是另一件事:现在很多家庭和手机网络是“双栈”,同一台电脑同时有 IPv4 和 IPv6 两个出口,访问哪个网站走哪一个、两个出口显示的归属地和运营商是否一致,都不一定。

这篇先把区别讲清楚,再给出一套可以照着做的自查步骤:看本机有没有 IPv6、两个出口分别是什么、浏览器实际用的是哪一个。

IPv4 和 IPv6 到底差在哪?

网上的对比表很多,但有几项说法互相矛盾,比如“IPv6 更安全”“IPv6 没有广播所以更快”。下面只列能在协议层面确认、并且会影响你排查问题的差异。

项目IPv4IPv6
地址长度32 位,约 43 亿个(2^32)128 位
写法点分十进制,如 203.0.113.7冒号分隔的 8 组十六进制,可省略前导零,连续的全零组用 :: 压缩一次,如 2001:db8::7
在 URL 里直接写 http://203.0.113.7:8080/必须加方括号 http://[2001:db8::7]:8080/
公网地址怎么来运营商给路由器一个(有时连这一个也是 CGNAT 后的共享地址),家里设备走 NAT运营商下发一段前缀,家里每台设备各自拿到全球可路由的地址
局域网内地址配置DHCPSLAAC(路由器发通告,设备自己生成地址)和/或 DHCPv6
二层地址解析ARPNDP,基于 ICMPv6
广播有没有,改用组播,如 ff02::1 表示链路上所有节点
报头长度可变,含校验和,路由器可以分片固定 40 字节基本报头,去掉了校验和,分片只在源端做,其他功能放进扩展报头

“IPv6 更安全”这句话对吗?

不完全对。早期规范要求 IPv6 实现必须支持 IPsec,很多文章据此写成“IPv6 自带加密”。后来的规范已经把这项要求放宽为“应当支持”,而且“支持”不等于“默认启用”。你访问网站时的加密靠的仍然是 HTTPS,与走 v4 还是 v6 无关。

真正需要注意的安全差异反而在另一面:IPv4 下家里设备藏在 NAT 后面,外部默认连不进来;IPv6 下每台设备都有公网地址,能不能被外部访问完全取决于路由器和系统的防火墙规则。另外,ICMPv6 不能像有些人处理 IPv4 那样整段屏蔽,邻居发现和路径 MTU 探测都依赖它。

没有 NAT 意味着什么?

在 IPv4 下,你在网站眼里通常是“路由器的那个公网地址”,如果运营商还做了 CGNAT,就是很多用户共用的一个地址(这对 IP 信誉的影响见共享 IP 与 CGNAT 会影响 IP 信誉吗)。在 IPv6 下,网站看到的是你这台设备自己的地址。

为了不让一个固定地址长期暴露设备身份,主流系统默认启用“隐私扩展”:在稳定地址之外再生成临时地址,主动发起的连接优先用临时地址,并定期轮换。所以你今天查到的 IPv6 出口,过几小时可能就变了,但前面的网络前缀通常不变。

为什么同一台机器会有两个出口?

双栈网络下,系统同时拿到了 IPv4 和 IPv6 的地址和默认路由。访问一个域名时,系统会同时查 A 记录(v4)和 AAAA 记录(v6)。如果网站两种都有,现代浏览器和系统用一种叫 Happy Eyeballs 的策略:优先尝试 IPv6,稍等一小段时间还没连上就并行发起 IPv4,哪个先成就用哪个。

这带来几个容易被忽略的结果:

  • 同一个网页,不同资源可能走不同协议。主站有 AAAA 记录走 v6,某个第三方接口只有 A 记录就走 v4。
  • v6 不稳的时候会悄悄回落。页面能打开,只是偶尔慢一拍,你未必意识到 v6 其实有问题。
  • 两个出口可能属于不同网络。例如 v4 出口经过公司网关或其他转发路径,v6 出口直接是本地运营商。网站如果同时看到两个,会认为你“位置不一致”。

最后一种情况如果和代理有关,原因和排查方法在IPv6 代理不生效:双栈网络下 IPv4 与 IPv6 出口不一致的原因与排查里单独讲,本文不展开代理配置。

为什么 IPv6 归属地经常不准?

查 IPv4 归属地,很多时候能精确到城市;查 IPv6,常见的是只到省、只到国家,甚至不同地理库给出差得很远的结果。原因主要有三点:

  1. 数据稀疏。地理库的位置来自注册信息、运营商公开资料、测量和用户反馈。IPv4 地址块用了几十年,积累多;IPv6 地址空间巨大,同样的数据量摊到里面就很稀。
  2. 分配粒度大。运营商从注册机构拿到的是很大的 IPv6 地址段,再按自己的规划切给各省各城市。这个内部切分不一定公开,地理库只能按大段估计。
  3. 地址会变。隐私扩展让设备地址轮换,部分运营商下发的前缀也会在重新拨号后变化,按单个地址积累的定位数据很难长期有效。

地理库的原理和分歧来源,可以看为什么 11 个 IP 库给出不同位置和IP 归属地为什么不准。比单看一个库更可靠的办法是看“网段归谁”:通过 RDAP 查询地址所属网段的注册信息,能确认运营商和注册国家,这部分来自注册机构,比地理位置稳定得多。国内家宽的 IPv6 地址常见以 240e、2408、2409 开头,分别对应三家基础运营商的大段,但具体归属请以 RDAP 查询结果为准。

怎么查自己有没有 IPv6?

先看本机,再看出口,最后看浏览器。三步结果放在一起才能判断清楚。

第一步:本机有没有全球 IPv6 地址

Windows(命令提示符或 PowerShell):

ipconfig
# 看当前网卡下的“IPv6 地址”和“临时 IPv6 地址”
# “本地链接 IPv6 地址”(fe80 开头)不算公网地址

Get-NetIPAddress -AddressFamily IPv6 | Format-Table InterfaceAlias,IPAddress,PrefixOrigin,SuffixOrigin
# PrefixOrigin 为 RouterAdvertisement 说明来自 SLAAC,Dhcp 说明来自 DHCPv6

route print -6
# 有 ::/0 这条默认路由,才说明系统知道怎么把 v6 流量发出去

macOS:

ifconfig en0 | grep inet6
# 带 secured 的是稳定地址,带 temporary 的是隐私扩展生成的临时地址
# Wi-Fi 一般是 en0,有线可能是 en1 或其他编号

netstat -rn -f inet6 | grep default

Linux:

ip -6 addr show scope global
# 有输出才说明拿到了全球地址;temporary 标记表示临时地址

ip -6 route show default

看到的地址按开头判断类型:

开头类型能上公网吗
2 或 3(如 240e:、2408:、2001:)全球单播地址能
fe80:链路本地地址,每块网卡都有不能
fd 或 fc唯一本地地址(ULA),类似 v4 的 192.168不能
::1本机回环不能

只有 fe80 而没有 2、3 开头的地址,基本可以确定这个网络没有给你下发 IPv6。

第二步:两个出口分别是什么

用 curl 分别强制走 v4 和 v6,向 Cloudflare 的 trace 地址发请求,返回内容里的 ip= 就是对方看到的出口地址。Windows 10(1803 及以后)和 Windows 11 自带 curl,在 PowerShell 里要写成 curl.exe,避免被别名替换。

curl -4 -s https://cloudflare.com/cdn-cgi/trace | grep -E 'ip=|loc='
curl -6 -s https://cloudflare.com/cdn-cgi/trace | grep -E 'ip=|loc='

Windows PowerShell:

curl.exe -4 -s https://cloudflare.com/cdn-cgi/trace
curl.exe -6 -s https://cloudflare.com/cdn-cgi/trace

loc= 是 Cloudflare 判断的国家代码,只能作参考。如果 -6 这条报错或超时,而第一步里明明有全球地址,常见原因是路由器或光猫的 IPv6 防火墙、上游路由有问题,可以再用 ping -6(macOS 上用 ping6)测一个支持 IPv6 的域名缩小范围;要看路径上哪一跳出问题,可以用 traceroute -6、mtr -6 或 Windows 的 tracert -6,读法与 v4 相同,见traceroute 和 mtr 结果怎么看。

顺便检查你要访问的网站本身支不支持 IPv6:

dig AAAA example.com +short
# Windows:nslookup -type=AAAA example.com

没有 AAAA 记录的网站,无论你的网络多完整,都只会走 IPv4。

第三步:浏览器实际走的是哪一个

命令行的结果不等于浏览器的行为。浏览器有自己的 DNS 设置(比如开了 DoH,设置方法见DNS over HTTPS 配置指南)、可能装了扩展,再加上 Happy Eyeballs 的竞速,最终用哪个协议只能在浏览器里测。

打开 cdnping 的 IP 与环境检测,看其中的 IPv4/IPv6 检测,确认浏览器在两种协议下的连通情况和出口地址。页面上的出口 IP 情报会对地址做 11 个地理库投票并给出置信度,网段注册信息走 RDAP,IP 类型分为机房、家宽、移动、Tor。把 v4 和 v6 两个地址分别对照,就能看出它们是否属于同一个运营商、归属地是否一致。

同一页还有 DNS 泄漏和 WebRTC 泄漏检测。WebRTC 在双栈网络下可能把本机的 IPv6 地址暴露给网页,原理见DNS 泄漏与 WebRTC 泄漏,关闭方法见WebRTC 泄漏怎么关。

自查结果怎么判断?

把三步的结果对照下表:

本机全球 v6 地址curl -6浏览器检测说明
没有失败只有 v4网络没有 IPv6,属于正常情况,不影响使用
有失败只有 v4地址下发了但出不去,查路由器防火墙、默认路由和上游
有成功只有 v4浏览器侧回落到了 v4,可能是网站无 AAAA 记录、浏览器 DNS 设置或扩展影响
有成功v4、v6 都通,运营商一致标准的双栈网络
有成功v4、v6 都通,运营商或归属地不同两条路径不一致,先确认是否有转发或代理,再看是否会影响你访问的服务

最后一种情况在访问对地区敏感的服务时最容易出问题,因为服务端可能同时记录到两个出口。是否需要统一出口、怎样调整,取决于你的网络环境,并应遵守所用服务的条款和当地法规,相关排查思路在前面提到的双栈出口文章里。

开发者还要注意什么?

  • 服务端日志里的 IP 字段要能存 IPv6。按 IPv4 设计的 VARCHAR(15) 存不下 IPv6 地址,最长的完整写法有 39 个字符;用数据库的原生地址类型或至少 45 个字符更稳妥。
  • 按 IP 限流时,v6 应按前缀算。一台设备的临时地址会轮换,一个家庭网络通常拿到一整段前缀,按单个 /128 地址计数基本等于没限。按 /64 或更短的前缀聚合更接近“一个用户”。
  • 配置里写 IPv6 地址时记得方括号。接口地址、代理地址、curl 的 URL 都一样,http://2001:db8::1:8080 会被解析错。
  • 测试连通性时分别测两种协议。curl -4 和 curl -6 各跑一次,只测一种时,另一条路径的故障会被回落机制掩盖。

如果你想把出口 IP、DNS、到 AI API 的延迟一起检查一遍,可以按开发者网络自检清单(2026 版)的顺序做。cdnping 的各项检测口径写在数据方法页里。

相关文章

继续阅读