導(dǎo)讀:工程師的想象力是無(wú)窮的,在過(guò)去的十幾年間,我們嘗試通過(guò)各種辦法為 IPv4 協(xié)議續(xù)命延緩 IP 資源耗盡的時(shí)間,不過(guò)在可預(yù)見(jiàn)的未來(lái) IPv4 協(xié)議也終將被 IPv6 替代,我們也會(huì)擁有幾乎用不完的 IP 地址。
網(wǎng)絡(luò)層協(xié)議承擔(dān)了分組(Packet)轉(zhuǎn)發(fā)和路由選擇兩大功能,它能夠?yàn)樯蠈犹峁┰诓煌鳈C(jī)之間運(yùn)輸分組的職責(zé),IP 協(xié)議作為網(wǎng)絡(luò)層協(xié)議,它雖然只能提供無(wú)連接的、不可靠的服務(wù),但是它在今天的互聯(lián)網(wǎng)中起到了極其關(guān)鍵的作用。
圖 1 - 互聯(lián)網(wǎng)協(xié)議簇
在一般情況下,當(dāng)我們想要訪(fǎng)問(wèn)其他主機(jī)提供的服務(wù)時(shí),都需要通過(guò) IP 地址來(lái)訪(fǎng)問(wèn)目標(biāo)主機(jī),只有擁有了 IP 地址才能在互聯(lián)網(wǎng)上被其他主機(jī)訪(fǎng)問(wèn)。IP 地址就像家庭住址,我們需要保證所有主機(jī) IP 地址的唯一性,這樣才能找到正確的主機(jī)。
作為在 1974 年誕生的 IP 協(xié)議[^1],第一個(gè)主要版本 IPv4 使用 32 位表示地址,總共可以提供 2^32 (4,294,967,296) 個(gè) IP 地址[^2]。42 億個(gè) IP 地址雖然看起來(lái)很多,但是可用的 IPv4 地址數(shù)量在最近幾年一直在減少,早在 2011 年,頂級(jí)的 IPv4 地址就已經(jīng)被全部分配出去了。
圖 2 - IPv4 地址的小數(shù)表示
為了解決 IP 地址即將被耗盡的問(wèn)題,IETF 在 1998 年就發(fā)布了 IPv6 協(xié)議的草稿[^4]并在 2017 年正式成為互聯(lián)網(wǎng)標(biāo)準(zhǔn)]。IPv6 使用 128 位的 IP 地址,總共可以表示 2^128 個(gè)地址,IPv6 甚至可以為地球上的沙子分配獨(dú)立的地址:
新版本的互聯(lián)網(wǎng)協(xié)議 IPv6 不僅能夠一勞永逸地解決 IP 地址即將被耗盡的問(wèn)題,還能提高網(wǎng)絡(luò)的傳輸速度以及安全性。IPv6 協(xié)議的設(shè)計(jì)者最初認(rèn)為隨著 IPv4 地址的快速減少,IPv6 會(huì)被快速采納,它們最初估計(jì) IPv6 協(xié)議會(huì)在 2003 年在全球部署,但是從今天的角度來(lái)看,這些預(yù)測(cè)還是過(guò)于樂(lè)觀(guān)了[^7]。
本文想要分析的問(wèn)題是,為什么 IPv6 協(xié)議有如此之多的好處并且能夠解決 IPv4 的地址短缺問(wèn)題,但是哪怕在最初預(yù)估的 2003 年后又過(guò)了 17 年,IPv6 協(xié)議也沒(méi)有被大規(guī)模采納。我們?cè)谶@里會(huì)討論以下幾個(gè)原因:
NAT 技術(shù)很大程度上緩解了 IPv4 地址短缺的問(wèn)題;IPv6 協(xié)議在設(shè)計(jì)時(shí)沒(méi)有考慮與 IPv4 的兼容性問(wèn)題;更細(xì)粒度的管控 IPv4 地址并回收閑置的資源;
NAT網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation、NAT)是一種在 IP 數(shù)據(jù)包通過(guò)路由器時(shí)修改網(wǎng)絡(luò)地址的技術(shù),它能夠?qū)?dāng)前地址空間中的 IP 地址映射到另一個(gè)地址空間。當(dāng)切換網(wǎng)絡(luò)或者上游的 ISP 出現(xiàn)改變時(shí),NAT 技術(shù)可以避免修改網(wǎng)絡(luò)中全部節(jié)點(diǎn)的 IP,我們可以將 NAT 技術(shù)理解成一個(gè)轉(zhuǎn)換表,其中存儲(chǔ)著外部地址和端口到內(nèi)部地址和端口的轉(zhuǎn)換關(guān)系。
圖 3 - 網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)
當(dāng)數(shù)據(jù)包從內(nèi)部訪(fǎng)問(wèn)外部網(wǎng)絡(luò)時(shí),NAT 會(huì)為當(dāng)前請(qǐng)求分配一個(gè)端口、覆寫(xiě)數(shù)據(jù)包中的源地址和端口并將地址和端口信息存儲(chǔ)到本地的轉(zhuǎn)換表中;當(dāng)數(shù)據(jù)包從外部進(jìn)入網(wǎng)絡(luò)內(nèi)部時(shí),NAT 會(huì)根據(jù)數(shù)據(jù)包的 IP 地址和端口號(hào)查找到私有網(wǎng)絡(luò)中對(duì)應(yīng)的主機(jī)和端口號(hào)并覆寫(xiě)數(shù)據(jù)包中的目的地址和端口。
圖 4 - NAT 轉(zhuǎn)換表
通過(guò) NAT 這一中間層,我們不僅可保護(hù)私有的網(wǎng)絡(luò),還能緩解 IP 地址的短缺問(wèn)題。不過(guò) NAT 技術(shù)也并不是只有好處,它也帶來(lái)了很多的問(wèn)題,在 NAT 網(wǎng)絡(luò)下的主機(jī)并不能與對(duì)端建立起真正的端到端連接,也不能參與部分因特網(wǎng)協(xié)議,除此之外,NAT 協(xié)議帶來(lái)的以下問(wèn)題也備受爭(zhēng)議:
NAT 使用的端口號(hào)是用于進(jìn)程尋址的,而不是用于主機(jī)尋址的;NAT 路由器作為第三層(網(wǎng)絡(luò)層)的設(shè)備,它應(yīng)當(dāng)只處理達(dá)到網(wǎng)絡(luò)層的分組;NAT 違反了主機(jī)應(yīng)當(dāng)直接彼此對(duì)話(huà)的原則;
雖然 NAT 帶來(lái)了很多的爭(zhēng)議和問(wèn)題,但是 NAT 已經(jīng)成為了整個(gè)互聯(lián)網(wǎng)中廣泛使用的技術(shù),工程師也嘗試通過(guò)各種 NAT 穿越技術(shù)來(lái)解決它帶來(lái)的問(wèn)題,例如:SOCKS、UPnP 和 ALG 等[^10]。
兼容性軟件和協(xié)議都會(huì)遵循當(dāng)下以及可預(yù)測(cè)的未來(lái)進(jìn)行設(shè)計(jì),但是我們很難預(yù)測(cè)未來(lái)的具體走勢(shì),當(dāng)下的設(shè)計(jì)也會(huì)隨著場(chǎng)景的變換變得逐漸不適用。所有的軟件和協(xié)議都是需要更新迭代的,在更新的過(guò)程中我們就需要考慮兼容性,兼容性一般可以分成向前兼容(Forward compatibility)和向后兼容(Backward compatibility)兩種:
向前兼容:老版本系統(tǒng)可以接收并處理新版本系統(tǒng)產(chǎn)生的數(shù)據(jù);向后兼容:新版本系統(tǒng)可以接收并處理老版本系統(tǒng)產(chǎn)生的數(shù)據(jù);
圖 5 - 系統(tǒng)的兼容性
這兩種不同的兼容性可以起到不同的作用,如果 IPv6 協(xié)議與 IPv4 是向前兼容的,那么用于處理 IPv4 協(xié)議的硬件設(shè)備可以不用更新就能處理 IPv6 的數(shù)據(jù),不過(guò)不更新系統(tǒng)也無(wú)法享受 IPv6 帶來(lái)的好處;如果 IPv6 協(xié)議與 IPv4 協(xié)議是向后兼容的,那么 IPv6 的硬件可以同時(shí)處理 IPv4 和 IPv6 的數(shù)據(jù)包,只要使用 IPv6 設(shè)備替換 IPv4 設(shè)備就可以給整個(gè)網(wǎng)絡(luò)無(wú)縫升級(jí)。
如果 IPv4 和 IPv6 能夠具有向前兼容性或者向后兼容性,那么 IPv6 協(xié)議的推進(jìn)也可能也沒(méi)有這么復(fù)雜,但是 IPv6 協(xié)議在設(shè)計(jì)時(shí)就沒(méi)有考慮與更早版本協(xié)議的兼容性。雖然 IPv4 和 IPv6 雖然都是 IP 協(xié)議,不過(guò)因?yàn)樗鼈儍烧呋ゲ患嫒?,所以我們只能通過(guò)雙協(xié)議棧、隧道技術(shù)或者 NAT64 實(shí)現(xiàn)協(xié)議的過(guò)渡:
圖 6 - 雙協(xié)議棧
IPv6 協(xié)議想要擺脫歷史的包袱,實(shí)現(xiàn)完全不兼容的設(shè)計(jì)是可以理解的,在過(guò)去幾十年應(yīng)用 IP 協(xié)議的過(guò)程中,我們遇到了很多的問(wèn)題,如果要背著歷史的包袱繼續(xù)前行也不是不可以,但是作為互聯(lián)網(wǎng)的核心協(xié)議,雖然 IP 協(xié)議的設(shè)計(jì)者承認(rèn) IPv6 沒(méi)有實(shí)現(xiàn)向前兼容是最大的錯(cuò)誤,但是作者認(rèn)為通過(guò)不兼容的方式快速擺脫歷史的包袱從長(zhǎng)期來(lái)看也是好事。
地址管控IPv4 的地址雖然從總體上來(lái)看確實(shí)是稀缺資源,不過(guò)與其他的稀缺資源一樣,如何合理分配資源并提供使用率一直都是比較大的問(wèn)題。IANA(Internet Assigned Numbers Authority) 和 RIR(Regional Internet Registries) 是負(fù)責(zé)分配 IP 地址的組織,除了一些為專(zhuān)有網(wǎng)絡(luò)預(yù)留的 IP 地址之外,剩余的地址一般都是通過(guò)子網(wǎng)以地址塊的形式分配。
在互聯(lián)網(wǎng)協(xié)議的早期開(kāi)發(fā)階段,子網(wǎng)是通過(guò) IP 地址最左側(cè)的 8 位劃分子網(wǎng),但是因?yàn)檫@種方式只允許劃分 256 個(gè)網(wǎng)絡(luò),所以在 1981 年被分類(lèi)網(wǎng)絡(luò)架構(gòu)(Classful Network Architecture)迅速替代。分類(lèi)網(wǎng)絡(luò)架構(gòu)中包含 A、B 和 C 三類(lèi)網(wǎng)絡(luò):
A 類(lèi)地址只能分配給 128 個(gè)不同的網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)中可以包含 1,600 萬(wàn)主機(jī),而 C 類(lèi)地址可以分配給 200 萬(wàn)組織,網(wǎng)絡(luò)中可以包含 200 多個(gè)主機(jī)。通過(guò)對(duì) IP 地址的分類(lèi),我們能夠更合理地分配 IP 地址塊,不過(guò)雖然它對(duì) IP 地址進(jìn)行了分類(lèi),但是它對(duì)地址的劃分還是比較粗糙。
IETF 在 1993 年提出的無(wú)類(lèi)別域間路由(Classless Inter-Domain Routing、CIDR)替代了分類(lèi)網(wǎng)絡(luò)架構(gòu),CIDR 基于可變長(zhǎng)子網(wǎng)掩碼(Variable-length Subnet Masking、VLSM),它的主要目的有兩個(gè):
緩解互聯(lián)網(wǎng)中路由器中轉(zhuǎn)發(fā)表的增長(zhǎng)速度;緩解 IPv4 地址耗盡的速度;
分類(lèi)網(wǎng)絡(luò)架構(gòu)中對(duì)地址的劃分還是有些過(guò)于理想,過(guò)小的地址塊往往不夠用、稍大的地址塊卻會(huì)造成較大的浪費(fèi)。與分類(lèi)網(wǎng)絡(luò)架構(gòu)只使用 8、16 和 24 固定長(zhǎng)度的子網(wǎng)掩碼將 IP 地址塊劃分成三類(lèi)不同,CIDR 會(huì)使用可變長(zhǎng)度的子網(wǎng)掩碼來(lái)劃分地址塊,如下所示的 CIDR 表示中,N 表示前綴長(zhǎng)度,它可以是從 0 到 32 的任意值:
A.B.C.D/N
A.B.C.D/8、A.B.C.D/16 和 A.B.C.D/24 就可以分別表示分類(lèi)網(wǎng)絡(luò)架構(gòu)中的 A、B 和 C 三類(lèi)不同的地址塊,同時(shí)也可以使用其他的數(shù)字更靈活的表示特定網(wǎng)絡(luò)數(shù)和主機(jī)數(shù)的子網(wǎng)。
除了更細(xì)粒度的地址分配之外,回收不再使用的 IP 資源并投入再利用也是延長(zhǎng) IPv4 壽命的重要手段,不過(guò)在這里我們就不做展開(kāi)了。從 IP 地址的分配中,我們能看到資源從充足到稀缺,人對(duì)于資源使用態(tài)度的轉(zhuǎn)變,從最開(kāi)始粗糙的分配方式到后來(lái)細(xì)粒度的管控,充足的資源總是會(huì)被濫用,只有當(dāng)資源真正變得稀缺時(shí),我們才開(kāi)始精打細(xì)算。
總結(jié)IPv4 協(xié)議從 1981 年發(fā)布到今天已經(jīng)過(guò)去了將近 40 年,在過(guò)去的這段時(shí)間里,它作為互聯(lián)網(wǎng)協(xié)議簇中的重要協(xié)議承擔(dān)著分組轉(zhuǎn)發(fā)和路由選擇的重要責(zé)任,隨著網(wǎng)絡(luò)環(huán)境和終端設(shè)備變得越來(lái)越復(fù)雜,我們也需要更多的 IP 地址滿(mǎn)足今天的需求。
圖 7 - 訪(fǎng)問(wèn) Google 的 IPv6 協(xié)議采納率[^14]
IPv6 協(xié)議擺脫了很多歷史的包袱輕裝前行,雖然越來(lái)越多的網(wǎng)站和網(wǎng)絡(luò)設(shè)備都開(kāi)始支持 IPv6,但是因?yàn)楹芏嘣?IPv6 最終也很難完全取代 IPv4 協(xié)議,我們重新回顧一下本文的內(nèi)容:
NAT 技術(shù)可以很大程度上緩解 IPv4 的地址短缺問(wèn)題并且能夠保護(hù)私有內(nèi)部的網(wǎng)絡(luò),提供防火墻的功能;IPv4 與 IPv6 協(xié)議完全不兼容,我們需要引入雙協(xié)議棧、隧道技術(shù)或者 NAT64 解決兼容性問(wèn)題,而應(yīng)用這些技術(shù)也需要額外的成本;通過(guò)對(duì)資源的細(xì)粒度管控并回收不再使用的 IP 地址,可以延緩 IP 地址耗盡的時(shí)間;
工程師的想象力是無(wú)窮的,在過(guò)去的十幾年間,我們嘗試通過(guò)各種辦法為 IPv4 協(xié)議續(xù)命延緩 IP 資源耗盡的時(shí)間,不過(guò)在可預(yù)見(jiàn)的未來(lái) IPv4 協(xié)議也終將被 IPv6 替代,我們也會(huì)擁有幾乎用不完的 IP 地址。到最后,我們還是來(lái)看一些比較開(kāi)放的相關(guān)問(wèn)題,有興趣的讀者可以仔細(xì)思考一下下面的問(wèn)題:
IPv5 協(xié)議是做什么的?為什么沒(méi)有聽(tīng)說(shuō)過(guò) IPv5 協(xié)議?你覺(jué)得 IPv6 協(xié)議的份額會(huì)在多久之后超過(guò) IPv4?