您好,登錄后才能下訂單哦!
我們總是在說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的反向解析的過程。
那如果不在同一網段呢?
讓我們先看一張圖:
cdn.xitu.io/2018/8/25/1657146180f0c922?w=674&h=600&f=png&s=288319">
是不是覺得走錯片場了?沒走錯、沒走錯,接下來就讓我,用這張圖,解釋數據包(英雄)將如何從我方水晶(我的計算機)到敵方水晶(目標計算機)。
假設我們是隨機英雄,游戲加載完畢,英雄被創建出來(從應用層到網絡層,層層包裝),來到了我方泉水(鏈路層)。
游戲準備開始,呦,我們的英雄是個瑞雯。假設我們的瑞雯,出生就帶著一個目標:從上路攻入敵方水晶。
但是我們的瑞雯,只知道目標,其他啥都不知道!敵方上路怎么走?我是新手,不知道啊。泉水商人是個戰爭販子,見多識廣,去問問他吧!
泉水商人看到瑞雯的目標,給瑞雯指了條明路:你去找我方上路高地塔。
我方上路高地塔,看到了瑞雯的目標說話了:不要慌,雖然我不知道敵方上路到水晶怎么走,但是我知道我方上路門牙怎么走。你從我這走,去它那準沒錯!
瑞雯拖著符文之刃,來到了我方上路門牙。我方上路門牙一看目標,瑞雯的目的是敵方水晶!我方上路門牙,輕蔑一笑:小姑娘,我勸你不要去找死。
瑞雯冷哼一聲:老娘,心悅會員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,如果不是則發送給能夠轉發出去的路由器。周而復始的執行這個過程。直到合適的網關接到數據,廣播給自己局域網內容的計算機。
其實本篇內容,偏向于流程的梳理,因為計算機網絡的世界本身就是以及極為龐大且復雜的學問,三言倆雨根本無法解釋清楚其中的復雜與智慧(說白了,就是我也不會)...因此,本文傾向于去通俗化的解釋這個流程。
如果有小伙伴感興趣,可以自行針對具體的內容,去學習更為專業的內容呦~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。