從 0-1 聊聊網路的演進

付威的网络博客發表於2024-03-30

在上文中,我們講述了訪問網站的原理,即當我們解析到域名的IP地址時,需要與伺服器建立連線。那麼我們是如何根據 IP 找到這個伺服器呢?

為了更好地解釋這個問題,我們先從最簡單的問題分析,將需要通訊的裝置簡化為兩臺,只需用網線連線它們,這樣就形成了最簡單的網路。如下圖所示:

裝置A 和 裝置B 進行了連線,他們就可以通訊了。但是,如果現在我再加入一個裝置C,整體的結構就變成了如下所示:

當裝置A想要向裝置B傳送訊息時,由於不知道目標埠,所以只能將訊息傳送到每個網口。這意味著裝置C也會收到裝置A的訊息。那麼裝置C如何確定這個訊息是否是針對自己的呢?這個問題暫時先不討論,我們將在後面討論。

第一層-物理層

透過上述分析,如果有三臺裝置,就需要每臺裝置連線兩根網線,並且每個裝置需要有兩個網口(以此類推)。隨著裝置數量的增加,每個裝置上的插口也會增多,這顯然是不合適的。那麼該如何解決呢?

解決方法有兩種:

  1. 採用匯流排模式,如下圖所示:

透過上圖,我們可以使用一個匯流排將各個裝置串聯起來,這樣每個裝置就可以進行通訊了。但是匯流排模式存在兩個主要問題:

      1. 網路整體可靠性依賴於匯流排,匯流排故障會導致整個網路癱瘓。
      2. 裝置之間的訊息傳送必須經過匯流排,導致衝突非常高。

因此,匯流排模式逐漸被淘汰。

  1. 新增一個特殊的裝置進行轉發,將請求轉發到指定埠。

從上面的圖上可以看出,我們加了一個特殊的裝置,這個裝置負責把收到的資料進行無腦的複製和傳送到其他裝置。 這樣裝置A就能和其他裝置通訊了,這個裝置的名字就是 集線器 其主要功能是對接收到的訊號進行再生整形放大,以擴大網路的傳輸距離。

在這個過程中,裝置A傳送訊息1,經過集線器後,每個出口都會複製傳送一份。

由於集線器沒有任何邏輯,因此屬於物理層。由於集線器將訊息轉發給每個裝置,因此我們不知道訊息傳送給誰,只能在裝置收到後自行判斷。那麼回到最初的問題,裝置如何判斷這個訊息是否是針對自己的呢?這時我們需要在訊息上加上一個特殊的裝置ID,即MAC地址。

因此,我們的報文需要進行包裝,增加傳送方和接收方的MAC地址。整體的訊息報文如下所示:

這時,當裝置收到訊息後,就可以拿到訊息的目標MAC地址和自己的地址進行對比,如果不符合就直接丟棄。

第二層-資料鏈路層

當採用集線器的解決問題的時候,可能大家都感覺到問題了,主要問題有兩個:

  1. 每次傳送訊息,都需要其他裝置判斷,帶來整個裝置群的裝置效能降低
  2. 訊息量複製n份,大大的浪費了資源。

隨著裝置的增多,集線器已經無法滿足需求。我們需要更智慧的裝置,能夠根據指定的MAC地址傳送訊息,這就是交換機。那麼交換機是如何工作的呢?

在交換機的內部,維護著一個MAC地址對應埠號的地址表。收到訊息後,交換機會根據MAC地址查詢指定的埠,然後轉發訊息到該埠。

當然,在初始階段,MAC地址表是空的。那麼如何建立這個表呢?

當裝置A傳送訊息給裝置B時,交換機查詢目標的MAC地址,發現沒有查詢到埠,因此會向每個埠都傳送訊息(盲目泛洪)。當所有裝置收到訊息後,都會向交換機傳送反饋,只有B的反饋是正確的。因此,交換機就會在表中增加一條記錄。

bb-bb-bb-bb-bb-bb 2

這樣,下次再傳送指定訊息時,交換機就能直接找到相應的埠。到這裡,我們已經建立了一個小型網路。

如果隨著裝置數量的增多,需要增加交換機的數量,那麼如何在多個交換機之間建立路由表呢?

如下圖:如果裝置A想要傳送訊息給裝置E,需要怎樣進行轉發呢?

對於這個問題,我們的處理方式是將交換機B中的裝置都放到交換機A的MAC地址表中。具體表內容如下:

MAC地址
aa-aa-aa-aa-aa-aa 1
bb-bb-bb-bb-bb-bb 2
cc-cc-cc-cc-cc-cc 3
ee-ee-ee-ee-ee-ee 4
ff-ff-ff-ff-ff-ff 4

這樣,無論交換機B中有多少裝置,交換機A都會將訊息從4埠轉發給交換機B,然後交換機B根據自己的地址表將訊息轉發到指定埠。

第三層-網路層

儘管交換機似乎解決了資料傳輸的問題,甚至還能夠支援水平擴充套件,但隨著裝置數量的增加,MAC地址表會變得越來越龐大,特別是第一個交換機的MAC地址表。隨著MAC表的增長,效能會逐漸降低。那麼如何解決這個問題呢?

透過前面的分析,MAC地址表的增長主要是交換機的水平擴容後,需要把下一級的裝置mac對映關係都放到第一級的交換機的地址表中,那如果有個裝置,有單獨的 MAC,我直接交給這個裝置,由他在進行再分配,那這個問題就可以迎刃而解了,這個裝置就是路由器,具體關係如下圖:

透過上述分析,我們引入了路由器來解決交換機A中MAC地址表過大的問題。但是,新問題又出現了。MAC地址表如何配置才能夠將資料經過路由器傳送到裝置E呢?為了弄清楚這個情況,我們需要梳理面臨的問題。

  1. 首先需要知道,裝置E和裝置A不在同一個交換機叢集內,因此需要路由器進行轉發。(目前可以透過查詢交換機表來解決)
  2. 如果交換機A接入多個路由器,需要知道轉發到哪個路由器。(這個問題目前無法解決)
  3. 當轉發給路由器時,路由器需要知道裝置E在交換機B的叢集內。(這個問題目前也無法處理)

為了解決以上問題,我們需要對訊息體進行擴充套件,引入一個新的網路標識:IP地址。IP地址由4個8位整陣列成:

11111111.11111111.11111111.11111111 對應的地址是:255.255.255.255

同樣,我們的報文也需要加上源IP和目標IP。

那IP是如何解決上述的問題的呢?

在網路的最開始建立的時候,對每一個裝置分配一個IP地址,這個地址屬於軟體層面,可以變動,這樣也帶來了整個網路叢集的靈活性。

接下來,讓我們逐個解決上述問題。

如何判斷裝置A和裝置E不在同一個 交換機 叢集內呢?

直觀地看,192.168.0.100和192.168.1.100不在同一個網段上。那麼計算機如何判斷呢?

需要再引入兩個概念:預設閘道器和子網掩碼。這裡先解釋這兩個概念及其作用:

  1. 預設 閘道器存在於每個裝置上,通常是網路配置的一部分。當我們需要上網時,資料會首先傳送到預設閘道器,通常情況下預設閘道器的地址就是我們家庭中的路由器地址(雖然不完全一致)。
  2. 子網掩碼用於確定子網劃分的範圍。簡單來說,IP地址由四個8位數字組成(實際上是32位),從後往前看,後面有幾位0表示後續的IP可以分配,例如:
    1. 對於子網掩碼255.255.255.0,對應網段為192.168.0.[0-255],可以分配256-2個IP地址(其中兩個地址被保留為網路地址和廣播地址)。
    2. 對於子網掩碼255.255.0.0,對應網段為192.168.[0-255].[0-255],可以分配256×256-2個IP地址。

(這裡減去2是因為其中兩個地址被保留為網路地址和廣播地址)

留給讀者一個問題:為什麼這裡的IP以192.168.0.xxx開頭?

計算機透過和子網掩碼進行與運算來判斷。如果結果一致,則說明兩者在同一個網段。舉個例子:

裝置A: 192.168.0.100 & 255.255.255.0 = 192.168.0.0
裝置B: 192.168.0.100 & 255.255.255.0 = 192.168.0.0
裝置C: 192.168.1.100 & 255.255.255.0 = 192.168.1.0
所以在 預設閘道器是255.255.255.0的情況下:A和B 是一個網段,C不是。

因此,在預設閘道器是255.255.255.0的情況下,裝置A和裝置B在同一個網段,而裝置C不在。我們在原來的基礎上再加上子網掩碼和預設閘道器:

同時為了表達方便,我們給路由器的 mac 地址為 ll-00-00-00-00-00,增加上閘道器和子網掩碼,整個拓撲圖如下:

由於A和B處於同一網段,它們可以直接通訊。但是,A和E不在同一網段,因此不能直接互相通訊。只能將資料傳送給預設閘道器192.168.0.1(大多數情況下,預設閘道器的地址就是路由器的地址)。此時,路由器可以根據自己的路由表決定轉發地址。

路由地址 子網掩碼 下一跳
192.168.0.1~192.168.0.254 255.255.255.0 埠0直連
192.168.1.1~192.168.1.254 255.255.255.0 埠1直連

192.168.0.1~192.168.0.255 為了更簡單表達這個方式,我們可以採用一種新的方式來表示:

192.168.0.0/24
 其中 24代表前前3個8位整數都是1 即:
 11111111.11111111.11111111.00000000
 255.255.255.0 
 即 192.168.0.0/24 可以代表 192.168.0.1~192.168.0.254
路由地址 子網掩碼
192.168.0.0/24 255.255.255.0 埠0直連
192.168.1.0/24 255.255.255.0 埠1直連

網路層 的路由

當路由器收到請求後,會將請求轉發到埠1,即交換機B,此時交換機就獲得了資訊。

當交換機獲得IP後,需要知道IP對應的MAC地址。這時該怎麼辦呢?

這就需要了解ARP(地址解析協議)和ARP快取(ARP快取的建立,此處先不展開)。格式如下:

IP 地址 MAC 地址
192.168.1.100 ee-ee-ee-ee-ee-ee

當拿到mac地址後就可以成功把資料轉發了

先做一個總結

到這裡瞭解了網路資訊的流轉的每一個步驟,我們先做一個總結,把報文的流程先梳理下:

第四層-運輸層

到目前為止,我們已經大致瞭解了網路基本通訊的原理,解決了網路連通的問題。接下來我們再繼續探索。

在整個的網路流程中,歸根到底是兩個程式間的通訊,我們可以思考一個問題,當我們收到資料時,如何知道這個資料是發給哪個程式的呢?

舉例來說,當我們在上網的同時又在聊天,如何確保資料精準地分配給瀏覽器或 QQ 呢?

不同裝置使用不是統一的作業系統,不同的作業系統(如 Windows、Linux、Mac OS)又使用不同格式的程序識別符號。每個程序都需要傳送資料,那麼如何去隔離它們呢?

所以在運輸層需要提供一個統一的標準來區分不同的程序,在 TCP/IP 運輸層使用埠號來區分應用層的不同應用程序。

下圖是我們常用埠

有了埠號,就可以區分不同程序對應的資料了。

第五層-應用層

總結前面的流程,我們似乎解決了網路傳輸中的所有問題了,採用路由器隔離網路,採用埠的區分了不同應用的資料等,那應用層又是用來解決什麼問題呢?

應用層的作用,可以簡單的理解成解決資料是什麼的問題,比如:

我開啟了一網頁,服務端知道我訪問了 80 埠,但是服務端不知道我訪問的是哪個網頁,這個時候就需要把網頁路徑傳遞過去。

那傳遞過去需要按什麼格式呢?編碼是什麼?型別是啥等等,這些問題都是我們常見 HTTP 協議相關的內容。

所以應用層是和使用者最直接接觸和使用的層級,它負責提供各種協議的解析和渲染。

常見的協議有:

HTTP(超文字傳輸協議): 用於在客戶端和伺服器之間傳輸超文字(如網頁),是全球資訊網的基礎協議。
HTTPS(安全超文字傳輸協議): 在HTTP的基礎上新增了安全性支援,使用SSL/TLS協議對通訊進行加密和身份驗證。
FTP(檔案傳輸協議): 用於在客戶端和伺服器之間傳輸檔案,支援檔案的上傳、下載和管理。
SMTP(簡單郵件傳輸協議): 用於在郵件伺服器之間傳輸電子郵件。
POP3(郵局協議版本3): 用於從郵件伺服器上下載電子郵件到本地客戶端。
IMAP(網際網路訊息訪問協議): 用於遠端管理和檢索電子郵件,支援在客戶端和郵件伺服器之間保持郵件狀態同步。
DNS(域名系統): 用於將域名解析為對應的IP地址,以便在網際網路上定位網路資源。
DHCP(動態主機配置協議): 用於自動分配IP地址、子網掩碼、閘道器等網路配置資訊給主機。
Telnet(遠端終端協議): 用於遠端登入到計算機系統,並在遠端主機上執行命令和操作。
SSH(安全外殼協議): 在Telnet的基礎上提供了加密和身份驗證的安全遠端登入方式。
SNMP(簡單網路管理協議): 用於網路裝置之間進行管理和監控,獲取裝置狀態資訊和執行管理操作。
NTP(網路時間協議): 用於同步網路中各個裝置的時間,以確保時間的準確性和一致性。

總結:

這篇文章是從網路的五層模型,來探索網路的演進,我們從最簡單的場景瞭解了網路演化的過程,並瞭解了每一個層的作用和對應的代表性的裝置,最後在瞭解到最貼近我們日常使用的運輸層和應用的作用和表現形式。

透過上面的總結,我們可以把整個的資料流程繪製如下:

相關文章