網(wǎng)絡(luò)層協(xié)議
01 | IPv4 協(xié)議:路由和尋址的區(qū)別是什么
如果說傳輸層協(xié)議,除了 TCP/UDP,我們還可以有其他選擇,比如 Google 開發(fā)的 QUIC 協(xié)議,幫助在傳輸層支持 HTTP 3.0 傳輸。但是在網(wǎng)絡(luò)層,IP 協(xié)議幾乎一統(tǒng)天下。IP 協(xié)議目前主要有兩個(gè)版本 IPv4 和 IPv6。
1.1 | 什么是IP協(xié)議
IP 協(xié)議(Internet Protocol)是一個(gè)處于壟斷地位的網(wǎng)絡(luò)層協(xié)議。 IPv4 就是 IP 協(xié)議的第 4 個(gè)版本,是目前互聯(lián)網(wǎng)的主要網(wǎng)絡(luò)層協(xié)議。IPv4 為傳輸層提供 Host-To-Host 的能力,IPv4 需要底層數(shù)據(jù)鏈路層的支持。

IP 協(xié)議并不負(fù)責(zé)數(shù)據(jù)的可靠性。傳輸數(shù)據(jù)時(shí),數(shù)據(jù)被切分成一個(gè)個(gè)數(shù)據(jù)封包。IP 協(xié)議上層的傳輸層協(xié)議會(huì)對數(shù)據(jù)進(jìn)行一次拆分,IP 協(xié)議還會(huì)進(jìn)一步進(jìn)行拆分。進(jìn)行兩次拆分是為了適配底層的設(shè)備。
再復(fù)習(xí)一下可靠性,可靠性保證數(shù)據(jù)無損地到達(dá)目的地??煽啃允?IP 協(xié)議上方的 Host-To-Host 協(xié)議保證的,比如 TCP 協(xié)議通過應(yīng)答機(jī)制、窗口等保證數(shù)據(jù)的可靠性。
IP 協(xié)議自身不能保證可靠性。比如 IP 協(xié)議可能會(huì)遇到下面這幾個(gè)問題:
- 封包損壞(數(shù)據(jù)傳輸過程中被損壞);
- 丟包(數(shù)據(jù)發(fā)送過程中丟失);
- 重發(fā)(數(shù)據(jù)被重發(fā),比如中間設(shè)備通過 2 個(gè)路徑傳遞數(shù)據(jù));
- 亂序(到達(dá)目的地時(shí)數(shù)據(jù)和發(fā)送數(shù)據(jù)不一致)。
但是 IP 協(xié)議并不會(huì)去處理這些問題,因?yàn)榫W(wǎng)絡(luò)層只專注解決網(wǎng)絡(luò)層的問題, 而且不同特性的應(yīng)用在不同場景下需要解決的問題不一樣。對于網(wǎng)絡(luò)層來說,這里主要有 3 個(gè)問題要解決:
- 延遲
- 吞吐量
- 丟包率
這三個(gè)是魚和熊掌不能兼得
另外,IP 協(xié)議目前主要有兩種架構(gòu),一種是 IPv4,是目前應(yīng)用最廣泛的互聯(lián)網(wǎng)協(xié)議;另一種是 IPv6,目前世界各地正在積極地部署 IPv6。
1.2 | IP協(xié)議的工作原理
IP 協(xié)議接收 IP 協(xié)議上方的 Host-To-Host 協(xié)議傳來的數(shù)據(jù),然后進(jìn)行拆分,這個(gè)能力叫作分片(Fragmentation)。然后 IP 協(xié)議為每個(gè)片段(Fragment)增加一個(gè) IP 頭(Header),組成一個(gè)IP 封包(Datagram)。之后,IP 協(xié)議調(diào)用底層的局域網(wǎng)(數(shù)據(jù)鏈路層)傳送數(shù)據(jù)。最后 IP 協(xié)議通過尋址和路由能力最終把封包送達(dá)目的地。
1.2.1 | 分片(Fragmentation)
分片就是把數(shù)據(jù)切分成片。 IP 協(xié)議通過它下層的局域網(wǎng)(鏈路層)協(xié)議傳輸數(shù)據(jù),因此需要適配底層傳輸網(wǎng)絡(luò)的傳輸能力。
數(shù)據(jù)太大通常就不適合底層網(wǎng)絡(luò)傳輸,這就需要把大的數(shù)據(jù)切片。 當(dāng)然也可能選擇不切片,IP 協(xié)議提供了一個(gè)能力就是把封包標(biāo)記為不切片,當(dāng)?shù)讓泳W(wǎng)絡(luò)看到不切片的封包,又沒有能力傳輸?shù)臅r(shí)候,就會(huì)丟棄這個(gè)封包。要注意,在網(wǎng)絡(luò)環(huán)境中往往存在多條路徑,一條路徑斷了,說不定其他路徑可以連通。
1.2.2 | 增加協(xié)議頭(IP Header)
切片完成之后,IP 協(xié)議會(huì)為每個(gè)切片(數(shù)據(jù)封包 Datagram)增加一個(gè)協(xié)議頭。一個(gè) IPv4 的協(xié)議頭看上去就是如下圖所示的樣子:

其中分成 4 個(gè)部分。
- 最重要的是原地址和目標(biāo)地址。IPv4 的地址是 4 組 8 位的數(shù)字,總共是 32 位。具體地址的作用我們在下面的“尋址部分”介紹。
- Type Of Service 服務(wù)的類型,是為了響應(yīng)不同的用戶訴求,用來選擇延遲、吞吐量和丟包率之間的關(guān)系。關(guān)于這塊知識,本講后半部分就會(huì)分析。
- IHL(Internet Header Length)用來描述 IP 協(xié)議頭的大小。所以 IP 協(xié)議頭的大小是可變的。IHL 只有 4 位,最大值 1111 = 15。最大是 15 個(gè)雙字(15*4 字節(jié) = 60 字節(jié))。
- Total Length 定義報(bào)文(封包 Datagram)的長度。
- Identification(報(bào)文的 ID),發(fā)送方分配,代表順序。
- Fragment offset 描述要不要分包(拆分),以及如何拆分。
- Time To Live 描述封包存活的時(shí)間。因此每個(gè) IP 封包發(fā)送出去后,就開始銷毀倒計(jì)時(shí)。如果倒計(jì)時(shí)為 0,就會(huì)銷毀。比如中間的路由器看到一個(gè) TTL 為 0 的封包,就直接丟棄。
- Protocol 是描述上層的協(xié)議,比如 TCP = 6,UDP = 17。
- Options 代表可選項(xiàng)。
- Checksum 用來檢驗(yàn)封包的正確性。如果 Checksum 對不上,就需要選擇丟棄這個(gè)封包。
1.3 | 延遲、吞吐量、丟包率
Pv4 協(xié)議中提供了一個(gè)叫作 Type of Service(服務(wù)類型)的字段。這個(gè)字段是為了在延遲、吞吐量和丟包率三者間選擇。
1.3.1 | 延遲(latency)
延遲指的是 1 bit 的數(shù)據(jù)從網(wǎng)絡(luò)的一個(gè)終端傳送到另一個(gè)終端需要的時(shí)間。這個(gè)時(shí)間包括在發(fā)送端準(zhǔn)備發(fā)送的時(shí)間、排隊(duì)發(fā)送的時(shí)間、發(fā)送數(shù)據(jù)的時(shí)間、數(shù)據(jù)傳輸?shù)臅r(shí)間等。
1.3.2 | 吞吐量(Throughput)
吞吐量指單位時(shí)間內(nèi)可以傳輸?shù)钠骄鶖?shù)據(jù)量。比如用 bit/s 作為單位,就是 bps。
吞吐量和延遲沒有聯(lián)系,比如延遲很高的網(wǎng)絡(luò),有可能吞吐量很高。可以類比成水管很大流速很慢,對比水管很細(xì)流速很快,這兩種情況,最終流量可以是相等的。
1.3.3 | 丟包率(Packet loss)
丟包率指發(fā)送出去的封包沒有到達(dá)目的地的比例。 在最大流速確定的網(wǎng)絡(luò)中,丟包率會(huì)直接影響吞吐量。
我們的網(wǎng)絡(luò)有時(shí)候需要低延遲,比如玩一款 RTS 游戲或者 Moba 游戲,這種時(shí)候延遲非常重要。另外如果把延遲看作一個(gè)平均指標(biāo),丟包也會(huì)影響延遲——一個(gè)包丟了,需要重發(fā)。而有的應(yīng)用需要高吞吐量,延遲不是很重要,比如說網(wǎng)盤下載文件。大部分應(yīng)用期望丟包不能太嚴(yán)重,比如語音電話,少量丟包還能聽清,大量丟包就麻煩了,根本聽不清對方說什么。嚴(yán)格希望不丟包的應(yīng)用比較少,只有極特殊的網(wǎng)絡(luò)控制管理場景,才需要在互聯(lián)網(wǎng)層要求不丟包。
當(dāng)然這三個(gè)條件,通常不能同時(shí)滿足。如果同時(shí)追求延遲、吞吐量、丟包率,那么對網(wǎng)絡(luò)設(shè)備的要求就會(huì)非常高,說白了就會(huì)非常貴。因此 IP 協(xié)議頭中的 Type of Service 字段里,有以下 4 種主要的類型可以選擇:
- 低延遲
- 高吞吐量
- 低丟包率
- 低成本
1.4 | 尋址(Addressing)
地址想要表達(dá)的是一個(gè)東西在哪里。尋址要做的就是:給一個(gè)地址,然后找到這個(gè)東西。IPv4 協(xié)議的尋址過程是逐級尋址。
1.4.1 | IPv4地址
IPv4 地址是 4 個(gè) 8 位(Octet)排列而成,總共可以編址 43 億個(gè)地址。
比如 103.16.3.1 就是一個(gè)合法的 Ipv4 地址。4 組數(shù)字用.分開,是為了讓人可讀,實(shí)際上在內(nèi)存和傳輸過程中,就是直接用 32 位。
你可以觀察一下103.16.3.1的二進(jìn)制,如下圖所示:

1.4.2 | 尋址過程
尋址就是如何根據(jù) IP 地址找到設(shè)備。
因?yàn)?IPv4 的世界中,網(wǎng)絡(luò)是一個(gè)樹狀模型。頂層有多個(gè)平行的網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)有自己的網(wǎng)絡(luò)號。然后頂層網(wǎng)絡(luò)下方又有多個(gè)子網(wǎng),子網(wǎng)下方還有子網(wǎng),最后才是設(shè)備。

IP 協(xié)議的尋址過程需要逐級找到網(wǎng)絡(luò),最后定位設(shè)備。下面具體分析下這個(gè)過程。
步驟一:找到頂層網(wǎng)絡(luò)
比如103.16.3.1最頂層的網(wǎng)絡(luò)號可以和255.0.0.0(子網(wǎng)掩碼)做位與運(yùn)算得到
103.16.3.1 & 255.0.0.0 = 103.0.0.0
因此103.0.0.0就是103.16.3.1所在的頂層網(wǎng)絡(luò)。255.0.0.0.稱作子網(wǎng)掩碼。子網(wǎng)掩碼的作用就是幫助根據(jù) IP 地址找到對應(yīng)子網(wǎng)。子網(wǎng)掩碼是很多個(gè)1接著很多個(gè)0,和 IP 地址一起使用。
步驟 2:找到下一層網(wǎng)絡(luò)
接下來要找到下一級網(wǎng)絡(luò),就需要用 IP 地址和下一級的子網(wǎng)掩碼做位與運(yùn)算。
103.16.3.1 & 255.255.0.0 = 103.16.0.0
其中103.16.0.0就是下一級的網(wǎng)絡(luò)號
步驟 3:找到再下一級網(wǎng)絡(luò)
接下來使用255.255.255.0子網(wǎng)掩碼找到下一級網(wǎng)絡(luò)是103.16.3.0。
步驟 4:定位設(shè)備
設(shè)備就在子網(wǎng)103.16.3.0中,最終找到的設(shè)備號是1。
當(dāng)然子網(wǎng)掩碼也不一定都是255,比如這個(gè)子網(wǎng)掩碼255.240.0.0也是可以的。但通常我們把 IPv4 的網(wǎng)絡(luò)分成這樣 4 層。
1.5 | 路由(Routing)
在尋址過程中,數(shù)據(jù)總是存于某個(gè)局域網(wǎng)中。如果目的地在局域網(wǎng)中,就可以直接定位到設(shè)備了。如果目的地不在局域網(wǎng)中,這個(gè)時(shí)候,就需再去往其他網(wǎng)絡(luò)。
由于網(wǎng)絡(luò)和網(wǎng)絡(luò)間是網(wǎng)關(guān)在連接,因此如果目的地 IP 不在局域網(wǎng)中,就需要為 IP 封包選擇通往下一個(gè)網(wǎng)絡(luò)的路徑,其實(shí)就是選擇其中一個(gè)網(wǎng)關(guān)。你可能會(huì)問:網(wǎng)關(guān)有多個(gè)嗎?如果一個(gè)網(wǎng)絡(luò)和多個(gè)網(wǎng)絡(luò)接壤,那自然需要多個(gè)網(wǎng)關(guān)了。下圖中,路由器在選擇 IP 封包下一個(gè)應(yīng)該是去往哪個(gè) Gateway?

假如,我們要為 IP 地址 14.215.177.38 尋址,當(dāng)前路由器所在的網(wǎng)絡(luò)的編號是16.0.0.0。那么我們就需要知道去往 14.0.0.0 網(wǎng)絡(luò)的 Gateway IP 地址。
如果你在當(dāng)前網(wǎng)絡(luò)中用route查看路由表,可能可以看到一條下面這樣的記錄。
- Destination:14.0.0.0
- Gateway:16.12.1.100
- Mask:255.0.0.0
- Iface:16.12.1.1
這條記錄就說明如果你要去往 14.0.0.0 網(wǎng)絡(luò),IP 地址 14.215.177.38 先要和 255.0.0.0 進(jìn)行位運(yùn)算,然后再查表,看到 14.0.0.0,得知去往 Gateway 的網(wǎng)卡(IFace)是 16.12.1.1。
當(dāng)封包去向下一個(gè)節(jié)點(diǎn)后,會(huì)進(jìn)入新的路由節(jié)點(diǎn),然后會(huì)繼續(xù)上述路由過程,直到最終定位到設(shè)備。
1.6 | 總結(jié)
學(xué)習(xí)了 IP 協(xié)議和 IP 協(xié)議的工作原理。
首先 IP 協(xié)議會(huì)進(jìn)行分片,將上游數(shù)據(jù)拆成一個(gè)個(gè)的封包(Datagram),然后為封包增加 IP 頭部。封包發(fā)送出去后,就開始了尋址過程。
尋址就是找到 IP 地址對應(yīng)的設(shè)備。在局域網(wǎng)內(nèi),如果找不到設(shè)備,就需要路由。
路由就是找到數(shù)據(jù)應(yīng)該往哪里發(fā)送。最后通過層層路由定位到具體的設(shè)備。
最后,路由和尋址的區(qū)別是什么?
【解析】尋址(Addressing)就是通過地址找設(shè)備。和現(xiàn)實(shí)生活中的尋址是一樣的,比如根據(jù)地址找到一個(gè)公寓。在 IPv4 協(xié)議中,尋址找到的是一個(gè)設(shè)備所在的位置。
路由(Routing)本質(zhì)是路徑的選擇。就好像知道地址,但是到了每個(gè)十字路口,還需要選擇具體的路徑。
所以,要做路由,就必須能夠理解地址,也就是需要借助尋址的能力。要通過尋址找到最終的設(shè)備,又要借助路由在每個(gè)節(jié)點(diǎn)選擇數(shù)據(jù)傳輸?shù)木€路。因此,路由和尋址,是相輔相成的關(guān)系。
02 | IPv6協(xié)議
IPv4 用 32 位整數(shù)描述地址,最多只能支持 43 億設(shè)備,顯然是不夠用的,這也被稱作 IP 地址耗盡問題。
為了解決這個(gè)問題,有一種可行的方法是拆分子網(wǎng)。拆分子網(wǎng),會(huì)帶來很多問題,比如說內(nèi)外網(wǎng)數(shù)據(jù)交互,需要網(wǎng)絡(luò)地址轉(zhuǎn)換協(xié)議(NAT 協(xié)議),增加傳輸成本。再比如說,多級網(wǎng)絡(luò)會(huì)增加數(shù)據(jù)的路由和傳輸鏈路,降低網(wǎng)絡(luò)的速度。理想的狀態(tài)當(dāng)然是所有設(shè)備在一個(gè)網(wǎng)絡(luò)中,互相可以通過地址訪問。
為了解決這個(gè)問題,1998 年互聯(lián)網(wǎng)工程工作小組推出了全新款的 IP 協(xié)議——IPv6 協(xié)議。
2.1 | IPv4和IPv6相似點(diǎn)
IPv6 的工作原理和 IPv4 類似,分成切片(Segmentation)、增加封包頭、路由(尋址)這樣幾個(gè)階段去工作。
IPv6 同樣接收上方主機(jī)到主機(jī)(Host-to-Host)協(xié)議傳遞來的數(shù)據(jù),比如一個(gè) TCP 段(Segment),然后將 TCP 段再次切片做成一個(gè)個(gè)的 IPv6 封包(Datagram or Packet),再調(diào)用底層局域網(wǎng)能力(數(shù)據(jù)鏈路層)傳輸數(shù)據(jù)。

作為網(wǎng)絡(luò)層協(xié)議的 IPv6,最核心的能力是確保數(shù)據(jù)可以從發(fā)送主機(jī)到達(dá)接收主機(jī)。因此,和 IPv4 類似,IPv6同樣需要定義地址的格式,以及路由算法如何工作。
2.2 | IPv6地址
IPv4 的地址是 4 個(gè) 8 位(octet),總共 32 位。 IPv6 的地址是 8 個(gè) 16 位(hextet),總共 128 位。從這個(gè)設(shè)計(jì)來看,IPv6 可以支持的地址數(shù)量是 IPv4 的很多倍。
格式上,IPv4 的地址用.分割,如103.28.7.35。每一個(gè)是 8 位,用 0-255 的數(shù)字表示。
IPv6 的地址用:分割,如0123:4567:89ab:cdef:0123:4567:89ab:cdef,總共 8 個(gè) 16 位的數(shù)字,通常用 16 進(jìn)制表示。
- Hexadecimal notation:十六進(jìn)制表示
- Quartet:16 位
- Most significant:最高有效位
- Binary notation:二進(jìn)制表示



::只能出現(xiàn)一次,相當(dāng)于省略了若干組0000。比如說1111::2222相當(dāng)于中間省略了 6 組0000。為什么不能出現(xiàn)兩個(gè)::呢?因?yàn)槿绻袃蓚€(gè)::,就會(huì)對省略的0000的位置產(chǎn)生歧義。比如說1111::2222::3333,你就不知道究竟0000在1111::2222和2222::3333是怎么分布的。

2.3 | IPv6的尋址
和 IPv4 相同,尋址的目的是找到設(shè)備,以及規(guī)劃到設(shè)備途經(jīng)的路徑。和 IPv4 相同,IPv6尋址最核心的內(nèi)容就是要對網(wǎng)絡(luò)進(jìn)行劃分。IPv6 地址很充裕,因此對網(wǎng)絡(luò)的劃分和 IPv4 有很顯著的差異。
IPv6 的尋址分成了幾種類型:
- 全局單播尋址(和 IPv4 地址作用差不多,在互聯(lián)網(wǎng)中通過地址查找一個(gè)設(shè)備,簡單來說,單播就是 1 對 1);
- 本地單播(類似 IPv4 里的一個(gè)內(nèi)部網(wǎng)絡(luò),要求地址必須以fe80開頭,類似我們 IPv4 中127開頭的地址);
- 分組多播(Group Multicast),類似今天我們說的廣播,將消息發(fā)送給多個(gè)接收者;
- 任意播(Anycast),這個(gè)方式比較特殊,接下來我們會(huì)詳細(xì)講解。

2.3.1 | 全局單播

全局單播,就是將消息從一個(gè)設(shè)備傳到另一個(gè)設(shè)備,這和 IPv4 發(fā)送/接收消息大同小異。而全局單播地址,目標(biāo)就是定位網(wǎng)絡(luò)中的設(shè)備,這個(gè)地址和 IPv4 的地址作用相同,只不過格式略有差異。總的來說,IPv6 地址太多,因此不再需要子網(wǎng)掩碼,而是直接將 IPv6 的地址分區(qū)即可。
在實(shí)現(xiàn)全局單播時(shí),IPv6 地址通常分成 3 個(gè)部分:
- 站點(diǎn)前綴(Site Prefix)48bit,一般是由 ISP(Internet Service Providor,運(yùn)營商)或者RIR(Regional Internet Registry, 地區(qū)性互聯(lián)網(wǎng)注冊機(jī)構(gòu)),RIR 將 IP 地址分配給運(yùn)營商;
- 子網(wǎng)號(Subnet ID),16bit,用于站點(diǎn)內(nèi)部區(qū)分子網(wǎng);
- 接口號(Interface ID), 64bit,用于站點(diǎn)內(nèi)部區(qū)分設(shè)備。
因此 IPv6 也是一個(gè)樹狀結(jié)構(gòu),站點(diǎn)前綴需要一定資質(zhì),子網(wǎng)號和接口號內(nèi)部定義。IPv6 的尋址過程就是先通過站點(diǎn)前綴找到站點(diǎn),然后追蹤子網(wǎng),再找到接口(也就是設(shè)備的網(wǎng)卡)。
從上面全局單播的分區(qū),我們可以看出,IPv6 分給站點(diǎn)的地址非常多。一個(gè)站點(diǎn),有 16bit 的子網(wǎng),相當(dāng)于 65535 個(gè)子網(wǎng);每個(gè)子網(wǎng)中,還可以用 64 位整數(shù)表示設(shè)備。
2.3.2 | 本地單播
在局域網(wǎng)絡(luò)中,實(shí)現(xiàn)設(shè)備到設(shè)備的通信,就是本地單播。IPv6 的本地單播地址組成如下圖所示

這種協(xié)議比較簡單,本地單播地址必須以fe80開頭,后面 64 位的 0,然后接上 54 位的設(shè)備編號。上圖中的 Interface 可以理解成網(wǎng)絡(luò)接口,其實(shí)就是網(wǎng)卡。
2.3.3 | 分組多播
所謂廣播,就是將消息同時(shí)發(fā)送給多個(gè)接收者。
IPv6 中設(shè)計(jì)了分組多播,來實(shí)現(xiàn)廣播的能力。當(dāng) IP 地址以 8 個(gè) 1 開頭,也就是ff00開頭,后面會(huì)跟上一個(gè)分組的編號時(shí),就是在進(jìn)行分組多播。
這個(gè)時(shí)候,我們需要一個(gè)廣播設(shè)備,在這個(gè)設(shè)備中已經(jīng)定義了這些分組編號,并且擁有分組下所有設(shè)備的清單,這個(gè)廣播設(shè)備會(huì)幫助我們將消息發(fā)送給對應(yīng)分組下的所有設(shè)備。
2.3.4 | 任意播(Anycast)
任意播,本質(zhì)是將消息發(fā)送給多個(gè)接收方,并選擇一條最優(yōu)的路徑。
比如說在一個(gè)網(wǎng)絡(luò)中有多個(gè)授時(shí)服務(wù),這些授時(shí)服務(wù)都共享了一個(gè)任播地址。當(dāng)一個(gè)客戶端想要獲取時(shí)間,就可以將請求發(fā)送到這個(gè)任播地址??蛻舳说恼埱髷U(kuò)散出去后,可能會(huì)找到授時(shí)服務(wù)中的一個(gè)或者多個(gè),但是距離最近的往往會(huì)先被發(fā)現(xiàn)。這個(gè)時(shí)候,客戶端就使用它第一次收到的授時(shí)信息修正自己的時(shí)間。
2.4 | IPv6 和 IPv4 的兼容
目前 IPv6 還沒有完全普及,大部分知名的網(wǎng)站都是同時(shí)支持 IPv6 和 IPv4。這個(gè)時(shí)候我們可以分成 2 種情況討論:
- 一個(gè) IPv4 的網(wǎng)絡(luò)和一個(gè) IPv6 的網(wǎng)絡(luò)通信;
- 一個(gè) IPv6 的網(wǎng)絡(luò)和一個(gè) IPv6 的網(wǎng)絡(luò)通信,但是中間需要經(jīng)過一個(gè) IPv4 的網(wǎng)絡(luò)。
情況 1:IPv4 網(wǎng)絡(luò)和 IPv6 網(wǎng)絡(luò)通信
例如一個(gè) IPv6 的客戶端,想要訪問 IPv4 的服務(wù)器

- 客戶端通過 DNS64 服務(wù)器查詢 AAAA 記錄。DNS64 是國際互聯(lián)網(wǎng)工程任務(wù)組(IETF)提供的一種解決 IPv4 和 IPv6 兼容問題的 DNS 服務(wù)。這個(gè) DNS 查詢服務(wù)會(huì)把 IPv4 地址和 IPv6 地址同時(shí)返回。
- DNS64 服務(wù)器返回含 IPv4 地址的 AAAA 記錄。
- 客戶端將對應(yīng)的 IPv4 地址請求發(fā)送給一個(gè) NAT64 路由器
- 由這個(gè) NAT64 路由器將 IPv6 地址轉(zhuǎn)換為 IPv4 地址,從而訪問 IPv4 網(wǎng)絡(luò),并收集結(jié)果。
- 消息返回到客戶端。
情況 2:兩個(gè) IPv6 網(wǎng)絡(luò)被 IPv4 隔離
這種情況在普及 IPv6 的過程中比較常見,IPv6 的網(wǎng)絡(luò)一開始是一個(gè)個(gè)孤島,IPv6 網(wǎng)絡(luò)需要通信,就需要一些特別的手段。
不知道你有沒有聯(lián)想到坐火車穿越隧道的感覺,連接兩個(gè)孤島 IPv6 網(wǎng)絡(luò),其實(shí)就是在 IPv4 網(wǎng)絡(luò)中建立一條隧道。

隧道的本質(zhì)就是在兩個(gè) IPv6 的網(wǎng)絡(luò)出口網(wǎng)關(guān)處,實(shí)現(xiàn)一段地址轉(zhuǎn)換的程序。
2.5 | 總結(jié)
總結(jié)下,IPv6 解決的是地址耗盡的問題。因?yàn)榻鉀Q了地址耗盡的問題,所以很多其他問題也得到了解決,比如說減少了子網(wǎng),更小的封包頭部體積,最終提升了性能等。
最后,Tunnel技術(shù)是什么?
【解析】Tunnel 就是隧道,這和現(xiàn)實(shí)中的隧道是很相似的。隧道不是只有一輛車通過,而是每天都有大量的車輛來來往往。兩個(gè)網(wǎng)絡(luò),用隧道連接,位于兩個(gè)網(wǎng)絡(luò)中的設(shè)備通信,都可以使用這個(gè)隧道。隧道是兩個(gè)網(wǎng)絡(luò)間用程序定義的一種通道。具體來說,如果兩個(gè) IPv6 網(wǎng)絡(luò)被 IPv4 分隔開,那么兩個(gè) IPv6 網(wǎng)絡(luò)的出口處(和 IPv4 網(wǎng)絡(luò)的網(wǎng)關(guān)處)就可以用程序(或硬件)實(shí)現(xiàn)一個(gè)隧道,方便兩個(gè)網(wǎng)絡(luò)中設(shè)備的通信。
03 | 局域網(wǎng):NAT工作原理
之前在討論廣域網(wǎng)的設(shè)計(jì),今天到微觀層面,看看局域網(wǎng)是如何工作的。
IPv4 的地址不夠,因此需要設(shè)計(jì)子網(wǎng)。當(dāng)一個(gè)公司申請得到一個(gè)公網(wǎng) IP 后,會(huì)在自己的公司內(nèi)部設(shè)計(jì)一個(gè)局域網(wǎng)。這個(gè)局域網(wǎng)所有設(shè)備的 IP 地址,通常會(huì)以 192.168 開頭。這個(gè)時(shí)候,假設(shè)你的職工小明,上班時(shí)間玩王者榮耀。當(dāng)他用 UDP 協(xié)議向王者榮耀的服務(wù)器發(fā)送信息時(shí),消息的源 IP 地址是一個(gè)內(nèi)網(wǎng) IP 地址,而王者榮耀的服務(wù),是一個(gè)外網(wǎng) IP 地址。
數(shù)據(jù)到王者榮耀服務(wù)器可以通過尋址和路由找到目的地,但是數(shù)據(jù)從王者榮耀服務(wù)器回來的時(shí)候,王者榮耀服務(wù)器如何知道192.168開頭的地址應(yīng)該如何尋址呢?
要想回答這個(gè)問題,就涉及網(wǎng)絡(luò)地址轉(zhuǎn)換協(xié)議(NAT 協(xié)議)
3.1 | 內(nèi)部網(wǎng)絡(luò)與外部網(wǎng)絡(luò)
對一個(gè)組織、機(jī)構(gòu)、家庭來說,我們通常把內(nèi)部網(wǎng)絡(luò)稱為局域網(wǎng),外部網(wǎng)絡(luò)就叫作外網(wǎng)。
下圖是一個(gè)公司多個(gè)部門的網(wǎng)絡(luò)架構(gòu)。

可以看到外網(wǎng)通過路由器接入整個(gè)公司的局域網(wǎng),和路由器關(guān)聯(lián)的是三臺交換機(jī),代表公司的三個(gè)部門。交換機(jī),或者稱為鏈路層交換機(jī),通常工作在鏈路層;而路由器通常也具有交換機(jī)的能力,工作在網(wǎng)絡(luò)層和鏈路層。
光纖是一種透明的導(dǎo)光介質(zhì),多束光可以在一個(gè)介質(zhì)中并行傳播,不僅信號容量大,重量輕,并行度高而且傳播距離遠(yuǎn)。當(dāng)然,光纖不能彎曲,因此辦公室里用來連接交換機(jī)和個(gè)人電腦的線路肯定不能是光纖,光線通常都用于主干網(wǎng)絡(luò)。
3.2 | 局域網(wǎng)數(shù)據(jù)交換(MAC地址)
同一個(gè)局域網(wǎng)中的設(shè)備如何交換消息?
首先明確一個(gè)概念,設(shè)備間通信的本質(zhì)其實(shí)是設(shè)備擁有的網(wǎng)絡(luò)接口(網(wǎng)卡)間的通信。為了區(qū)別每個(gè)網(wǎng)絡(luò)接口,互聯(lián)網(wǎng)工程任務(wù)組(IETF)要求每個(gè)設(shè)備擁有一個(gè)唯一的編號,這個(gè)就是 MAC 地址。
IP 地址不也是唯一的嗎?其實(shí)不然,一旦設(shè)備更換位置,比如你把你的電腦從北京郵寄的廣州,那么 IP 地址就變了,而電腦網(wǎng)卡的 MAC 地址不會(huì)發(fā)生變化??偟膩碚f,IP 地址更像現(xiàn)實(shí)生活中的地址,而 MAC 地址更像你的身份證號
再明確另一個(gè)基本的概念。在一個(gè)局域網(wǎng)中,我們不可以將消息從一個(gè)接口(網(wǎng)卡)發(fā)送到另一個(gè)接口(網(wǎng)卡),而是要通過交換機(jī)。因?yàn)閮蓚€(gè)網(wǎng)卡間沒有線,所以數(shù)據(jù)交換,必須經(jīng)過交換機(jī),畢竟線路都是由網(wǎng)卡連接交換機(jī)的。

總結(jié)下,數(shù)據(jù)的發(fā)送方,將自己的 MAC 地址、目的地 MAC 地址,以及數(shù)據(jù)作為一個(gè)分組(Packet),也稱作 Frame 或者封包,發(fā)送給交換機(jī)。交換機(jī)再根據(jù)目的地 MAC 地址,將數(shù)據(jù)轉(zhuǎn)發(fā)到目的地的網(wǎng)絡(luò)接口(網(wǎng)卡)。
這個(gè)分組或者 Frame,是鏈路層的數(shù)據(jù)交換,它支持 IP 協(xié)議工作,是網(wǎng)絡(luò)層的底層。所以,如果 IP 協(xié)議要傳輸數(shù)據(jù),就要將數(shù)據(jù)轉(zhuǎn)換成為鏈路層的分組,然后才可以在鏈路層傳輸。
鏈路層分組大小受限于鏈路層的網(wǎng)絡(luò)設(shè)備、線路以及使用了鏈路層協(xié)議的設(shè)計(jì)。你有時(shí)候可能會(huì)看到 MTU 這個(gè)縮寫詞,它指的是 Maximun Transmission Unit,最大傳輸單元,意思是鏈路層網(wǎng)絡(luò)允許的最大傳輸數(shù)據(jù)分組的大小。因此 IP 協(xié)議要根據(jù) MTU 拆分封包。
MSS(Maximun Segment Size,最大段大?。┦?TCP 段,或者稱為 TCP 分組(TCP Packet)的最大大小。MSS 是傳輸層概念,MTU 是鏈路層概念。
3.3 | 地址解析協(xié)議(ARP)
鏈路層通過 MAC 地址定位網(wǎng)絡(luò)接口(網(wǎng)卡)。在一個(gè)網(wǎng)絡(luò)接口向另一個(gè)網(wǎng)絡(luò)接口發(fā)送數(shù)據(jù)的時(shí)候,至少要提供這樣 3 個(gè)字段:
- 源 MAC 地址
- 目標(biāo) MAC 地址
- 數(shù)據(jù)
對于一個(gè)網(wǎng)絡(luò)接口,它如何能知道目標(biāo)接口的 MAC 地址呢?
在使用傳輸層協(xié)議的時(shí)候,清楚地知道目的地的 IP 地址,但是我們不知道 MAC 地址。這個(gè)時(shí)候,就需要一個(gè)中間服務(wù)幫助根據(jù) IP 地址找到 MAC 地址——這就是地址解析協(xié)議(Address Resolution Protocol,ARP)。
整個(gè)工作過程和 DNS 非常類似,如果一個(gè)網(wǎng)絡(luò)接口已經(jīng)知道目標(biāo) IP 地址對應(yīng)的 MAC 地址了,它會(huì)將數(shù)據(jù)直接發(fā)送給交換機(jī),交換機(jī)將數(shù)據(jù)轉(zhuǎn)發(fā)給目的地。
如果網(wǎng)絡(luò)接口不知道目的地地址,地址解析協(xié)議就開始工作了。發(fā)送接口會(huì)發(fā)送一個(gè)廣播查詢給到交換機(jī),交換機(jī)將查詢轉(zhuǎn)發(fā)給所有接口。

如果某個(gè)接口發(fā)現(xiàn)自己就是對方要查詢的接口,則會(huì)將自己的 MAC 地址回傳。接下來,會(huì)在交換機(jī)和發(fā)送接口的 ARP 表中,增加一個(gè)緩存條目。也就是說,接下來發(fā)送接口再次向 IP 地址 2.2.2.2 發(fā)送數(shù)據(jù)時(shí),不需要再廣播一次查詢了。

前面提到這個(gè)過程和 DNS 非常相似,采用的是逐級緩存的設(shè)計(jì)減少 ARP 請求。發(fā)送接口先查詢本地的 ARP 表,如果本地沒有數(shù)據(jù),然后廣播 ARP 查詢。這個(gè)時(shí)候如果交換機(jī)中有數(shù)據(jù),那么查詢交換機(jī)的 ARP 表;如果交換機(jī)中沒有數(shù)據(jù),才去廣播消息給其他接口。注意,ARP 表是一種緩存,也要考慮緩存的設(shè)計(jì)。通常緩存的設(shè)計(jì)要考慮緩存的失效時(shí)間、更新策略、數(shù)據(jù)結(jié)構(gòu)等。
比如可以考慮用 TTL(Time To Live)的設(shè)計(jì),為每個(gè)緩存條目增加一個(gè)失效時(shí)間。另外,更新策略可以考慮利用老化(Aging)算法模擬 LRU。
路由器和交換機(jī)的異同點(diǎn)。
家用無線路由器通常也會(huì)提供局域網(wǎng),具備交換機(jī)的能力。同時(shí),這種設(shè)備又具有路由器的能力。
總的來說,家用的路由器,也具備交換機(jī)的功能。但是當(dāng) ARP 表很大的時(shí)候,就需要專門的、能夠承載大量網(wǎng)絡(luò)接口的交換設(shè)備。就好比,如果用數(shù)組實(shí)現(xiàn) ARP 表,數(shù)據(jù)量小的時(shí)候,遍歷即可;但如果數(shù)據(jù)量大的話,就需要設(shè)計(jì)更高效的查詢結(jié)構(gòu)和設(shè)計(jì)緩存。
3.4 | 連接內(nèi)網(wǎng)
有時(shí)候,公司內(nèi)部有多個(gè)子網(wǎng)。這個(gè)時(shí)候一個(gè)子網(wǎng)如果要訪問另一個(gè)子網(wǎng),就需要通過路由器。

圖中的路由器,其實(shí)充當(dāng)了兩個(gè)子網(wǎng)通信的橋梁。在上述過程中,發(fā)送接口不能直接通過 MAC 地址發(fā)送數(shù)據(jù)到接收接口,因?yàn)樽泳W(wǎng) 1 的交換機(jī)不知道子網(wǎng) 2 的接口。這個(gè)時(shí)候,發(fā)送接口需要通過 IP 協(xié)議,將數(shù)據(jù)發(fā)送到路由器,再由路由器轉(zhuǎn)發(fā)信息到子網(wǎng) 2 的交換機(jī)。
子網(wǎng) 2 的交換機(jī)如何根據(jù) IP 地址找到接收接口呢?答案是通過查詢 ARP 表。
3.5 | 連接外網(wǎng)(網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù),NAT)
最后討論下連接外網(wǎng)的問題
IPv4 協(xié)議因?yàn)榇嬖诰W(wǎng)絡(luò)地址耗盡的問題,不能為一個(gè)公司提供足夠的地址,因此內(nèi)網(wǎng) IP 可能會(huì)和外網(wǎng)重復(fù)。比如內(nèi)網(wǎng) IP 地址192.168.0.1發(fā)送信息給22.22.22.22,這個(gè)時(shí)候,其實(shí)是跨著網(wǎng)絡(luò)的。

跨網(wǎng)絡(luò)必然會(huì)通過多次路由,最終將消息轉(zhuǎn)發(fā)到目的地。但是這里存在一個(gè)問題,尋找的目標(biāo) IP 地址22.22.22.22是一個(gè)公網(wǎng) IP,可以通過正常的尋址 + 路由算法定位。當(dāng)22.22.22.22尋找192.168.0.1的時(shí)候,是尋找一個(gè)私網(wǎng) IP,這個(gè)時(shí)候是找不到的。解決方案就是網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)(Network Address Translation)。

NAT 技術(shù)轉(zhuǎn)換的是 IP 地址,私有 IP 通過 NAT 轉(zhuǎn)換為公網(wǎng) IP 發(fā)送到服務(wù)器。服務(wù)器的響應(yīng),通過 NAT 轉(zhuǎn)換為私有 IP,返回給客戶端。通過這種方式,就解決了內(nèi)網(wǎng)和外網(wǎng)的通信問題。
3.6 | 總結(jié)
鏈路層發(fā)送數(shù)據(jù)靠的是 MAC 地址,MAC 地址就好像人的身份證一樣。局域網(wǎng)中,數(shù)據(jù)不可能從一個(gè)終端直達(dá)另一個(gè)終端,而是必須經(jīng)過交換機(jī)交換。交換機(jī)也叫作鏈路層交換機(jī),它的工作就是不斷接收數(shù)據(jù),然后轉(zhuǎn)發(fā)數(shù)據(jù)。通常意義上,交換機(jī)不具有路由功能,路由器往往具有交換功能。但是往往路由器交換的效率,不如交換機(jī)。已知 IP 地址,找到 MAC 地址的協(xié)議,叫作地址解析協(xié)議(ARP)。
網(wǎng)絡(luò)和網(wǎng)絡(luò)的銜接,必須有路由器(或者等價(jià)的設(shè)備)。一個(gè)網(wǎng)絡(luò)的設(shè)備不能直接發(fā)送鏈路層分組給另一個(gè)網(wǎng)絡(luò)的設(shè)備,而是需要通過 IP 協(xié)議讓路由器轉(zhuǎn)發(fā)。
最后,網(wǎng)絡(luò)地址轉(zhuǎn)換協(xié)議是如何工作的?
【解析】網(wǎng)絡(luò)地址解析協(xié)議(NAT)解決的是內(nèi)外網(wǎng)通信的問題。NAT 通常發(fā)生在內(nèi)網(wǎng)和外網(wǎng)銜接的路由器中,由路由器中的 NAT 模塊提供網(wǎng)絡(luò)地址轉(zhuǎn)換能力。從設(shè)計(jì)上看,NAT 最核心的能力,就是能夠?qū)?nèi)網(wǎng)中某個(gè) IP 地址映射到外網(wǎng) IP,然后再把數(shù)據(jù)發(fā)送給外網(wǎng)的服務(wù)器。當(dāng)服務(wù)器返回?cái)?shù)據(jù)的時(shí)候,NAT 又能夠準(zhǔn)確地判斷外網(wǎng)服務(wù)器的數(shù)據(jù)返回給哪個(gè)內(nèi)網(wǎng) IP。
NAT 是如何做到這點(diǎn)的呢?
- NAT 需要作為一個(gè)中間層替換 IP 地址。 發(fā)送的時(shí)候,NAT 替換源 IP 地址(也就是將內(nèi)網(wǎng) IP 替換為出口 IP);接收的時(shí)候,NAT 替換目標(biāo) IP 地址(也就是將出口 IP 替換回內(nèi)網(wǎng) IP 地址)。
- NAT 需要緩存內(nèi)網(wǎng) IP 地址和出口 IP 地址 + 端口的對應(yīng)關(guān)系。也就是說,發(fā)送的時(shí)候,NAT 要為每個(gè)替換的內(nèi)網(wǎng) IP 地址分配不同的端口,確保出口 IP 地址+ 端口的唯一性,這樣當(dāng)服務(wù)器返回?cái)?shù)據(jù)的時(shí)候,就可以根據(jù)出口 IP 地址 + 端口找到內(nèi)網(wǎng) IP。