[計算機網絡] - 從英雄聯盟,看數據包何去何從?

寫在前面

咱們老是在說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的反向解析的過程。3d

那若是不在同一網段呢?cdn

讓咱們先看一張圖:

進入聯盟的世界

是否是以爲走錯片場了?沒走錯、沒走錯,接下來就讓我,用這張圖,解釋數據包(英雄)將如何從我方水晶(個人計算機)到敵方水晶(目標計算機)。

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

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

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

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

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

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

瑞雯冷哼一聲:老孃,心悅會員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面試填坑小分隊
相關文章
相關標籤/搜索