計(jì)算機(jī)網(wǎng)絡(luò)淺析

網(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 種情況討論:

  1. 一個(gè) IPv4 的網(wǎng)絡(luò)和一個(gè) IPv6 的網(wǎng)絡(luò)通信;
  2. 一個(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ù)器

  1. 客戶端通過 DNS64 服務(wù)器查詢 AAAA 記錄。DNS64 是國際互聯(lián)網(wǎng)工程任務(wù)組(IETF)提供的一種解決 IPv4 和 IPv6 兼容問題的 DNS 服務(wù)。這個(gè) DNS 查詢服務(wù)會(huì)把 IPv4 地址和 IPv6 地址同時(shí)返回。
  2. DNS64 服務(wù)器返回含 IPv4 地址的 AAAA 記錄。
  3. 客戶端將對應(yīng)的 IPv4 地址請求發(fā)送給一個(gè) NAT64 路由器
  4. 由這個(gè) NAT64 路由器將 IPv6 地址轉(zhuǎn)換為 IPv4 地址,從而訪問 IPv4 網(wǎng)絡(luò),并收集結(jié)果。
  5. 消息返回到客戶端。

情況 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è)字段:

  1. 源 MAC 地址
  2. 目標(biāo) MAC 地址
  3. 數(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)的呢?

  1. NAT 需要作為一個(gè)中間層替換 IP 地址。 發(fā)送的時(shí)候,NAT 替換源 IP 地址(也就是將內(nèi)網(wǎng) IP 替換為出口 IP);接收的時(shí)候,NAT 替換目標(biāo) IP 地址(也就是將出口 IP 替換回內(nèi)網(wǎng) IP 地址)。
  2. 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。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容