网络协议必会知识点:互联网网络分层
文章出自 |《趣談網(wǎng)絡(luò)協(xié)議》
長時間從事計算機網(wǎng)絡(luò)相關(guān)的工作,我發(fā)現(xiàn),計算機網(wǎng)絡(luò)有一個顯著的特點,就是這是一個不僅需要背誦,而且特別需要將原理爛熟于胸的學科。很多問題看起來懂了,但是就怕往細里問,一問就發(fā)現(xiàn)你懂得沒有那么透徹。
我們上一節(jié)列了之后要講的網(wǎng)絡(luò)協(xié)議。這些協(xié)議本來沒什么稀奇,每一本教科書都會講,并且都要求你背下來。因為考試會考,面試會問。可以這么說,畢業(yè)了去找工作還答不出這類題目的,那你的筆試基本上也就掛了。
當你聽到什么二層設(shè)備、三層設(shè)備、四層LB和七層LB中層的時候,是否有點一頭霧水,不知道這些所謂的層,對應(yīng)的各種協(xié)議具體要做什么“工作”?
這四個問題你真的懂了嗎?
因為教科書或者老師往往會打一個十分不恰當?shù)谋扔?#xff1a;為什么網(wǎng)絡(luò)要分層呀?因為不同的層次之間有不同的溝通方式,這個叫作協(xié)議。例如,一家公司也是分“層次”的,分總經(jīng)理、經(jīng)理、組長、員工。總經(jīng)理之間有他們的溝通方式,經(jīng)理和經(jīng)理之間也有溝通方式,同理組長和員工。有沒有聽過類似的比喻?
那么第一個問題來了。請問經(jīng)理在握手的時候,員工在干什么?很多人聽過TCP建立連接的三次握手協(xié)議,也會把它當知識點背誦。同理問你,TCP在進行三次握手的時候,IP層和MAC層對應(yīng)都有什么操作呢?
除了上面這個不恰當?shù)谋扔?#xff0c;教科書還會列出每個層次所包含的協(xié)議,然后開始逐層地去講這些協(xié)議。但是這些協(xié)議之間的關(guān)系呢?卻很少有教科書會講。
學習第三層的時候會提到,IP協(xié)議里面包含目標地址和源地址。第三層里往往還會學習路由協(xié)議。路由就像中轉(zhuǎn)站,我們從原始地址A到目標地址D,中間經(jīng)過兩個中轉(zhuǎn)站A-\u0026gt;B-\u0026gt;C-\u0026gt;D,是通過路由轉(zhuǎn)發(fā)的。
那么第二個問題來了。A知道自己的下一個中轉(zhuǎn)站是B,那從A發(fā)出來的包,應(yīng)該把B的IP地址放在哪里呢?B知道自己的下一個中轉(zhuǎn)站是C,從B發(fā)出來的包,應(yīng)該把C的IP地址放在哪里呢?如果放在IP協(xié)議中的目標地址,那包到了中轉(zhuǎn)站,怎么知道最終的目的地址是D呢?
教科書不會通過場景化的例子,將網(wǎng)絡(luò)包的生命周期講出來,所以你就會很困惑,不知道這些協(xié)議實際的應(yīng)用場景是什么。
我再問你一個問題。你一定經(jīng)常聽說二層設(shè)備、三層設(shè)備。二層設(shè)備處理的通常是MAC層的東西。那我發(fā)送一個HTTP的包,是在第七層工作的,那是不是不需要經(jīng)過二層設(shè)備?或者即便經(jīng)過了,二層設(shè)備也不處理呢?或者換一種問法,二層設(shè)備處理的包里,有沒有HTTP層的內(nèi)容呢?
最終,我想問你一個綜合的問題。從你的電腦,通過SSH登錄到公有云主機里面,都需要經(jīng)歷哪些過程?或者說你打開一個電商網(wǎng)站,都需要經(jīng)歷哪些過程?說得越詳細越好。
實際情況可能是,很多人會答不上來。盡管對每一層都很熟悉,但是知識點卻串不起來。
上面的這些問題,有的在這一節(jié)就會有一個解釋,有的則會貫穿我們整個課程。好在后面一節(jié)中我會舉一個貫穿的例子,將很多層的細節(jié)講過后,你很容易就能把這些知識點串起來。
網(wǎng)絡(luò)為什么要分層?
這里我們先探討第一個問題,網(wǎng)絡(luò)為什么要分層?因為,是個復雜的程序都要分層。
理解計算機網(wǎng)絡(luò)中的概念,一個很好的角度是,想象網(wǎng)絡(luò)包就是一段Buffer,或者一塊內(nèi)存,是有格式的。同時,想象自己是一個處理網(wǎng)絡(luò)包的程序,而且這個程序可以跑在電腦上,可以跑在服務(wù)器上,可以跑在交換機上,也可以跑在路由器上。你想象自己有很多的網(wǎng)口,從某個口拿進一個網(wǎng)絡(luò)包來,用自己的程序處理一下,再從另一個網(wǎng)口發(fā)送出去。
當然網(wǎng)絡(luò)包的格式很復雜,這個程序也很復雜。復雜的程序都要分層,這是程序設(shè)計的要求。比如,復雜的電商還會分數(shù)據(jù)庫層、緩存層、Compose層、Controller層和接入層,每一層專注做本層的事情。
程序是如何工作的?
我們可以簡單地想象“你”這個程序的工作過程。
當一個網(wǎng)絡(luò)包從一個網(wǎng)口經(jīng)過的時候,你看到了,首先先看看要不要請進來,處理一把。有的網(wǎng)口配置了混雜模式,凡是經(jīng)過的,全部拿進來。
拿進來以后,就要交給一段程序來處理。于是,你調(diào)用process_layer2(buffer)。當然,這是一個假的函數(shù)。但是你明白其中的意思,知道肯定是有這么個函數(shù)的。那這個函數(shù)是干什么的呢?從Buffer中,摘掉二層的頭,看一看,應(yīng)該根據(jù)頭里面的內(nèi)容做什么操作。
假設(shè)你發(fā)現(xiàn)這個包的MAC地址和你的相符,那說明就是發(fā)給你的,于是需要調(diào)用process_layer3(buffer)。這個時候,Buffer里面往往就沒有二層的頭了,因為已經(jīng)在上一個函數(shù)的處理過程中拿掉了,或者將開始的偏移量移動了一下。在這個函數(shù)里面,摘掉三層的頭,看看到底是發(fā)送給自己的,還是希望自己轉(zhuǎn)發(fā)出去的。
如何判斷呢?如果IP地址不是自己的,那就應(yīng)該轉(zhuǎn)發(fā)出去;如果IP地址是自己的,那就是發(fā)給自己的。根據(jù)IP頭里面的標示,拿掉三層的頭,進行下一層的處理,到底是調(diào)用process_tcp(buffer)呢,還是調(diào)用process_udp(buffer)呢?
假設(shè)這個地址是TCP的,則會調(diào)用process_tcp(buffer)。這時候,Buffer里面沒有三層的頭,就需要查看四層的頭,看這是一個發(fā)起,還是一個應(yīng)答,又或者是一個正常的數(shù)據(jù)包,然后分別由不同的邏輯進行處理。如果是發(fā)起或者應(yīng)答,接下來可能要發(fā)送一個數(shù)據(jù)包;如果是一個正常的數(shù)據(jù)包,就需要交給上層了。交給誰呢?是不是有process_http(buffer)函數(shù)呢?
沒有的,如果你是一個網(wǎng)絡(luò)包處理程序,你不需要有process_http(buffer),而是應(yīng)該交給應(yīng)用去處理。交給哪個應(yīng)用呢?在四層的頭里面有端口號,不同的應(yīng)用監(jiān)聽不同的端口號。如果發(fā)現(xiàn)瀏覽器應(yīng)用在監(jiān)聽這個端口,那你發(fā)給瀏覽器就行了。至于瀏覽器怎么處理,和你沒有關(guān)系。
瀏覽器自然是解析HTML,顯示出頁面來。電腦的主人看到頁面很開心,就點了鼠標。點擊鼠標的動作被瀏覽器捕獲。瀏覽器知道,又要發(fā)起另一個HTTP請求了,于是使用端口號,將請求發(fā)給了你。
你應(yīng)該調(diào)用send_tcp(buffer)。不用說,Buffer里面就是HTTP請求的內(nèi)容。這個函數(shù)里面加一個TCP的頭,記錄下源端口號。瀏覽器會給你目的端口號,一般為80端口。
然后調(diào)用send_layer3(buffer)。Buffer里面已經(jīng)有了HTTP的頭和內(nèi)容,以及TCP的頭。在這個函數(shù)里面加一個IP的頭,記錄下源IP的地址和目標IP的地址。
然后調(diào)用send_layer2(buffer)。Buffer里面已經(jīng)有了HTTP的頭和內(nèi)容、TCP的頭,以及IP的頭。這個函數(shù)里面要加一下MAC的頭,記錄下源MAC地址,得到的就是本機器的MAC地址和目標的MAC地址。不過,這個還要看當前知道不知道,知道就直接加上;不知道的話,就要通過一定的協(xié)議處理過程,找到MAC地址。反正要填一個,不能空著。
萬事俱備,只要Buffer里面的內(nèi)容完整,就可以從網(wǎng)口發(fā)出去了,你作為一個程序的任務(wù)就算告一段落了。
揭秘層與層之間的關(guān)系
知道了這個過程之后,我們再來看一下原來困惑的問題。
首先是分層的比喻。所有不能表示出層層封裝含義的比喻,都是不恰當?shù)摹?偨?jīng)理握手,不需要員工在吧,總經(jīng)理之間談什么,不需要員工參與吧,但是網(wǎng)絡(luò)世界不是這樣的。正確的應(yīng)該是,總經(jīng)理之間溝通的時候,經(jīng)理將總經(jīng)理放在自己兜里,然后組長把經(jīng)理放自己兜里,員工把組長放自己兜里,像套娃娃一樣。那員工直接溝通,不帶上總經(jīng)理,就不恰當了。
現(xiàn)實生活中,往往是員工說一句,組長補充兩句,然后經(jīng)理補充兩句,最后總經(jīng)理再補充兩句。但是在網(wǎng)絡(luò)世界,應(yīng)該是總經(jīng)理說話,經(jīng)理補充兩句,組長補充兩句,員工再補充兩句。
那TCP在三次握手的時候,IP層和MAC層在做什么呢?當然是TCP發(fā)送每一個消息,都會帶著IP層和MAC層了。因為,TCP每發(fā)送一個消息,IP層和MAC層的所有機制都要運行一遍。而你只看到TCP三次握手了,其實,IP層和MAC層為此也忙活好久了。
這里要記住一點:只要是在網(wǎng)絡(luò)上跑的包,都是完整的。可以有下層沒上層,絕對不可能有上層沒下層。
所以,對TCP協(xié)議來說,三次握手也好,重試也好,只要想發(fā)出去包,就要有IP層和MAC層,不然是發(fā)不出去的。
經(jīng)常有人會問這樣一個問題,我都知道那臺機器的IP地址了,直接發(fā)給他消息唄,要MAC地址干啥?這里的關(guān)鍵就是,沒有MAC地址消息是發(fā)不出去的。
所以如果一個HTTP協(xié)議的包跑在網(wǎng)絡(luò)上,它一定是完整的。無論這個包經(jīng)過哪些設(shè)備,它都是完整的。
所謂的二層設(shè)備、三層設(shè)備,都是這些設(shè)備上跑的程序不同而已。一個HTTP協(xié)議的包經(jīng)過一個二層設(shè)備,二層設(shè)備收進去的是整個網(wǎng)絡(luò)包。這里面HTTP、TCP、 IP、 MAC都有。什么叫二層設(shè)備呀,就是只把MAC頭摘下來,看看到底是丟棄、轉(zhuǎn)發(fā),還是自己留著。那什么叫三層設(shè)備呢?就是把MAC頭摘下來之后,再把IP頭摘下來,看看到底是丟棄、轉(zhuǎn)發(fā),還是自己留著。
小結(jié)
總結(jié)一下今天的內(nèi)容,理解網(wǎng)絡(luò)協(xié)議的工作模式,有兩個小竅門:
- 始終想象自己是一個處理網(wǎng)絡(luò)包的程序:如何拿到網(wǎng)絡(luò)包,如何根據(jù)規(guī)則進行處理,如何發(fā)出去;
- 始終牢記一個原則:只要是在網(wǎng)絡(luò)上跑的包,都是完整的。可以有下層沒上層,絕對不可能有上層沒下層。
我是劉超,歡迎你訂閱我的專欄《趣談網(wǎng)絡(luò)協(xié)議》。
總結(jié)
以上是生活随笔為你收集整理的网络协议必会知识点:互联网网络分层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言基础:数组作为函数参数传递演示源码
- 下一篇: 基础语法(IDE:PyCharm)