計算機網路淺析(二)

linklate2022發表於2021-08-26

二、網路層協議

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

  1. 一個 IPv4 的網路和一個 IPv6 的網路通訊;
  2. 一個 IPv6 的網路和一個 IPv6 的網路通訊,但是中間需要經過一個 IPv4 的網路。

情況 1:IPv4 網路和 IPv6 網路通訊
例如一個 IPv6 的客戶端,想要訪問 IPv4 的伺服器

計算機網路淺析(二)
  1. 客戶端通過 DNS64 伺服器查詢 AAAA 記錄。DNS64 是國際網際網路工程任務組(IETF)提供的一種解決 IPv4 和 IPv6 相容問題的 DNS 服務。這個 DNS 查詢服務會把 IPv4 地址和 IPv6 地址同時返回。
  2. DNS64 伺服器返回含 IPv4 地址的 AAAA 記錄。
  3. 客戶端將對應的 IPv4 地址請求傳送給一個 NAT64 路由器
  4. 由這個 NAT64 路由器將 IPv6 地址轉換為 IPv4 地址,從而訪問 IPv4 網路,並收集結果。
  5. 訊息返回到客戶端。

情況 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 個欄位:

  1. 源 MAC 地址
  2. 目標 MAC 地址
  3. 資料

對於一個網路介面,它如何能知道目標介面的 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 是如何做到這點的呢?

  1. NAT 需要作為一箇中間層替換 IP 地址。 傳送的時候,NAT 替換源 IP 地址(也就是將內網 IP 替換為出口 IP);接收的時候,NAT 替換目標 IP 地址(也就是將出口 IP 替換回內網 IP 地址)。
  2. NAT 需要快取內網 IP 地址和出口 IP 地址 + 埠的對應關係。也就是說,傳送的時候,NAT 要為每個替換的內網 IP 地址分配不同的埠,確保出口 IP 地址+ 埠的唯一性,這樣當伺服器返回資料的時候,就可以根據出口 IP 地址 + 埠找到內網 IP。

相關文章