1. 程式人生 > >從英雄聯盟,看數據包何去何從?

從英雄聯盟,看數據包何去何從?

針對 英雄 通過 我不 進行 簡單 tps src 工作

寫在前面

我們總是在說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。

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

路由器

而路由器則負責連接多個網關,用於轉發數據包到某一個網關上,所以說路由器是管理網關的關鍵。

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

技術分享圖片

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

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

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

技術分享圖片

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

繼續數據包的旅程

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

路由表

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

路由協議

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

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

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

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

動態路由算法 - 距離矢量路由算法:

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

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

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

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

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

再次繼續數據包的旅程

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

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

網關接到數據包,如果發現不是自己這個局域網的,那麽同樣它也會轉發給能夠結構的路由器,循環往復這個過程,直至到達目的地。

總結

一個數據離開網卡,會有倆個出路,一個是廣播給同一個網段的某臺計算機;另一個出路是發送給配置好的默認網關。而這個網關則會發送對應的路由器,路由器通過自己的路由表確定下一條的網關。下一個網關,會查看這個數據包是不是自己局域網內的IP,如果不是則發送給能夠轉發出去的路由器。周而復始的執行這個過程。直到合適的網關接到數據,廣播給自己局域網內容的計算機。

尾聲

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

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

技術分享圖片

從英雄聯盟,看數據包何去何從?