[計算機網路] - 從英雄聯盟,看資料包何去何從?

一支彩筆發表於2018-08-27

寫在前面

我們總是在說TCP/IP協議。HTTP頭怎麼怎麼樣;TCP頭怎麼怎麼樣;IP頭怎麼怎麼樣;MAC頭怎麼怎麼樣。不過話又說回來,計算機網路的問題,大多都是問這些。深入瞭解這部分內容,的確是最優解。

不過作為德智體美勞全面發展的新時程式碼農,多瞭解一點,多學習一點。總歸是沒錯的。(不就是多掉幾根頭髮,怕啥!大不了用霸王)

今天,我們就來從英雄聯盟入手,聊一聊資料包是怎麼從我方水晶(我的計算機)到敵方水晶(目標計算機)的。

當然,如果不想看這些莫名其妙內容的小夥伴,可以直接拉到文章末尾看總結~

開搞

準備工作

首先來說,一般情況下,從應用層到鏈路層,我們逐層包裝了HTTP協議的內容,TCP協議的內容,IP協議的內容。此時到了鏈路層,準備封裝mac地址。

那麼這個時候我們需要通過ARP協議得到目標IP的mac地址。第一步,一定要判斷一下目標IP是否和自己是同一網段。

A-IP判斷:B-IP是否和自己是同一網段,使用的方式是自己的(A-IP)子網掩碼與B-IP的IP地址進行“與”(兩位同時為“1”,結果才為“1”,否則為0)運算。

如果是同一網段,那麼很舒服。直接區域網大吼一聲,這個誰知道這個X-IP地址的mac。X-IP所在的網口一看:哎呦臥槽,這不是叫我的麼?哥們,裡邊請裡邊請。

那麼這個包很順利的都進來了。那麼接下來就是我們熟悉的TCP/IP的反向解析的過程。

那如果不在同一網段呢?

讓我們先看一張圖:

進入聯盟的世界

[計算機網路] - 從英雄聯盟,看資料包何去何從?

是不是覺得走錯片場了?沒走錯、沒走錯,接下來就讓我,用這張圖,解釋資料包(英雄)將如何從我方水晶(我的計算機)到敵方水晶(目標計算機)。

假設我們是隨機英雄,遊戲載入完畢,英雄被建立出來(從應用層到網路層,層層包裝),來到了我方泉水(鏈路層)。

遊戲準備開始,呦,我們的英雄是個瑞雯。假設我們的瑞雯,出生就帶著一個目標:從上路攻入敵方水晶。

但是我們的瑞雯,只知道目標,其他啥都不知道!敵方上路怎麼走?我是新手,不知道啊。泉水商人是個戰爭販子,見多識廣,去問問他吧!

泉水商人看到瑞雯的目標,給瑞雯指了條明路:你去找我方上路高地塔。

我方上路高地塔,看到了瑞雯的目標說話了:不要慌,雖然我不知道敵方上路到水晶怎麼走,但是我知道我方上路門牙怎麼走。你從我這走,去它那準沒錯!

瑞雯拖著符文之刃,來到了我方上路門牙。我方上路門牙一看目標,瑞雯的目的是敵方水晶!我方上路門牙,輕蔑一笑:小姑娘,我勸你不要去找死。

瑞雯冷哼一聲:老孃,心悅會員666!此話一出,天也晴了,雨也停了,網路彷彿也很行了。

就這樣我們的瑞雯,左手人民幣,右手大帽子,一路殺到敵方水晶,順利完成目標。

正經的來一發

解析一些上述加粗的內容:

名詞 解釋
瑞雯 這個就不多說了,我們的資料包。
目標 也就是我們的目標IP。
泉水商人 可以理解預設閘道器,當我們的資料包的目標IP不是源IP的同一網段時,這個包將交給預設閘道器,由它去處理。至於它怎麼處理,下文我們會提及。
上路高地塔、上路門牙 他們二者可以理解為資料包在網路傳輸過程中如果跳轉的路由器。

說實話,用聯盟的例子,屬實可能有些不是很準確,不過大的框架用此還是可以解釋清楚的。接下來我們正經的來聊一聊這個過程~

其實這個過程完全可以通過一個圖解釋:

[計算機網路] - 從英雄聯盟,看資料包何去何從?

資料包離開被髮出前,需要先計算一下目標IP是否和自己是同一網段,這裡就倆種可能:是與否。 如果是同一網路,直接通過ARP協議(使用“吼”的方式,等待對方應答),得到目標所在的mac,封裝到資料包中,發過去即可。 如果不是同一網路,那麼就需要先通過ARP協議獲取到靜態閘道器的mac地址(同樣使用“吼的方式”),將包發給它,至於靜態閘道器怎麼找到目標地址,那就是靜態閘道器的事了。

停一停,聊一聊閘道器與路由器

閘道器

靜態閘道器:靜態閘道器是在作業系統啟動時,通過DHCP協議配置好的,預設閘道器的IP地址是192.168.1.1。

靜態閘道器就是閘道器,閘道器是它所屬的這個區域網對外進出的關鍵。

路由器

而路由器則負責連線多個閘道器,用於轉發資料包到某一個閘道器上,所以說路由器是管理閘道器的關鍵。

因此把閘道器比做路由器可能不是很恰當。二者並非是同一個東西:如果把整個計算機網路世界比做古代世界的話。那麼閘道器就像一個關卡,路由器則是一座城市。城池可以掌管多個關卡。關卡可以掌管多條官道。

三國志11的地圖

如果我們想從許昌到長安,那麼這條路上,虎牢關和函谷關就可以稱之為閘道器,洛陽器就是路由器。許昌和虎牢關可以看做同一個區域網。

許昌的人想從這個區域網出去,必須要從虎牢關(預設閘道器)出發,而想要到長安城,虎牢關這個閘道器知道要轉發給洛陽城才行;洛陽作為路由器,通過自身的路由表,找到了長安的所在IP,需要轉發給函谷關這個閘道器。

因此資料包就到達了函谷關所管轄的區域網之中,最終送達到了長安。

[計算機網路] - 從英雄聯盟,看資料包何去何從?

我們的網路世界由路由器連線了一個有一個區域網,而閘道器則負責自己所管轄的一畝三分地(區域網)。

繼續資料包的旅程

靜態閘道器拿到資料包,繼續根據目標IP計算該怎麼轉發這個包。比如靜態閘道器知道這個目標IP應該有路由器4是轉發。那麼它會重新封裝mac地址,將包發給路由器4。那麼這裡可能有引出來一個疑問:網路這麼大,路由器們是怎麼知道某個IP是發給誰的呢?這裡就涉及到路由表以及路由協議了。

路由表

通過這張表,路由器知道進來的資料包該從那個網口(閘道器)出去。而這張表則是由路由協議生成的。

路由協議

路由可以分為:靜態路由和動態路由。靜態路由可以理解為我們自己去設定路由結構,從哪跳到哪,但是這個只適合於網路情況比較簡單的問題。

所以,這部分我們主要聊一聊動態路由。動態路由可以根據路由協議演算法生成動態路由表,隨網路執行狀況的變化而變...

我們的網際網路世界是一個複雜且多變的環境,如果抽象出來,可以看成一個圖的結構。那麼現在的問題對於路由演算法來說就變成了,從圖中找到目標的最短路徑。

這裡常見的有倆種:距離向量路由演算法、鏈路狀態路由演算法。

動態路由演算法 - 距離向量路由演算法:

基於 Bellman-Ford 演算法的。就是我們資料結構中。求圖的最短路徑的演算法。演算法的基本思路是,每個路由器都儲存一個路由表,每一行包含兩部分資訊,一個是要到目標路由器,從那條線出去 ,另一個是到目標路由器的距離。

因為篇幅原因,這部分內容暫時不做展開,如果有小夥伴感興趣,可以自行去了解呦。

動態路由演算法 - 鏈路狀態路由演算法

基於 Dijkstra 演算法,同樣是我們資料結構中的演算法。 每個啟動的路由器,都會先找到並計算出於自己臨近路由器的距離,然後將這個表廣播傳送給整個網路。最終每個路由器都會有整個路由結構。

因為篇幅原因,這部分內容暫時不做展開,如果有小夥伴感興趣,可以自行去了解呦。

再次繼續資料包的旅程

當我們的路由器擁有了路由表,那麼路由器就彷彿擁有了全世界,因此對於此時的計算機網路的世界來說,任何一個都路由到的IP地址,都是可以被訪問到的,無非是需要跳轉幾次個路由器而已。

當我們的資料包,每到達一個路由器時,路由器都會檢查這個包的目標IP,然後同自己的路由表內容進行配置,看一看應該傳送到那個閘道器上。

閘道器接到資料包,如果發現不是自己這個區域網的,那麼同樣它也會轉發給能夠結構的路由器,迴圈往復這個過程,直至到達目的地。

總結

一個資料離開網路卡,會有倆個出路,一個是廣播給同一個網段的某臺計算機;另一個出路是傳送給配置好的預設閘道器。而這個閘道器則會傳送對應的路由器,路由器通過自己的路由表確定下一條的閘道器。下一個閘道器,會檢視這個資料包是不是自己區域網內的IP,如果不是則傳送給能夠轉發出去的路由器。周而復始的執行這個過程。直到合適的閘道器接到資料,廣播給自己區域網內容的計算機。

尾聲

其實本篇內容,偏向於流程的梳理,因為計算機網路的世界本身就是以及極為龐大且複雜的學問,三言倆雨根本無法解釋清楚其中的複雜與智慧(說白了,就是我也不會)...因此,本文傾向於去通俗化的解釋這個流程。

如果有小夥伴感興趣,可以自行鍼對具體的內容,去學習更為專業的內容呦~

這個公眾號!

是我們在從應屆生過渡到開發這一路所踩過的坑,以及我們一步步學習的記錄,如果感興趣的朋友可以關注一下,一同加油哦~

個人公眾號:IT面試填坑小分隊

相關文章