二、網絡層協議
01 | IPv4 協議:路由和尋址的區別是什么
如果說傳輸層協議,除了 TCP/UDP,我們還可以有其他選擇,比如 Google 開發的 QUIC 協議,幫助在傳輸層支持 HTTP 3.0 傳輸。但是在網絡層,IP 協議幾乎一統天下。IP 協議目前主要有兩個版本 IPv4 和 IPv6。
1.1 | 什么是IP協議
IP 協議(Internet Protocol)是一個處於壟斷地位的網絡層協議。 IPv4 就是 IP 協議的第 4 個版本,是目前互聯網的主要網絡層協議。IPv4 為傳輸層提供 Host-To-Host 的能力,IPv4 需要底層數據鏈路層的支持。

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

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

1.4.2 | 尋址過程
尋址就是如何根據 IP 地址找到設備。
因為 IPv4 的世界中,網絡是一個樹狀模型。頂層有多個平行的網絡,每個網絡有自己的網絡號。然后頂層網絡下方又有多個子網,子網下方還有子網,最后才是設備。

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

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

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



::只能出現一次,相當於省略了若干組0000。比如說1111::2222相當於中間省略了 6 組0000。為什么不能出現兩個::呢?因為如果有兩個::,就會對省略的0000的位置產生歧義。比如說1111::2222::3333,你就不知道究竟0000在1111::2222和2222::3333是怎么分布的。

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

2.3.1 | 全局單播

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

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

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

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

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

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

如果某個接口發現自己就是對方要查詢的接口,則會將自己的 MAC 地址回傳。接下來,會在交換機和發送接口的 ARP 表中,增加一個緩存條目。也就是說,接下來發送接口再次向 IP 地址 2.2.2.2 發送數據時,不需要再廣播一次查詢了。

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

圖中的路由器,其實充當了兩個子網通信的橋梁。在上述過程中,發送接口不能直接通過 MAC 地址發送數據到接收接口,因為子網 1 的交換機不知道子網 2 的接口。這個時候,發送接口需要通過 IP 協議,將數據發送到路由器,再由路由器轉發信息到子網 2 的交換機。
子網 2 的交換機如何根據 IP 地址找到接收接口呢?答案是通過查詢 ARP 表。
3.5 | 連接外網(網絡地址轉換技術,NAT)
最后討論下連接外網的問題
IPv4 協議因為存在網絡地址耗盡的問題,不能為一個公司提供足夠的地址,因此內網 IP 可能會和外網重復。比如內網 IP 地址192.168.0.1發送信息給22.22.22.22,這個時候,其實是跨着網絡的。

跨網絡必然會通過多次路由,最終將消息轉發到目的地。但是這里存在一個問題,尋找的目標 IP 地址22.22.22.22
是一個公網 IP,可以通過正常的尋址 + 路由算法定位。當22.22.22.22
尋找192.168.0.1
的時候,是尋找一個私網 IP,這個時候是找不到的。解決方案就是網絡地址轉換技術(Network Address Translation)。

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