IPv4和IPv6的區別:地址、NAT與歸屬地,以及怎麼查你實際走哪一個
IPv4和IPv6的區別,最直接的一條是地址長度:IPv4 是 32 位,IPv6 是 128 位,所以 IPv6 不再需要靠 NAT 讓一群裝置共用一個公網地址。對日常使用影響更大的是另一件事:現在很多家庭和手機網路是“雙棧”,同一臺電腦同時有 IPv4 和 IPv6 兩個出口,訪問哪個網站走哪一個、兩個出口顯示的歸屬地和運營商是否一致,都不一定。
這篇先把區別講清楚,再給出一套可以照著做的自查步驟:看本機有沒有 IPv6、兩個出口分別是什麼、瀏覽器實際用的是哪一個。
IPv4 和 IPv6 到底差在哪?
網上的對比表很多,但有幾項說法互相矛盾,比如“IPv6 更安全”“IPv6 沒有廣播所以更快”。下面只列能在協議層面確認、並且會影響你排查問題的差異。
| 專案 | IPv4 | IPv6 |
|---|---|---|
| 地址長度 | 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 | 運營商下發一段字首,家裡每臺裝置各自拿到全球可路由的地址 |
| 區域網內地址配置 | DHCP | SLAAC(路由器發通告,裝置自己生成地址)和/或 DHCPv6 |
| 二層地址解析 | ARP | NDP,基於 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,常見的是隻到省、只到國家,甚至不同地理庫給出差得很遠的結果。原因主要有三點:
- 資料稀疏。地理庫的位置來自注冊資訊、運營商公開資料、測量和使用者反饋。IPv4 地址塊用了幾十年,積累多;IPv6 地址空間巨大,同樣的資料量攤到裡面就很稀。
- 分配粒度大。運營商從序號產生器構拿到的是很大的 IPv6 地址段,再按自己的規劃切給各省各城市。這個內部切分不一定公開,地理庫只能按大段估計。
- 地址會變。隱私擴充套件讓裝置地址輪換,部分運營商下發的字首也會在重新撥號後變化,按單個地址積累的定位資料很難長期有效。
地理庫的原理和分歧來源,可以看為什麼 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 的各項檢測口徑寫在資料方法頁裡。