作者:一天,本文首發(fā)于公眾號:網(wǎng)絡(luò)之路博客
前言
前一篇介紹了OSI參考模型/TCP/IP協(xié)議體系每層的作用以及分層的好處,但是對于一個應(yīng)用數(shù)據(jù)訪問來說,在TCP/IP協(xié)議體系中,它不是獨立完成的,而是各層之間共同完成,直到從物理層介質(zhì)變成比特流發(fā)送出去,這一篇就以一個平時常用的網(wǎng)站訪問來了解下整個的通信過程。(這個過程不嚴謹,只是讓初學者理解起來更加方便,省去了一些細節(jié)的過程。)
當我打開瀏覽器,訪問自己博客時,中間經(jīng)歷了什么,它是如何到達對方服務(wù)器的呢?
這里只是講解重點部分,很多協(xié)議的細節(jié)或者網(wǎng)絡(luò)環(huán)境都進行了簡化,這個其實就是后面我們要學的,但是對于初學者來說,先了解一個通信的大致過程,以及數(shù)據(jù)包在處理過程中,每一層發(fā)生了什么事情,這樣在后續(xù)的學習中就會一個很大的幫助。
(1)打開瀏覽器,輸入www.ccieh3c.com,這個時候應(yīng)用程序瀏覽器會查找hosts文件或者DNS緩存,是否有這個域名對應(yīng)的IP信息,如果沒有則會發(fā)送給DNS進行請求,轉(zhuǎn)換成對應(yīng)的IP。(這里假設(shè)ccieh3c.com的地址是1.1.1.1,瀏覽器知道,DNS協(xié)議在后續(xù)會講解)得到IP后,瀏覽器開始打包訪問的請求,使用HTTP或者HTTPS,不管使用哪種,里面請求的是ccieh3c.com的首頁,對應(yīng)的協(xié)議會把這個請求給組織好進行封裝,然后通過socket接口交給下一層傳輸層去完成。

(2)傳輸層有兩種協(xié)議,一種TCP(面向連接協(xié)議),一種UDP(無連接協(xié)議),而HTTP使用的是TCP協(xié)議,簡單理解面向連接就是TCP能夠保證數(shù)據(jù)能夠到達對方,如果對方?jīng)]收到,就會重新發(fā)送,直到對方收到為止。(這里暫時省去了TCP的細節(jié))TCP會產(chǎn)生兩個端口號,一個是訪問者自己瀏覽器隨機生成的端口號(假設(shè)為21345),服務(wù)器WEB的端口號為標準端口號(80),這個端口號我們在后續(xù)會在提及,傳輸層封裝完畢,會交給下一層網(wǎng)絡(luò)層。
(3)在TCP/IP中網(wǎng)絡(luò)層使用的是IP協(xié)議,IP協(xié)議里面涉及兩個重要地址,一個是源IP地址,一個是目的IP地址,源地址表示訪問者,目的就是我們要去訪問的服務(wù)器地址1.1.1.1,大家可能好奇,平時我打開電腦就能上網(wǎng)了呀,并沒有去設(shè)置過什么IP地址,那是因為在網(wǎng)絡(luò)里面有另外一個協(xié)議幫助電腦自動獲取地址,這個協(xié)議就是DHCP。


這個時候電腦操作系統(tǒng)知道了服務(wù)器的目標IP,就開始根據(jù)這個IP找服務(wù)器,并且操作系統(tǒng)會做一個判斷,這個目標IP地址是不是本地,還是其他的地方的,顯然在服務(wù)器IP 1.1.1.1與本地電腦IP 192.168.255.2不在一個地方,不在一個地方的話,那怎么去往對方呢?操作系統(tǒng)會進行一個操作,把這個數(shù)據(jù)丟給默認網(wǎng)關(guān),192.168.255.254,讓網(wǎng)關(guān)來進行轉(zhuǎn)發(fā)。

(4)這個時候是不是就萬事大吉了,知道了服務(wù)器的IP地址,也知道去往對方交給網(wǎng)關(guān)處理就行了,但是要考慮這樣一個問題,這個數(shù)據(jù)是要繼續(xù)往下面封裝的,下一層是數(shù)據(jù)鏈路層,在數(shù)據(jù)鏈路層里面可能存在著多個設(shè)備,那訪問者怎么來確定你就是我要找的網(wǎng)關(guān)呢?

到這里,訪問者電腦總算是完成了整個的數(shù)據(jù)封裝流程,把這個瀏覽器的請求發(fā)送出去,交給網(wǎng)關(guān)了。

(5)網(wǎng)關(guān)收到以后,需要考慮一個問題,這個數(shù)據(jù)是給自己的呢?還是交給其他地方的?這個時候網(wǎng)關(guān)就需要做一個操作,就是把數(shù)據(jù)給解封裝,因為網(wǎng)關(guān)只有看到了對應(yīng)的信息,它才能夠判斷這個包到底是給自己的還是交給其他。

接下來的流程就不提物理層了,只要是正常規(guī)范的網(wǎng)卡跟線路它都能夠去處理這些比特流的內(nèi)容,后續(xù)重點放在二層、三層上面(這個也是路由交換的重點。)網(wǎng)關(guān)通過解封裝后,得到以太網(wǎng)頭部,發(fā)現(xiàn)目標mac是自己,繼續(xù)解封裝,得到IP頭部,發(fā)現(xiàn)目標IP地址是1.1.1.1,這個地址不是自己,那就是需要交給其他地方的,網(wǎng)關(guān)會執(zhí)行一個操作,查找路由表,選擇去往1.1.1.1的最優(yōu)路徑。這里從圖上面可以發(fā)現(xiàn)去往目的地可以通過B,也可以通過C到達,也非常像我們?nèi)ネ粋€地方,比如去北京,都知道做飛機是最快的,但是可能從你源地方那沒有機場,你需要做班車或者地鐵到最近的機場才行。同樣的,網(wǎng)關(guān)查路由表發(fā)現(xiàn)去往目的IP 1.1.1.1,有B、C兩條路徑可以發(fā)送,它會通過路由算法做出一個計算,選擇一條最優(yōu)的路徑抵達到對方,然后發(fā)送出去,比如這里從B去往目的地最優(yōu),這個條目會體現(xiàn)在路由表里面,網(wǎng)關(guān)知道去往1.1.1.1,發(fā)送給B,這個時候就有2個疑問了,第一:鏈路層與網(wǎng)絡(luò)層的頭部已經(jīng)被解封裝去掉了,路由器需要重新封裝,第二:封裝的內(nèi)容怎么填寫。

從訪問者電腦到網(wǎng)關(guān),以太網(wǎng)的頭部源MAC地址是電腦的,目的MAC地址是網(wǎng)關(guān)的,那么到了網(wǎng)關(guān)這里,網(wǎng)關(guān)的網(wǎng)卡接口也有自己的MAC地址,B路由器的接口也有自己的MAC地址,這時候網(wǎng)關(guān)封裝鏈路層的以太網(wǎng)頭部在用之前的信息就不行了,因為它表示的是電腦找網(wǎng)關(guān)這段鏈路中用的,而到了這里則變成了網(wǎng)關(guān)去往1.1.1.1,交給B處理,那是不是以太網(wǎng)頭部的源MAC變成了網(wǎng)關(guān)接口的MAC,而目的MAC變成了B的,這樣B在收到這個包以后,它會發(fā)現(xiàn)原來是找它的,它也跟網(wǎng)關(guān)一樣執(zhí)行一樣的解封裝,查路由表,在封裝,最終到達D。(網(wǎng)關(guān)到B,B到D獲取的MAC同樣通過ARP協(xié)議)

在這個結(jié)構(gòu)里面,D的身后就是WEB服務(wù)器了,D在收到這個數(shù)據(jù)以后,也跟之前網(wǎng)關(guān)、B的操作一樣,解封裝鏈路層,發(fā)現(xiàn)目的MAC是找自己,解封網(wǎng)絡(luò)網(wǎng)絡(luò)層后 ,發(fā)現(xiàn)IP是1.1.1.1,就在自己身后,通過ARP得到服務(wù)器的MAC,然后封裝好 ,交給服務(wù)器。

服務(wù)器收到以后,開始如下的解封裝。

(6)服務(wù)器收到請求后會進行回包,最終跟來的時候一樣,通過封裝,然后中間經(jīng)過路由器轉(zhuǎn)發(fā),最終也到達客戶端,解封裝,最終內(nèi)容呈現(xiàn)在了瀏覽器的界面上。(是不是覺得不可思議,平時我們打開瀏覽器輸入一個域名回車,中間竟然發(fā)生了這么多的事情。)

從上面例子劃出重點

從上面的通信例子,跟我們生活中寄快遞是不是有點類似,在某平臺購買了一個商品,賣家作為發(fā)送方,將商品進行打包,通過快遞平臺選擇一家,讓其收件、打印單號(包含收件人信息:地址+姓名+電話),快遞小哥會上門收件,回到快遞點,快遞公司會通過去往相近地區(qū)統(tǒng)一裝車發(fā)往下一個轉(zhuǎn)運中心,可能中間會經(jīng)過一個或者多個轉(zhuǎn)運中心,期間也可能會經(jīng)歷一次或者多次卸車、裝車的過程,以及去往的路徑也不一樣,可能某一段走的陸運、某一段走的是空運,到達了最近的轉(zhuǎn)運中心,開始卸車,將同一個區(qū)域的送往代理點,代理點的送貨員將對應(yīng)快遞送到指定的地址(這個地址可能是某公司、某小區(qū)、某學校,這是沒辦法確定具體的收件人),最終會通過電話號碼聯(lián)系到最終的收件人進行收件,這樣完成了整個的運輸過程, 買家收到以后,就是一個拆件的過程。這里說下,快遞的舉例是沒法全部跟上面的通信過程全部對應(yīng)上的,只是說很多流程比較相似,便于初學者理解,畢竟用生活的例子代入進來比枯燥的協(xié)議流程要容易理解些,通過一個網(wǎng)絡(luò)通信的流程以及生活的例子,這里列出幾個重點信息(也是我們后續(xù)要學的內(nèi)容)

- 從上面的例子可以看出來,從客戶端的應(yīng)用程序發(fā)送數(shù)據(jù)到服務(wù)器,是一層一層的往下封裝,最終發(fā)送出去,這個過程叫做封裝,服務(wù)器收到以后,要看到實際的數(shù)據(jù),必須一層一層的解封裝,看到最終的數(shù)據(jù),然后進行回復(fù)。
- 封裝的作用是為了把這個數(shù)據(jù)發(fā)送出去,應(yīng)用層的應(yīng)用程序負責產(chǎn)生數(shù)據(jù),交給下層,這里有一個關(guān)鍵的點記住,應(yīng)用程序是知道對方服務(wù)器的具體地址的,它會告訴下層。比如這里訪問的是域名ccieh3c.com,這個ccieh3c.com是用戶輸入告訴瀏覽器的,瀏覽器它必須知道域名對應(yīng)的IP,所以會通過另外一個應(yīng)用層協(xié)議DNS來獲取對應(yīng)的IP,這個時候瀏覽器就知道了對應(yīng)的IP。(DNS協(xié)議在后面會介紹到的)
- 傳輸層負責建立雙方的邏輯通信,并且能夠正確表示上層應(yīng)用,因為在實際中,可能對方服務(wù)器運行了WEB、FTP、郵件等應(yīng)用功能,那客戶端在封裝的時候要明確標識出來上層的應(yīng)用是什么,這樣對方在讀取的時候才知道,哦,原來你是訪問我WEB應(yīng)用,這個能夠標識上層應(yīng)用的功能叫做端口號。從這里也可以發(fā)現(xiàn),地址加端口號能夠確定最終去往的目的服務(wù)器是哪臺以及訪問這臺服務(wù)器的什么應(yīng)用。
- 傳輸層完畢后,會繼續(xù)封裝給網(wǎng)絡(luò)層,網(wǎng)絡(luò)層必要知道2個重要功能,(1)通過上層給的地址信息,生成IP頭部(IP頭里面有兩個最重要的信息,源IP,目的IP,源IP表示客戶端自己,目的IP表示訪問的最終目標)(2)查找目標地址怎么走然后繼續(xù)封裝交給下一層鏈路層。
- 鏈路層目前主流使用的是以太網(wǎng)(局域網(wǎng)),以太網(wǎng)頭部有三個重要的信息(1)必須包含源目MAC,否則無法進行封裝(2)源目MAC應(yīng)該怎么填寫呢,從上面的流程來看,會發(fā)現(xiàn)一個特點,從客戶端最終抵達服務(wù)器,以太網(wǎng)頭部的變化從客戶端--網(wǎng)關(guān),網(wǎng)關(guān)--B,B--D,D--服務(wù)器,每經(jīng)過一個設(shè)備,源目MAC是會變化的,是不是可以理解成以太網(wǎng)的源目MAC只在本地鏈路內(nèi)有效。(3)不管是客戶端--網(wǎng)關(guān)、B--D,它本身是不知道對端的MAC地址的,它依靠一個協(xié)議去獲取,那就是ARP協(xié)議,最終封裝完成,交給物理層轉(zhuǎn)換成比特流從網(wǎng)線發(fā)送出去到網(wǎng)關(guān)。
- 中間設(shè)備收到,比如B、D,它們是會進行解封裝的,查看以太網(wǎng)頭部,發(fā)現(xiàn)MAC是自己,繼續(xù)解封 裝,查看IP頭部,發(fā)現(xiàn)去往的目的IP不是自己,那就查路由表轉(zhuǎn)發(fā),交給下一個傳遞設(shè)備,然后封裝以太網(wǎng)頭部的時候,源MAC更新為自己,目的MAC為下一個傳遞設(shè)備,這里的重點是什么呢?(1)能把數(shù)據(jù)在本地鏈路內(nèi)準確的發(fā)送給下一個傳遞設(shè)備 (2)下一個傳遞設(shè)備收到以后,通過解封裝發(fā)現(xiàn)MAC是自己,又解封裝,查看IP,發(fā)現(xiàn)不是自己,通過路由表查詢下一個傳遞設(shè)備,重新封裝以太網(wǎng)頭部,打上新的MAC,這樣在傳遞過程中就不會出錯了,否則客戶端--網(wǎng)關(guān),網(wǎng)關(guān)--B的時候,以太網(wǎng)頭部沒有更改MAC地址,它看目的MAC是網(wǎng)關(guān),而不是自己,那說明不是找我的,直接就把這個給丟棄了,不做處理了。
- 最終服務(wù)器收到這個數(shù)據(jù),它開始解封裝,查看以太網(wǎng)頭部,發(fā)現(xiàn)目的MAC地址是自己,繼續(xù)解封裝,查看IP頭部,發(fā)現(xiàn)目的IP還是自己,這個時候服務(wù)器可以斷定這個數(shù)據(jù)是給我的了,繼續(xù)開始解封裝,從傳輸層頭部(TCP)中得到上層的端口號,最終通過端口號知道客戶端訪問什么服務(wù),交給對應(yīng)的應(yīng)用程序處理,完成交互。
- 整個通信過程就是一個不斷封裝、解封裝的過程,不通的終端讀取的層次不一樣,并且在強調(diào)下之前提到過的,應(yīng)用程序它不關(guān)心這個數(shù)據(jù)最終如何抵達對方的,同樣網(wǎng)絡(luò)層以及數(shù)據(jù)鏈路層,它也不關(guān)心你上層的應(yīng)用是網(wǎng)頁瀏覽、QQ、微信、還是游戲,各層負責各自的事情,下層為上層提供對應(yīng)的服務(wù)。
總結(jié)
到這里呢,這篇內(nèi)容就接近尾聲了,這里先說下,最開始的案例有部分的流程是不對的,但是對于初學者來說,只能簡化按這樣的順序講解,否則就非常的復(fù)雜,不易于理解,后續(xù)在隨著深入,博主會繼續(xù)把這個流程在梳理一次,這樣印象就更加深刻了,從最開始的舉例,到中間的生活中的快遞舉例,在到后面的重要細節(jié)總結(jié),一直在重復(fù)的講解數(shù)據(jù)在傳遞過程中發(fā)生的事情,因為這個流程很關(guān)鍵,也是我們學習的重點,所以不斷的重復(fù)加深印象,了解了整個通信過程,好處在于后續(xù)學習協(xié)議的時候會更加理解,并且排錯的時候知道如何下手,因為清楚的知道每一層的作用,大致能夠定位卡在哪個地方,比如網(wǎng)絡(luò)層,目的IP在路由表中不存在,那自然數(shù)據(jù)就發(fā)不出去了,又或者以太網(wǎng)頭部封裝中,網(wǎng)關(guān)設(shè)備的MAC獲取錯誤,自然數(shù)據(jù)會轉(zhuǎn)發(fā)給錯誤的設(shè)備,希望大家可以多花時間去理解這個大致通信過程,做到心底有底,剩下的內(nèi)容就是我們接下來要慢慢去學習的細節(jié)部分,完善整個路由交換的知識框架,這樣才好進行網(wǎng)絡(luò)的規(guī)劃、對接、運用什么技術(shù)實現(xiàn)客戶的需求等。順便接下來留幾個疑問,這樣也是下面要開始涉及的內(nèi)容了。
- 什么是IP地址,它的作用是什么呢?
- 電腦系統(tǒng)是怎么知道要把這個數(shù)據(jù)交給網(wǎng)關(guān)處理呢?以及什么情況下才需要交給網(wǎng)關(guān)處理?
- DNS是做什么用的?
- ARP協(xié)議它如何實現(xiàn)的?
- 服務(wù)器在解封裝的時候,它是在下一層的時候就知道上一層使用的是什么協(xié)議?還是必須解封裝后,抵達上一層,才能知道呢?
- 電腦的IP地址是哪里來的?
- 在網(wǎng)絡(luò)傳輸中,IP與MAC哪個變化,哪個是不變化的?
- 像網(wǎng)關(guān)這樣有多個接口的設(shè)備,它在封裝MAC的時候以哪個口進行封裝呢?
(可以嘗試自己根據(jù)上面的舉例理解下,這樣提高學習興趣,后面會更有動力哇,但是切記不要鉆牛角尖,這樣很容易卡死在胡同里面,降低學習興趣。)
心底有底,剩下的內(nèi)容就是我們接下來要慢慢去學習的細節(jié)部分,完善整個路由交換的知識框架,這樣才好進行網(wǎng)絡(luò)的規(guī)劃、對接、運用什么技術(shù)實現(xiàn)客戶的需求等。順便接下來留幾個疑問,這樣也是下面要開始涉及的內(nèi)容了。
- 什么是IP地址,它的作用是什么呢?
- 電腦系統(tǒng)是怎么知道要把這個數(shù)據(jù)交給網(wǎng)關(guān)處理呢?以及什么情況下才需要交給網(wǎng)關(guān)處理?
- DNS是做什么用的?
- ARP協(xié)議它如何實現(xiàn)的?
- 服務(wù)器在解封裝的時候,它是在下一層的時候就知道上一層使用的是什么協(xié)議?還是必須解封裝后,抵達上一層,才能知道呢?
- 電腦的IP地址是哪里來的?
- 在網(wǎng)絡(luò)傳輸中,IP與MAC哪個變化,哪個是不變化的?
- 像網(wǎng)關(guān)這樣有多個接口的設(shè)備,它在封裝MAC的時候以哪個口進行封裝呢?
(可以嘗試自己根據(jù)上面的舉例理解下,這樣提高學習興趣,后面會更有動力哇,但是切記不要鉆牛角尖,這樣很容易卡死在胡同里面,降低學習興趣。)