天天看點

IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

作者:CSDN
IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

【CSDN 編者按】IPv6 作為全球公認的下一代網際網路商業應用解決方案,為解決 IPv4 位址枯竭而制定的下一代網際網路協定版本。今年年初,因 IPv4 将耗盡,巨頭企業宣布收費後,開發者對 IPv6 的發展尤為關注。本文作者 Sedat Kapanoglu 也不例外,盡管他知道 IPv6 有二十多年,但一直以來對它的了解僅停留在“為了解決 IPv4 位址空間不足而設計的一個過度工程化的解決方案”。

近日,他深入學習了 IPv6 的工作原理,發現其中有不少有趣的知識想和大家分享,同時他表示自己并非 IPv6、網絡工程的專家,假如你也對 IPv6 感興趣,一起看看作者說的對不對?

原文連結:https://ssg.dev/ipv6-for-the-remotely-interested-af214dd06aa7

未經允許,禁止轉載!

作者 | Sedat Kapanoglu 責編 | 夏萌

譯者 | 伍杏玲出品 | CSDN(ID:CSDNnews)

IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

IPv6 vs. IPv4

我一直對IPv6這個名字感到困惑,因為我覺得IPv4名字來源于它用來表示32位的四個位元組,是以IPv6應該被稱為IP16。但實際上,這隻是協定的版本号。

在IPv4推出之前,曾存在過IPv1、IPv2和IPv3,它們主要用于内部研究IP協定,後來被我們現在的IPv4所取代。在上世紀80年代,還提出過IPv5的提案,旨在優化實時通信,但大家發現IPv6能解決位址空間問題後,該提案就被放棄了,是以才有了IPv6這個名字,代表網際網路協定第6版。後來有人嘗試建立IPv7、IPv8等更高版本,但它們要麼已被廢棄,要麼被擱置起來。

和IPv4一樣,IPv6有自身的尋址方案,但它使用的是128位位址而非IPv4的32位位址。這兩種協定之間的差異不僅展現在位址空間大小上,而且與IPv4對比,IPv6有其獨特特性,比如:

IPv6沒有子網路遮罩

IPv6和IPv4同樣支援CIDR(無類别域間路由),但從使用者角度看,IPv6位址要簡單得多:前半部分是全球網際網路位址,後半部分是本地位址。這是推薦的IPv6位址使用方式。當你通路某個顯示IP位址的網站如WhatismyipWhatever時,它會顯示出你的IPv6位址形式如下:

1111:2222:3333:4444:5555:6666:7777:8888

但是,你的網際網路服務提供商(ISP)隻知道你的字首部分為1111:2222:3333:4444,并将這個/64的位址塊配置設定給你。位址的剩餘部分對你的網絡中的每一台裝置都是獨一無二的。ISP隻會将所有以1111:2222:3333:4444開頭的資料包轉發至你的路由器,然後路由器會将資料包進一步傳遞到目标裝置。是以,位址的後半部分(5555:6666:7777:8888),我們可以稱之為INTERFACE_ID,這部分對于你的裝置來說是唯一的。這就意味着你擁有的每一台裝置都擁有一個獨特的IPv6位址,可以從世界任何地方單獨通路,原因在于:

IPv6 不使用 NAT 技術

實際上,針對 IPv6 的 NAT(Network Address Translation,是指網絡位址轉換) 并不存在公開的标準規範。雖然有一個名為 NAT66 的草案提議,但至今并未轉化為現實标準。

之是以在 IPv6 中不需要 NAT,是因為理論上地球的每個裝置都可以有一個獨立的全球可通路的位址。開始我對此感到很奇怪,因為在玩網絡遊戲時雖然我們常常痛恨 NAT 導緻的種種不便,但它卻給人一種安全感,除非你明确通過 UPnP 或端口轉發允許,否則你的本地裝置永遠不會被外部網絡直接通路。

有一個殘酷的事實是,NAT 并不是一道安全屏障,它隻是一個替代的資料包轉發機制。在預設情況下,你的IPv6路由器本不應随意将來自外部的連接配接嘗試轉發給本地裝置。是以,在 IPv6 環境下,即便不使用 NAT,你也同樣可以獲得相同級别的安全保障。實際上,借助IPv6位址,你無需經過路由器,或者不必另行配置VPN,就能直接通路本地網絡上的每一台裝置:隻需要進行身份驗證即可。

盡管IPv6為每台裝置配置設定獨立的IPv6位址帶來了便利,但也存在一個與安全相關的問題:由于每個裝置都有獨一無二的位址,是以它們可以被個别識别和跟蹤,這對我們的隐私保護構成威脅。為此,現代作業系統引入了臨時IPv6位址的概念,該位址的INTERFACE_ID會定期變化。這樣一來,你可以使用永久IPv6位址接收外部的連接配接請求,而在建立連接配接時,對外展示的是一個頻繁變動的二級臨時位址作為你的IPv6位址。

接下來我們繼續探讨IPv6的特性:

IPv6位址具備自動配置功能

IPv6協定無需依賴DHCP(Dynamic Host Configuration Protocol,動态主機設定協定)伺服器或手動網絡配置來确定IP位址、子網路遮罩及網關位址。一台裝置可以不通過詢問中央伺服器而自主擷取IP位址。這一過程是通過一個名為SLAAC(Stateless Address Autoconfiguration,無狀态位址自動配置)的協定實作的,具體步驟如下:

  1. 作業系統(特别是作業系統的IPv6堆棧)會生成一個64位的裝置辨別符,通常是随機生成的,比如5555:6666:7777:8888,這個辨別符構成了你的IPv6位址INTERFACE_ID部分。
  2. 作業系統會在該INTERFACE_ID前加上fe80,這是僅限本地使用的IPv6網絡字首。是以,你現在得到的IPv6位址是:fe80::5555:6666:7777:8888。(請注意這裡的"a::b"文法表示的是:“在'a'和'b'之間存在所有值為零的段”。關于這點我們稍後再詳細介紹。)
  3. 你的裝置會将一個資料包發送到本地網絡上指定的鄰居多點傳播組,以確定沒有其他裝置使用相同的IPv6位址,這被稱為重複位址檢測(DAD)。而配置設定到重複位址的幾率很小。
  4. 裝置将它擷取到的本地位址發送給路由器(與IPv4不同,在IPv6中,路由器始終可以通過多點傳播位址ff02::2被通路到),并通過發送一個RS(路由請求)ICMPv6資料包來請求路由器的實際字首。路由器收到請求後,會通過RA(路由通告)資料包回應,并用回複的實際字首替換掉fe80,裝置随後開始使用這個新的位址作為其永久位址。這就是你現在的IPv6網際網路位址。

如此一來,無狀态配置的優勢在于減少了路由器上的管理開銷:路由器無需單獨維護網絡中每個裝置的IP配置資訊。意味着這将可以帶來更好的性能表現,特别是在大型網絡中尤為明顯。

IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

IPv6的“神話”

IPv6也有一些誇大的說法,我們一起梳理澄清下:

你裝置隻有一個IPv6位址,可用于在所有地方

确實,你會使用同一個IPv6位址進行本地和遠端連接配接。但是,“一統天下之IP位址,尋遍萬物之IP位址”的說法并不準确。正如我之前所提到的,你的裝置會為了不同範圍的目的聲明多個IPv6位址,比如鍊路本地(fe80::)和網際網路。此外,你的裝置也可能獲得兩個不同的公網IPv6位址:永久位址和臨時位址。臨時IPv6位址旨在保護你的隐私,它們會定期輪換。而永久IPv6位址主要用于必須具有靜态IPv6位址的伺服器。

為宇宙中每個原子配置設定一個IP位址

還遠遠不夠的。宇宙中大約有2²⁷²個原子,地球約有2¹⁶⁶個原子,是以我們至少需要168位(八位對齊)的位址空間來容納它們。實際上,IPv6的位址空間略小于128位:前16位是IANA預留的。是以,你隻能用剩下的112位來辨別裝置。盡管這非常多,遠超過我們在未來幾千年裡地球上可能制造的所有裝置的數量,但并不能為每一個原子配置設定一個獨立的IP位址。然而,我們可以為地球上的每一粒沙子配置設定IPv6位址,甚至我們還可以将這些位址全部裝進一個單一的/64字首内。總之,IPv6位址空間是極其龐大的。

每個裝置的通用連接配接

沒錯,IPv6沒有NAT機制,這意味着不再需要端口轉發或維護位址空間。但是,如果你想建立直接連接配接,仍然需要有一種機制允許遠端主機連接配接到你的裝置。預設情況下,你的路由器/防火牆會阻止任何連接配接嘗試。你會怎麼做呢?

就像UPnP/IGD時代一樣,今天的應用程式仍然需要與PCP(端口控制協定)這類協定配合工作,才能以程式設計方式打開端口通路權限。是以,并不是說你突然間就能憑借全局+本地IPv6位址實作通用連接配接。雖然你不必手動設定端口轉發,但應用程式仍需與路由器協作才能使自身變得可通路。

從我看來,在某些情況下,IPv6的表現甚至不如IPv4:

IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

IPv6的不足之處

在IPv4環境下,我們習以為常的一些功能,當過渡到IPv6後可能會讓你懷念,例如:

依賴ISP提供子網劃分服務

由于IPv6不采用NAT技術,許多美國ISP預設隻向你的路由器轉發一個64位字首(通常稱為“/64”)。這意味着路由器無法在IPv6位址中嵌入子網資訊。要知道,IPv6位址是由裝置自動配置的,是以路由器無法強制這些裝置使用小于64位的本地位址,這讓路由器無法知道應該将資料包轉發到哪個子網。

你得依賴于ISP提供短于64位的字首,這樣你的路由器才能利用剩餘的比特位來識别資料包應當發往哪個子網。理論上講,通過配置設定60位字首,ISP實際上完全有能力給家庭使用者提供至少16個子網,但不知道為何他們并沒有這樣做。或許是因為他們在IPv4位址空間匮乏時期的心理創傷讓他們變得貪婪?或者是他們想通過額外收費來賺錢:“嘿,如果你想要更短的字首,那就多付點錢給我們。”據我所知,Comcast Xfinity和AT&T兩家公司都隻為家庭使用者提供了一個簡單的/64字首:即單個子網。

你或許會說,家庭使用者可能根本不需要子網劃分,但是随着物聯網裝置的普及以及我們對網絡安全越來越高的依賴性,隔離不可信裝置的重要性正在日益凸顯。歐洲IP位址配置設定權威機構RIPE建議住宅ISP客戶使用56位字首,這樣每位客戶可以獲得256個子網,這是歐洲提出最貪婪、也最保守的選項,而在美國,這幾乎是可望而不可及的夢想。

當然,你可以手動配置每一台裝置的IPv6位址,并以此方式賦予它們子網辨別符,但這将是一項巨大的工程,尤其是考慮到添加新裝置時帶來的管理負擔。難道你想退休後變成一個人工DHCP伺服器嗎?

IPv6位址在URI中需要額外編碼

我們可能都試過在浏覽器輸入“http://192.168.0.1”并通路路由器設定。在URI規範中“:”字元是為端口号保留的,是以如果沒有額外的編碼,無法直接采用相同的方式來通路IPv6位址。若想通過IPv6位址通路一台裝置托管的網頁,必須采用如下格式:“http://[aaaa:bbbb:cccc:dddd:eeee:ffff:1111:2222]/path/?query”,注意位址兩邊的方括号。但這還不是最糟糕的部分,因為:

IPv6位址難以記憶

理論上我們不應去記住IP位址,但實際情況并非如此。對于IPv6位址,我至今也無法确定可靠且一緻地通路自家路由器所使用的位址。确切地說,我無法記下它的完整IP位址。mDNS有助于解決這個問題,但它也不總是穩定有效。

十六進制數字相比十進制數字也更為複雜。這就像是試圖記憶Windows XP産品激活碼一樣困難。

記住IPv4位址是一種通用技能,由于普遍存在的NAT技術,多數情況下“192.168.1.1”都能派上用場,我們無需查詢。而在任意裝置上找出路由器的IPv6位址則需要不同的技巧。

從積極的一面看,現在你知道IPv6位址的最右側64位部分始終是随機生成的,是以至少可以避免誤以為它是固定不變的或者是有意義的。你可以将這一部分稱作BLABLA而非INTERFACE_ID。你可以記住你的/64字首,至少能找到路由器的位址,通常是類似1111:2222:3333:4444::1這樣的形式。

IPv6位址複雜

當然,IPv4位址同樣複雜。你知道2130706433是一個有效的IPv4位址嗎?或者換種寫法,0x7F000001、0177.0000.0000.0001,以及127.1其實都是一回事?如果不信,你大可在終端嘗試ping它們。雖然很難相信,但它們全等同于127.0.0.1這個位址。

IPv6位址在表示形式上也有類似的多樣性。以下是其一些特征:

IPv6位址的表示方法相對複雜,由8個十六進制分組組成,這些組被稱為“hextet”(實際上“Hextet”是hexadectet的誤稱,但現在已約定俗成)。這樣一來,就可能出現類似的十六進制表達技巧:

IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

IPv6位址中的零值字首不會顯示,是以2600:00ab實際上顯示為2600:ab。

如前所述,如果某個十六進制四字組的值為零值,可以完全從位址中删除,并用雙冒号代替。是以,2600:ab:0:0:1234:5678:90ab:cdef将顯示為2600:ab::1234:5678:90ab:cdef。看到雙冒号了嗎?不過要注意的是,這種簡化方式隻能應用于位址中首組連續的零值四字組。是以,2600:ab:0:0:1234:0:0:cdef仍顯示為2600:ab::1234::0:cdef。另外,不能僅僅簡化單個零值的十六進制四字組。是以,2600:0:1234:5678:abcd:ef01:2345:6789中的零值保持原樣,不會被省略。

你可以指定區域ID:通過在位址末尾添加“%”字尾和區域ID來指定要通過哪個網絡接口通路該位址。例如,當你同時通過WiFi和以太網連接配接到同一網絡時,你可能想要通過區域網路來ping你的路由器。在這種情況下,你需要在位址後面追加“%”符号,并添加你的區域ID(即網絡擴充卡辨別符),例如fe80::1%eth0或fe80::1%3。問題是,在IPv6 URI中除了需要用到方括号之外,你在浏覽器位址欄或其他需要在URI中使用區域ID的地方,還必須将“%”轉義為“%25”。

IPv6位址還可以用來表示IPv4位址。是以,你可以通過在其前方添加IPv4轉換字首的方式,使用IPv6位址文法來ping 127.0.0.1,這時它将被視為一個IPv4位址,即:::ffff:127.0.0.1。但這并不意味着你的IPv4請求會通過IPv6網絡進行傳輸,而是告訴底層網絡協定棧使用IPv4連接配接。如果選擇不同于::ffff的字首,IPv4部分将會被合并到最後兩個十六進制位元組中,并通過IPv6網絡與該IP位址建立連接配接。例如,IPv6位址2600:1000:2000:3000::192.168.1.1會被視為2600:1000:2000:3000::c0a8:101,其中最後兩個十六進制位元組相當于IPv4位址192.168.1.1的十六進制表示形式。

這些都是有效的IPv6位址:

:: 表示所有零,即0:0:0:0:0:0:0:0.

2600:: 相當于2600:0:0:0:0:0:0:0.

::ffff:1.1.1.1 等同于IPv4位址1.1.1.1 。

2607:f8b0:4005:80f::200e 是我ping google.com時擷取的位址,與2607:f8b0:4005:80f:0:0:0:200e等效。可以看出,像Facebook一樣,Google也選擇了艱難的道路,決定為其IPv6位址手動配置設定特定的INTERFACE_ID。

最終,在位址欄中輸入的IPv6位址可能看起來像下面這個人為構造的例子:

https://[542b:b2ae:ed5c:cb5a:e38b:2c49:123:192.168.1.1%25eth3]

我可記不住這麼長的位址。

通過這次學習,讓我對IPv6的相關知識有了更清晰的認識。例如,我以前不知道IPv6位址是通過無狀态協定自動配置的,也不知道IPv6中沒有NAT技術,更不了解位址空間是如何恰好被便捷地劃分為兩半的。

我希望我們能有一個指向預設網關的快捷IPv6位址,我提議使用fe80::1。國際網際網路工程任務組(IETF),不妨考慮一下這個提議哦!

我還記得當初Windows 2000宣布支援IPv6時,那是個重大的進步,我們都認為IPv6将在十年左右的時間裡被廣泛采用。沒想到我們錯得離譜!然而,通過對IPv6的學習,我才了解到為什麼這項技術沒有快速普及起來。

IPv6并未對終端使用者提供實質好處

盡管IPv6在技術上較為先進,但IPv4卻簡單實用,即使是在NAT(網絡位址轉換)之後,甚至是多層NAT環境下,面對位址空間極度緊張、DHCP配置繁瑣、端口轉發複雜的條件下,IPv4依然能夠正常運作。隻要出現問題,總有人找到解決方案使其繼續工作。

理論上IPv6因無需NAT可能具有更低延遲的優勢,但這點改進還不足以顯著提升使用者體驗,不足以讓使用者強烈要求切換至IPv6。

正因為IPv6并未帶來直覺可見的好處,使用者并不會主動要求使用,往往是在他們不知情的情況下被推向IPv6,就像我們現在在移動網絡中幾乎預設使用IPv6一樣。

這意味着,一旦網際網路服務提供商感受到IPv4的限制帶來的足夠壓力時,它們将會立刻切換到IPv6。

我希望IPv6能夠開啟一些IPv4無法實作的獨特功能場景,讓使用者能夠因為想要使用這些功能而主動需求IPv6。盡管如此,我還是喜歡IPv6特質,期待有一天我們完全放棄IPv4,轉而圍繞IPv6來建構所有網絡服務。

IPv4 位址耗盡,為什麼 IPv6 沒有廣泛将其取代?

開發者怎麼看?

正如作者在開頭說自己并非是IPv6、網絡工程的專家,讀完他的文章後,一些開發者提出自己的觀點:

開發者@9dev 表示,對終端使用者而言,真正的益處在于整個網際網路協定棧回歸到它應有的完全透明狀态。使用者不應該再需要操心IP位址問題;IPv6使得裝置真正實作“即插即用”,即裝置能夠自行擷取位址,自行協商連接配接。理想情況下,使用者再也不必關心這部分連接配接問題。的确,IPv6給網絡營運商帶來了複雜性,但這也是複雜性應當的。

@lxgr 在學習這篇文章後,針對作者提到的一些看法,有不同的意見:

針對“IPv6沒有子網路遮罩”的說法,他認為絕對是有子網路遮罩的,隻不過在IPv6中它們被稱為字首長度。/64字首剛好适合與SLAAC(無狀态位址自動配置)配合使用。

針對“IPv6沒有NAT”的說法,同樣,IPv4也沒有自帶NAT。NAT是一種路由器可以選擇實作的技術,當然在IPv6中也同樣可行。例如,Linux作業系統就實作了IPv6的NAT,隻擁有一個IPv6位址的情況下,例如從本地網絡獲得一個位址并在機器上運作虛拟機時,IPv6的NAT可能是必不可少的。

針對“IPv6位址是自配置的”的說法,有時确實是這樣,但也有時候并非如此,還有DHCPv6和靜态配置的方式。

針對“IPv6位址無法記住”的說法,那又怎樣呢?反正他也沒興趣記住IPv4位址、電話号碼等資訊。

針對“IPv6對終端使用者沒有好處”的說法,作為終端使用者,他發現IPv6給我帶來了很多好處:

  • 防火牆穿越比NAT穿越更可預測且成功率更高。像VoIP、Tailscale等服務在IPv6環境下相比跨越一層或多層NAT的成功率大大提高。
  • 家裡的所有裝置都可以擷取公網位址,他可以通過路由器上的防火牆規則選擇性地開放入站連接配接。
  • 移動網絡上的路由更為直接,進而降低了延遲(IPv4常常需要通過一系列昂貴且具有狀态的CG-NAT裝置,在使用的移動網絡服務商部署IPv6的地區,這種情況得以避免)。

對于 IPv6,你有哪些見解呢?歡迎在下方留言。