戲說網絡(一)

最近工作中需要使用 LVS 負載均衡,而運維告知後端主機所在網段不匹配,可能無法申請。抱著好奇的心理,就去研究了下 LVS。然而網上的文章要麼過於粗略,要麼還是有一些細節讓我百思不得其解。尤為讓我疑惑的就是網絡數據包的處理與分發。於是重溫了有關 NAT、交換機、網關、路由等一系列相關網絡概念,查閱各路大 V 的文章。最後在一個評論中不經意看到一本好書:《網絡是怎樣連接的》,完美地把目標從 LVS 轉為了計算機網絡。

這本書講述的內容,其實跟我以前面試時很喜歡問的一個題目很類似:當你在瀏覽器裡輸入一個 URL 會發生什麼。這個問題我只用過一段時間,後來就擱置了。當然了,這裡主要考驗的方面在於服務端以及前端的處理邏輯,跟底層網絡的關係倒並不深究。而這本書則著重講解了網絡底層的處理流程,包括各種網絡協議、網絡設備、信號處理、操作系統 IO 處理等。推薦大家去讀一下,能讓你對網絡有一個更形象化的認識,讓你的認識更有層次邏輯。我也打算就本書做一些讀書筆記,濃縮一下書中內容(畢竟 300 多頁的書),以一個門外漢(Layman)的視角講述下這裡面的內容。

緣起

網絡的目的,就是為了連接。最開始的需求可能是兩個人的計算機要連接,互相傳遞數據。那麼每個人的計算機裡就各需要有一種設備,可以用來發送和接收數據。這個設備就是網卡。用一根線把這兩張網卡連接起來,雙方就可以通過信號進行通信。這根線就叫網線。

兩個計算機的通信很簡單,A 要給 B 發送什麼數據,就構造好數據直接讓網卡發出去就行,不需要問怎麼到達,也不可能會丟。不過兩個人聊天就是會有聊完的時候,不如加一個人一起唱戲。於是第三個人的計算機就加入進來了。那怎麼連接這三個計算機呢?可以考慮讓一個計算機做中繼。像 ABC 這樣由 B 來中繼,A 要給 C 發送數據,就先發給 B,然後 B 轉給 C。所以 B 上面就得有兩張網卡。可是這還不夠,B 怎麼知道 A 發過來的數據是給自己的還是給 C 的?這裡我們就需要確定各自的標識了。這種標識我們就把它叫做地址。當 A 要給 C 發送數據時,數據裡額外增加一項地址,填 C,然後由 A 的網卡發出去。所以傳送的數據其實是由兩部分構成的,一部分是地址,一部分是真正的有效數據。地址一般放在頭部,可以更快地提取出來進行識別。B 左側的網卡(跟 A 相連的)收到後,檢查數據頭部的地址,發現是給 C 的,不是給自己的。那麼它該用哪張網卡來發呢?肯定不能用左側的網卡了,不然 C 就收不到了。所以左右兩張網卡都要有一些標記,表明自己可以通往哪裡。這就是地址表。像下面這樣:

| 地址 | 網卡 |
| ---- | -------- |
| A | 左側網卡 |
| C | 右側網卡 |


這時,B 就知道要用右側網卡轉發數據了,這樣 C 就收到了 A 發送的數據。

三個人唱戲也唱累了,想打麻將了,又拉來了 D。這個時候怎麼辦?也許我們可以繼續串行地連起來:ABCD。但是這樣鏈條有點長,A 可能就不願意跟 D 玩。還有一種方式像星狀一樣連接:

ABC
 ↕
 D


A 跟 C 和 D 之間的通信,都經過 B。這裡 B 就有了 3 張網卡。接下來可能還會有第五個、第六個人加入。B 可能就不太願意了,憑什麼在我身上插滿了網卡?那麼多數據到我這,真正給我的只有佔很少一部分,這種感覺一點也不好。大家覺得也是,的確委屈 B 了。那我們把轉發這種功能單獨抽取出來如何?

交換機

這種只做網絡數據轉發的設備,我們就把它叫做交換機。它上面有多個網卡,能夠根據地址錶轉發數據。而 A、B、C 等的網卡地址,專業術語就叫 MAC。MAC 地址由 6 個字節構成,用 16 進製表示就類似 00:00:00:00:00:00。有了 MAC 和交換機,我們就能夠讓所有接入交換機的計算機彼此進行通信。這就是我們整個網絡中的數據鏈路層,也就是常說的第二層(第一層是物理層,即數字信號或模擬信號傳輸)。第二層傳送的數據包由 MAC 頭部和數據塊構成。MAC 頭部包含發送方的 MAC 地址(來源 MAC)和接收方的 MAC 地址(目的 MAC)。

那麼在一個有交換機連接的網絡裡,各個計算機之間如何通信呢?假設有 4 臺計算機 A、B、C、D。其中 A 和 B 各有一張網卡,MAC 地址分別是 00:00:00:00:00:AA、00:00:00:00:00:BB。然後它們分別連接到交換機的網卡 1、網卡 2 上。此時交換機裡還沒有任何地址表,也不需要手動維護地址表。A 要給 B 發送數據,則要填寫 B 的 MAC 地址。A 構造數據包,來源 MAC 填寫 00:00:00:00:00:AA,目的 MAC 填寫 00:00:00:00:00:BB,通過 A 的網卡發送給交換機。交換機從與 A 連接的網卡 1 都收到一個數據包,解析來源 MAC 地址,此時就把 MaC 地址 A 與 網卡 1 寫入地址表。此時地址表為:

| MAC 地址 | 交換機網卡號 |
| ----------------- | ------------ |
| 00:00:00:00:00:AA | 1 |


接著解析目的 MAC 地址,得到 00:00:00:00:00:BB。但是地址表中沒有該地址的記錄,交換機不知道該從哪個網卡轉發出去數據包。於是交換機就把數據包轉發到它自己的所有網卡,除了來源網卡(即網卡 1)。這就叫廣播。這樣 B、C、D 都會收到該數據包。它們的網卡在收到數據包後,會解析出目地 MAC。其中 C、D 發現跟自己的 MAC 地址不一樣,直接丟棄(它要是不丟而是要偷窺怎麼辦?那麼沒辦法,這就是網絡安全地範疇了)。B 發現是發給它的數據包,就接收並處理了。接著 B 回覆數據給 A。跟上面的流程類似,交換機收到數據包後會往地址表裡增加新的一項:

| MAC 地址 | 交換機網卡號 |
| ----------------- | ------------ |
| 00:00:00:00:00:AA | 1 |
| 00:00:00:00:00:BB | 2 |


由於目標地址是 00:00:00:00:00:AA,在交換機地址表裡存在,此時就不需要做廣播了。

這樣一個小網絡就成型了。接下來要接入的人越來越多,數據包也越來越多。我們還想跟遙遠的別的人群進行通信。這會不會有問題呢?如果會,又會有哪些問題呢?不妨先想想,後面我們再來看看。


分享到:


相關文章: