網絡原來是這樣連接的

前言

今天我們來深度剖析一個老生常談的話題「請說出在淘寶網輸入一個商品到最終展示的完整路徑」,這題很難,涉及到網絡的工作機制,硬件上需要對交換機,路由器,網卡的工作機制有所瞭解,軟件上則涉及到 TCP,LVS 的工作原理,網上對這些內容的講解有不少錯誤而且講得不夠細,很多知識點一筆帶過,本文將會用大量的圖解對網絡中軟硬件的工作機制做詳細介紹,相信大家看了肯定有收穫,肝文不易,大家來個推薦支持呀

友情提示:下篇再講 LVS 工作原理,看完這篇再看 LVS 會容易很多

接下來我們會深度剖析下圖中 A 與 B 的通信流程,坐穩了,發車!

借用生活場景來理解網絡中的一些概念

很多技術術語我們可能理解得很費勁,但是往往引入生活學習場景會一目瞭然,很多技術的設計思路就取自生活中的點點滴滴,接下來我們就以學校的場景爲例來一步步理解網絡的設計思路。

學軍小學開學了,第一天一年級一班的同學都到齊了,新來的老師並不認識其中的每一個人,但是沒關係,他有一份學生名單

現在老師想認識班上叫「李四」的同學,於是他先在在班上大喊了一聲「李四」,雖然所有人都聽到了老師的聲音,但由於喊的是李四,所以其他人不作聲,只有李四回了一聲「到」

於是老師就把名單上的李四和相關人員給關聯上了,下一次想找李四的時候就可以直接找到對應的人員,不用在班上大吼一聲了,同理老師如果想找其他人,也只要大吼一聲對方應答即可,我們把這種方式稱爲廣播,之後記住了對方就可以直接一對一找人了。

那麼老師爲啥不跑到其它班級去找張三,李四呢,畢竟其他班級也可能有這兩人,注意學生名單上有個前綴是相同的

network_flow (1)
network_flow (1)

他們的前綴都是學軍小學一年級一班,所以班主任只會在「一年級一班」找人,不會傻到跑到其他班級去找人(當然你要跑到其他班級去吼或者滿世界吼都沒問題,只是無人響應,沒必要),總結一下老師如果需要知道名單上「學軍小學一年級一班李四」這位同學是誰,那麼她需要:

  1. 首先找到學軍小學一年級一班在哪
  2. 然後在一年級一班大吼一聲「李四」,其他同學雖然聽到了老師的喊聲,但由於叫的不是自己,所以都不作聲,只有李四本人迴應了一聲「到」
  3. 老師對應上了本人,於是下次就不要靠吼的方式找李四了,直接找到本人即可。

剛纔說的是同一個班級的,那如果是不同班級的學生呢?比如一年級一班的的張三需要找一年級二班的王五,該怎麼辦?首先看前綴即班級名稱是否相同

network_flow (2)
network_flow (2)

顯然不一樣,所以張三不能在班級裏吼,他應該出門,先找到王五所在班級「學軍小學一年級二班」,然後再大吼一聲「王五」,王五再回答「到」,之後再找的話由於已經記住了王五是誰,所以到達二班後直接找到王五交流即可。

到這裏我們網絡的雛形就有了,現在我們再來看下此例中的班級,學生等如何與網絡中的術語對應上,相信你會豁然開朗

  • 主機:即學生
  • 子網: 班級就對應互聯網中的子網互聯網就是由無數的子網組成的,要與計算機通信,必須先找到計算機所在子網
  • 網絡地址:「學軍小學一年級一班」即班級編號就相當於網絡地址,相當於子網的編號,主要用來判斷主機是否在同一個子網
  • 主機地址:張三,李四就相當於主機地址,相當於確定了班級後,可以分配學生了
  • IP 地址: 「學軍小學一年級一班張三」即 IP 地址,相當於計算機的編號,不難發現 IP 地址由網絡地址+主機地址組成,只不過主機中的 IP 地址由 32 位的二進制數也就是 4 個字節組成,IP地址通常用點分十進制表示成(a.b.c.d)的形式,如 192.168.1.10,
  • 子網掩碼: IP 地址雖然包含了網絡地址,比如 IP「學軍小學一年級一班李四」的網絡地址爲「學軍小學一年級一班」,但是隻有 IP 是無法知道網絡地址的,必須指定哪幾位爲網絡地址,在此例中我指定前 9(學軍小學一年級一班的長度) 個字爲網絡地址,我們可以寫成 學軍小學一年級一班李四/9,代表此 IP 的前 9 位爲 網絡地址, 在計算機中我們則用 192.168.1.10/24 這樣的形式來表示,這種用來指明一個 IP 地址的哪些位標識的是主機所在的子網的形式我們稱爲子網掩碼
  • mac 地址:「學生的容貌+身份證」就相當於計算機 mac 地址,即網卡地址,每個網卡地址在全球都是獨一無二的,mac 地址有48位,通常表示爲12個16進制數,每兩個16進制數之間用冒號分隔開,如【08:00:20:0A:8C:6D】,一旦找到子網,就可以先根據 IP 找到 mac,再根據 mac 找到對應的計算機,一般一個 mac 對應一個 IP(一位學生爲其分配一個班級學號)
  • 網關:兩名學生如果不在同一個班級(不在同一個子網),則需要出門尋找,這裏的門就相當於網關

另外這裏隱含的一個點是學生要能被叫到,必須要先入學報名然後學校根據其「容貌+身份證」(mac地址)分配到某個班級(比如學軍小學一年級一班張三,對應 IP 地址),也就是說計算機如果要能通信必須首先被分配某個子網的一個 IP,原因也不難理解,學生都不在班級裏(沒有編號),老師同學無論在哪個班級喊你都聽不到,至此可以得出網絡的基本架構如下

互聯網是由一個個子網組成的,不同子網計算機則出網關後通信
互聯網是由一個個子網組成的,不同子網計算機則出網關後通信

到此網絡的基本原理其實你已經明白了,剩下的只是一些實現上的細微差別而已,看完本文剩餘內容你會發現我們舉的這個例子與網絡的工作原理是如此驚人的相似

計算機是如何通信的

接下來我們進入正題一起來看看計算機是如何通信的

有了上述的預備知識現在再來看一下兩個計算機是如何通信的,相信你會豁然開朗,經過上一小節分析你會發現計算機要通信無非分兩種情況

  1. 同一個子網中的兩臺計算機通信(在一個班級)
  2. 不屬於同一個子網兩臺計算機的通信(不在一個班級)

1. 兩臺計算機屬於同一個子網

人與人是可以靠聲音通信,但計算機必須通過網線相連才能通信

不過計算機一般只有一個網卡接口,只能連一根網線,但一個子網裏可能有幾百臺機器,它們之間該怎麼連線呢

計算機中有一句經典名言:沒有什麼是加一層解決不了的問題,如果有那就再加一層,所以我們可以加個中間層,讓其它電腦連到這個中間層,然後讓這個中間層再轉發

IP 的誕生

在上一節中我們提到,計算機要通信必須首先被分配一個子網中的 IP,你可以爲每臺機器手動指定(靜態 IP),但手動配置確實太麻煩了,所以一般通過 DHCP 服務器來動態分配 IP 地址,比如現在 A 是剛接入此子網的計算機,它沒有 IP,所以它會發一個包含有 A 機 mac 地址的廣播包,由於是廣播包,每臺機器都能收到,但只有 DHCP 才能做出響應,DHCP 會給這臺機器發一個帶有 IP 地址的響應包

如圖示獲取 IP 的步驟如下

  1. 首先 A 發出一個 DHCP DISCOVRE 廣播包,由於它還沒有 IP,所以源地址設爲 0.0.0.0,它剛接入也不知道 DHCP IP 是啥,所以設置爲 255.255.255.255(受限的廣播地址,只會在子網中進行廣播的),所有機器都會收到,但只有 DHCP server 能響應
  2. DHCP server 會發出一個「分配的 IP」,「A 的 mac地址」等的廣播包,所有機器都能收到,收到後機器會拿到報文裏的 mac 地址和自己的比對一下,如果是會再向 DHCP 發送一個確認使用此 IP 的廣播包,DHCP 收到此包後記錄此 IP 已被使用,同時再次發出一個 DHCP ACK 確認此 IP 可用,於是 A 就有了 IP

注:爲了避免面面俱到,DHCP 流程作了一些簡化,與實際有些出入,不過不影響整體理解

就這樣每臺機器接入子網後通過 DHCP 都獲取到了自己的 IP 地址

好了,既然每臺機器都被分配了 IP, MAC 地址也知道了(網卡自帶的),那麼兩臺機器該怎麼通信呢?

我們來看下已知 D 的 IP,A 該怎麼和 D 通信,首先 A 要判斷 D 是不是在同一個子網,怎麼判斷呢,上一節我們提到過,子網掩碼,一般在組網的時候我們會指定哪幾位爲網絡地址,哪幾位爲主機地址,只要網絡地址相同就可以認爲是在同一個子網

IP 地址有 32 位,如果我們指定前 24 爲網絡地址,那麼後 8 位就是主機地址,那麼已經一個 IP 是 192.168.1.10 該怎麼算它的網絡地址呢

前 24 位爲網絡地址,則說明前 24 位需要保留,剩下的 8 位地址不保留(爲 0),那麼只需要讓此 IP 與 前 24 爲 1,後 8 位爲 0 的數字(十進制表示爲 255.255.255.0)相與即可獲取網絡地址,即爲 11000000.11000000.00000001.00000000,換算成十進制即爲 192.168.1.0

由於前 24 位是網絡號,所以 A(192.168.1.10/24)和 D(192.168.1.13/24)的網絡地址是一樣的(都是192.168.1.0),代表它們是同一個子網

ARP

既然是同一個子網那 A 要找 D 就好辦了,一開始 A 知道 D 的 IP,但還沒法和具體哪臺機器對上號,就像新開學班主任拿着學生名單卻沒法對上具體哪個學生一樣,於是 A 在子網裏發了一個廣播包大吼一聲:IP 地址爲 192.168.1.13 的機器是誰啊

由於是一個廣播包,所以 B,C,D 都收到了此廣播包,拿到包之後對比一下 IP 發現只有 D 能對上,於是 B,C 不響應,D 回覆了一句,是我,同時把自己的 IP ,mac 地址發出去,於是 A 收到了 D 的 MAC,在自己的機器中更新「192.168.1.13」對應的 Mac 地址爲 macD(d的 mac 地址),注意在此過程 A 的廣播包中包含 A 的 ip 和 mac,所以 D 收到此廣播包後也會在本地更新「192.168.1.10」對應的 Mac 地址爲 macA,我們把這個過程稱爲 ARP(Address Resolution Protocol),即根據 IP 獲取 mac 地址的一個協議。

另外在此過程中,如果中間設備是交換機,它也注意到 A 經過 1 口,交換機會記錄 1 口連着 A(用 A 的 mac 地址表示),同時當 D 響應時會把包發給 4 口,交換機也會記錄 4 口連着 D,於是經過此次 ARP, A,D,交換機中的記錄如下

交換機就是通過 ARP 不斷把機器與其所連端口記錄更新在表中

當 A 再次給 D 發送數據時就好辦了,此時數據包會帶上 A 的 IP,A 的 mac,D 的 ip 與 D 的 mac

交換機收到數據包後一看目標 mac 是 D 的 mac 地址 macD,查找了一下它的記錄表,macD 應該從端口 4 出去,於是直接把包轉發給了 D,不需要全局廣播了,從這裏也可以看出爲啥說交換機是二層的(數據鏈接層,有 mac 地址),因爲它記錄了 mac 地址和端口的關係,不涉及到 IP。

同一個子網兩臺計算機的請求大家應該明白了,接下來再來看看不在同一個子網的兩臺計算機是如何通信的。

2. 兩臺計算機不屬於同一個子網

這種情況下就像兩個不同班級的學生要通信,首先必須要出門,找到對方的班級,然後再找到本人,這個門在網絡中我們稱爲默認網關(gateway),一般由路由器來充當網關的角色,網關地址是子網的第一個主機地址,假設網絡地址爲 192.168.1.0/24,則默認網關 IP 爲 192.168.1.1,子網中的每臺主機都會有一個默認網關

現在我們再來看下 A 如何與 D 通信

  1. 首先計算下 D 是否與 A 同在同一個子網,A 所在子網爲 192.168.1.1/24,即它的網絡地址爲 192.168.1.0,子網掩碼爲 255.255.255.0,將 A 的子網掩碼與 D 的 IP 地址 192.168.2.11 相與得到 192.168.2.0,說明 A 與 D 不在同一個子網

  2. 於是 A 要把包發到網關,即 192.168.1.1,一開始 A 也不知道網關的 mac 地址,於是 A 首先發了個 ARP 包獲取網關的 mac 地址,然後將以下包發給網關

    這裏千萬要注意:目標 Mac 是網關的 mac,但目標 IP 是 D 的 IP ,並不是網關的 IP!原因也不難理解,你送個快遞只會在多箇中轉站(mac 地址)間流轉,目標地址肯定不能變

  3. 路由器收到上面這個包後會取出它的目標 IP,然後查一下路由表

    目的地址 子網掩碼 下一跳 端口
    192.168.1.1 255.255.255.0 0
    192.168.2.1 255.255.255.0 1
    192.168.2.3 255.255.255.0 2

    路由表的每一項由「目的地址」,「子網掩碼」,「下一跳」,「端口」這四項組成,目的地址和子網掩碼可以算出網絡地址,以第二項爲例,它表示的意思是所有目標 IP 的網絡地址爲 192.168.2.1 & 255.255.255.0 = 192.168.2.0 的都走端口 1

    目標 IP 會與每一項都匹配,匹配到哪一項路由器就把包從對應的端口轉發出去

    由於此時目標 IP 是 192.168.2.11, 將其與第二條的子網掩碼(255.255.255.0)相與後爲 192.168.2.0,說明與第二條匹配,於是就把包從端口 2 轉發出去了,但此時路由器也不知道 目標 IP: 192.168.2.11 的 mac 地址,於是它也用 ARP 先獲得此 IP 對應的 mac 地址,然後再將數據包的目標 mac 地址改爲 D 的 mac 地址發送出去,注意此時的源 mac 地址也要修改爲路由器端口對應的 mac

    可以看到在轉發過程中源 IP,目標 IP 不會變,而源 mac和目標 mac 地址會不斷變化

  4. 交換機再將上述的包轉發給 D 即可

至此相信你明白了路由器爲啥屬於三層設備,三層是網絡層,負責根據 IP 尋址,另外相信大家不難想到路由器的一個端口就是一個廣播域,同一臺路由器不同端口對應的網段(網絡地址)是不同的

路由器之間是怎麼通信的

上面說的是在同一個路由器不同端口對應的子網上的機器互相連通的問題,接下來我們來看看如果一個網絡有多臺路由器相連的話主機之間是怎麼通信的

如果 A 要與D 通信流程是怎樣的?首先 A 到路由器 1 的流程與之前是一樣的,現在關鍵是路由器 1 怎麼將數據包轉發給路由器 2。還是路由表,不過這次路由表與之前的有些不太一樣

目的地址 子網掩碼 下一跳 端口
192.168.2.0 255.255.255.0 192.168.10.6
192.168.3.0 255.255.255.0 0
192.168.4.0 255.255.255.0 1

我們看第一次記錄,有一個下一跳,對應路由器 2 上的端口,那麼這裏爲啥不用端口呢,主要原因是爲了避免在路由器 1 產生大量的 ARP 緩存

先來看看如果用端口會怎樣,我們之前說了一個端口代表一個廣播域,假設現在指定子網爲 192.168.2.0 的包從路由器 1 上 mac 地址爲 r2 的端口出去,那麼包在 r2 端口轉發前,需要修改一下包的目標 IP 對應的 mac 地址,此時如果不知道目標 IP 的 mac 地址會怎樣呢,發個 ARP 請求獲得目標 IP 的 mac 地址,並且保存在路由器的 ARP 緩存,如果目標 IP 的子網有很多臺主機,R2 每轉發一次都要都要發一次 ARP 請求,並且保存在本地,將會產生大量的 ARP 緩存,而如果用下一跳的 IP,則所有到 192.168.2.0 子網的請求,都只會轉發給 192.168.10.6,就意味着只存儲這個 IP 的 ARP 緩存,所以一般路由器之間的轉發使用下一跳。

最後一個問題,路由器是如何知道這些路由表的呢,通過靜態路由算法和動態路由算法,所謂靜態路由是指路由規則是人工配置的,動態路由則是通過路由器學習,分享給相鄰路由器自己的路由表信息以讓互聯網上的路由器逐步完善自己的路由表

公網,內網與 NAT

上一節討論的主機間的通信都是在子網即私網間的通信,但都還未出公網

什麼是私網和公網

私網也稱內網,也叫局域網,企業或者家庭用戶搭建的網絡爲私網,比如公司裏的很多臺計算機就組成了一個子網,它們內部之間是可以互相通信的,而且它們組成的子網地址是私有地址,不同的子網私有地址是可以相同的,但如果你要訪問 Google 那就要出這個子網,到公網上去找,公網纔是我們所說的廣義上的的互聯網。

在公網上每個設備的 IP 都是全球唯一,這個其實很好理解,比如杭州有個學軍小學,可能北京也有個學軍小學,如果兩個學軍小學的學生需要互相通信肯定要填上對方的地址,總不能都填學軍小學吧,快遞員可不知道到底是哪個學軍小學,所以需要給每個學軍小學指定一個全球唯一的地址,比如浙江省杭州市西湖區學軍小學,這樣快遞員就知道應該把信送到這個地址了。

也就是說私網中的主機如果想要訪問公網,必須將私網中的 IP 轉爲公網上的 IP,我們把這個過程稱爲 NAT(Network Address Translation,網絡地址轉換)

network_architect (5)
network_architect (5)

相信細心的你一定發現了一個問題,子網中的地址通過 NAT 轉成公網請求後,它的響應包該怎麼找到請求的主機呢,也就是是私網 IP 與公網 IP 應該要有個映射關係,比較常用的是端口映射。我們前面只提到了 IP,mac,實際上還有一個端口(port)沒提,一個 TCP 連接是需要知道請求方與被請求方的 iP,port的,簡稱 TCP 的四元組

TCP 四元組
TCP 四元組

也就是說請求包中除了有 IP 地址,實際上還有端口

NAT 爲了節省 IP 資源,往往採用端口映射的方式

這樣的話,請求除了公網地址變了,端口地址也變了,但請求回來的時候也會把公網的 IP 和端口轉成內網的 IP+端口,也就解決了響應包找不到主機的問題

總結

看完這篇相信大家應該明白互聯網中的兩臺主機到底是如何通信的了,另外網上有不少人困惑「有了 IP 爲啥要有 mac,或者有了 mac 爲何還要有 IP」,看完這篇我們不難作答: IP 起到遠程定位子網,減少網絡風暴的作用,定位子網後,則廣播(ARP 請求)對網絡的影響會小的多, ARP 拿到 mac 後在子網內即可找到對應的機器,兩者缺一不可,這就好比在學校裏找人,你要先找到學生對應的班級,再找到這名學生一樣。

代入生活場景來思考技術的實際原理,往往會達到事半功倍的效果

另外相信你也不難明白爲啥說交換機工作在二層,路由器工作在三層了

二層即數據鏈路層,mac 地址用於識別數據鏈路中互連的節點,而交換機會取出 mac 地址進行比對後再決定從哪個口轉發出去

三層即網絡層,對應 IP 尋址,路由器會取出 IP 頭來決定從哪個口轉發出去

更多精品文章,歡迎大家掃碼關注「碼海」

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章