前言
前一篇介紹了OSI參考模型/TCP/IP協定體系每層的作用以及分層的好處,但是對于一個應用資料通路來說,在TCP/IP協定體系中,它不是獨立完成的,而是各層之間共同完成,直到從實體層媒體變成比特流發送出去,這一篇就以一個平時常用的網站通路來了解下整個的通信過程。(這個過程不嚴謹,隻是讓初學者了解起來更加友善,省去了一些細節的過程。)
當我打開浏覽器,通路自己部落格時,中間經曆了什麼,它是如何到達對方伺服器的呢?
這裡隻是講解重點部分,很多協定的細節或者網絡環境都進行了簡化,這個其實就是後面我們要學的,但是對于初學者來說,先了解一個通信的大緻過程,以及資料包在處理過程中,每一層發生了什麼事情,這樣在後續的學習中就會一個很大的幫助。
(1)打開浏覽器,輸入www.ccieh3c.com,這個時候應用程式浏覽器會查找hosts檔案或者DNS緩存,是否有這個域名對應的IP資訊,如果沒有則會發送給DNS進行請求,轉換成對應的IP。(這裡假設ccieh3c.com的位址是1.1.1.1,浏覽器知道,DNS協定在後續會講解)得到IP後,浏覽器開始打包通路的請求,使用HTTP或者HTTPS,不管使用哪種,裡面請求的是ccieh3c.com的首頁,對應的協定會把這個請求給組織好進行封裝,然後通過socket接口交給下一層傳輸層去完成。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) (2)傳輸層有兩種協定,一種TCP(面向連接配接協定),一種UDP(無連接配接協定),而HTTP使用的是TCP協定,簡單了解面向連接配接就是TCP能夠保證資料能夠到達對方,如果對方沒收到,就會重新發送,直到對方收到為止。(這裡暫時省去了TCP的細節)TCP會産生兩個端口号,一個是通路者自己浏覽器随機生成的端口号(假設為21345),伺服器WEB的端口号為标準端口号(80),這個端口号我們在後續會在提及,傳輸層封裝完畢,會交給下一層網絡層。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) (3)在TCP/IP中網絡層使用的是IP協定,IP協定裡面涉及兩個重要位址,一個是源IP位址,一個是目的IP位址,源位址表示通路者,目的就是我們要去通路的伺服器位址1.1.1.1,大家可能好奇,平時我打開電腦就能上網了呀,并沒有去設定過什麼IP位址,那是因為在網絡裡面有另外一個協定幫助電腦自動擷取位址,這個協定就是DHCP。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版)
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 這個時候電腦作業系統知道了伺服器的目标IP,就開始根據這個IP找伺服器,并且作業系統會做一個判斷,這個目标IP位址是不是本地,還是其他的地方的,顯然在伺服器IP 1.1.1.1與本地電腦IP 192.168.255.2不在一個地方,不在一個地方的話,那怎麼去往對方呢?作業系統會進行一個操作,把這個資料丢給預設網關,192.168.255.254,讓網關來進行轉發。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) (4)這個時候是不是就萬事大吉了,知道了伺服器的IP位址,也知道去往對方交給網關處理就行了,但是要考慮這樣一個問題,這個資料是要繼續往下面封裝的,下一層是資料鍊路層,在資料鍊路層裡面可能存在着多個裝置,那通路者怎麼來确定你就是我要找的網關呢?
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 這個時候就要介紹另外一種位址了,實體位址(MAC位址),當裝置出廠的時候,廠家會把這個位址燒錄進網卡接口裡面,它的作用就是在鍊路層裡面來進行通信,并且這個位址由于出廠就已經固定燒錄在網卡裡面了,具有唯一性,是以能夠來定位确認到某一台裝置,明白了這個,通路者隻要在鍊路層裡面找這個實體MAC位址,不就能夠确認網關是誰了嗎?又出現一個新的問題了,通路者他不可能天生就知道網關的MAC位址是多少,那如何得知呢?通路者這個時候會在本地鍊路裡面大吼一聲,誰是192.168.255.254啊,告訴我!!網關聽到這個後,發現找的是自己,也大吼一聲,我就是!這是我的實體MAC位址!,這樣通路者就知道了網關的MAC位址了,這個靠大吼一聲的協定就是ARP協定,而這種鍊路層網絡叫做以太區域網路。(這個也是我們學習的重點)鍊路層封裝完畢後,最終交給實體層(網卡)變成比特流1010101010,通過實體媒體網線發送出去。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 到這裡,通路者電腦總算是完成了整個的資料封裝流程,把這個浏覽器的請求發送出去,交給網關了。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) (5)網關收到以後,需要考慮一個問題,這個資料是給自己的呢?還是交給其他地方的?這個時候網關就需要做一個操作,就是把資料給解封裝,因為網關隻有看到了對應的資訊,它才能夠判斷這個包到底是給自己的還是交給其他。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 接下來的流程就不提實體層了,隻要是正正常範的網卡跟線路它都能夠去處理這些比特流的内容,後續重點放在二層、三層上面(這個也是路由交換的重點。)網關通過解封裝後,得到以太網頭部,發現目标MAC是自己,繼續解封裝,得到IP頭部,發現目标IP位址是1.1.1.1,這個位址不是自己,那就是需要交給其他地方的,網關會執行一個操作,查找路由表,選擇去往1.1.1.1的最優路徑。這裡從圖上面可以發現去往目的地可以通過B,也可以通過C到達,也非常像我們去往一個地方,比如去北京,都知道做飛機是最快的,但是可能從你源地方那沒有機場,你需要做班車或者地鐵到最近的機場才行。同樣的,網關查路由表發現去往目的IP 1.1.1.1,有B、C兩條路徑可以發送,它會通過路由算法做出一個計算,選擇一條最優的路徑抵達到對方,然後發送出去,比如這裡從B去往目的地最優,這個條目會展現在路由表裡面,網關知道去往1.1.1.1,發送給B,這個時候就有2個疑問了,第一:鍊路層與網絡層的頭部已經被解封裝去掉了,路由器需要重新封裝,第二:封裝的内容怎麼填寫。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 從通路者電腦到網關,以太網的頭部源MAC位址是電腦的,目的MAC位址是網關的,那麼到了網關這裡,網關的網卡接口也有自己的MAC位址,B路由器的接口也有自己的MAC位址,這時候網關封裝鍊路層的以太網頭部在用之前的資訊就不行了,因為它表示的是電腦找網關這段鍊路中用的,而到了這裡則變成了網關去往1.1.1.1,交給B處理,那是不是以太網頭部的源MAC變成了網關接口的MAC,而目的MAC變成了B的,這樣B在收到這個包以後,它會發現原來是找它的,它也跟網關一樣執行一樣的解封裝,查路由表,在封裝,最終到達D。(網關到B,B到D擷取的MAC同樣通過ARP協定)
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 在這個結構裡面,D的身後就是WEB伺服器了,D在收到這個資料以後,也跟之前網關、B的操作一樣,解封裝鍊路層,發現目的MAC是找自己,解封網絡網絡層後 ,發現IP是1.1.1.1,就在自己身後,通過ARP得到伺服器的MAC,然後封裝好 ,交給伺服器。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 伺服器收到以後,開始如下的解封裝。
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) (6)伺服器收到請求後會進行回包,最終跟來的時候一樣,通過封裝,然後中間經過路由器轉發,最終也到達用戶端,解封裝,最終内容呈現在了浏覽器的界面上。(是不是覺得不可思議,平時我們打開浏覽器輸入一個域名回車,中間竟然發生了這麼多的事情。)
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 從上面例子劃出重點
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) 從上面的通信例子,跟我們生活中寄快遞是不是有點類似,在某平台購買了一個商品,賣家作為發送方,将商品進行打包,通過快遞平台選擇一家,讓其收件、列印單号(包含收件人資訊:位址+姓名+電話),快遞小哥會上門收件,回到快遞點,快遞公司會通過去往相近地區統一裝車發往下一個轉運中心,可能中間會經過一個或者多個轉運中心,期間也可能會經曆一次或者多次卸車、裝車的過程,以及去往的路徑也不一樣,可能某一段走的陸運、某一段走的是空運,到達了最近的轉運中心,開始卸車,将同一個區域的送往代理點,代理點的送貨員将對應快遞送到指定的位址(這個位址可能是某公司、某小區、某學校,這是沒辦法确定具體的收件人),最終會通過電話号碼聯系到最終的收件人進行收件,這樣完成了整個的運輸過程, 買家收到以後,就是一個拆件的過程。這裡說下,快遞的舉例是沒法全部跟上面的通信過程全部對應上的,隻是說很多流程比較相似,便于初學者了解,畢竟用生活的例子代入進來比枯燥的協定流程要容易了解些,通過一個網絡通信的流程以及生活的例子,這裡列出幾個重點資訊(也是我們後續要學的内容)
有沒有好奇過,用浏覽器通路某個網站時,中間經曆了什麼,如何到達對方的?(初學版) - 從上面的例子可以看出來,從用戶端的應用程式發送資料到伺服器,是一層一層的往下封裝,最終發送出去,這個過程叫做封裝,伺服器收到以後,要看到實際的資料,必須一層一層的解封裝,看到最終的資料,然後進行回複。
- 封裝的作用是為了把這個資料發送出去,應用層的應用程式負責産生資料,交給下層,這裡有一個關鍵的點記住,應用程式是知道對方伺服器的具體位址的,它會告訴下層。比如這裡通路的是域名ccieh3c.com,這個ccieh3c.com是使用者輸入告訴浏覽器的,浏覽器它必須知道域名對應的IP,是以會通過另外一個應用層協定DNS來擷取對應的IP,這個時候浏覽器就知道了對應的IP。(DNS協定在後面會介紹到的)
- 傳輸層負責建立雙方的邏輯通信,并且能夠正确表示上層應用,因為在實際中,可能對方伺服器運作了WEB、FTP、郵件等應用功能,那用戶端在封裝的時候要明确辨別出來上層的應用是什麼,這樣對方在讀取的時候才知道,哦,原來你是通路我WEB應用,這個能夠辨別上層應用的功能叫做端口号。從這裡也可以發現,位址加端口号能夠确定最終去往的目的伺服器是哪台以及通路這台伺服器的什麼應用。
- 傳輸層完畢後,會繼續封裝給網絡層,網絡層必要知道2個重要功能,(1)通過上層給的位址資訊,生成IP頭部(IP頭裡面有兩個最重要的資訊,源IP,目的IP,源IP表示用戶端自己,目的IP表示通路的最終目标)(2)查找目标位址怎麼走然後繼續封裝交給下一層鍊路層。
- 鍊路層目前主流使用的是以太網(區域網路),以太網頭部有三個重要的資訊(1)必須包含源目MAC,否則無法進行封裝(2)源目MAC應該怎麼填寫呢,從上面的流程來看,會發現一個特點,從用戶端最終抵達伺服器,以太網頭部的變化從用戶端--網關,網關--B,B--D,D--伺服器,每經過一個裝置,源目MAC是會變化的,是不是可以了解成以太網的源目MAC隻在本地鍊路内有效。(3)不管是用戶端--網關、B--D,它本身是不知道對端的MAC位址的,它依靠一個協定去擷取,那就是ARP協定,最終封裝完成,交給實體層轉換成比特流從網線發送出去到網關。
- 中間裝置收到,比如B、D,它們是會進行解封裝的,檢視以太網頭部,發現MAC是自己,繼續解封 裝,檢視IP頭部,發現去往的目的IP不是自己,那就查路由表轉發,交給下一個傳遞裝置,然後封裝以太網頭部的時候,源MAC更新為自己,目的MAC為下一個傳遞裝置,這裡的重點是什麼呢?(1)能把資料在本地鍊路内準确的發送給下一個傳遞裝置 (2)下一個傳遞裝置收到以後,通過解封裝發現MAC是自己,又解封裝,檢視IP,發現不是自己,通過路由表查詢下一個傳遞裝置,重新封裝以太網頭部,打上新的MAC,這樣在傳遞過程中就不會出錯了,否則用戶端--網關,網關--B的時候,以太網頭部沒有更改MAC位址,它看目的MAC是網關,而不是自己,那說明不是找我的,直接就把這個給丢棄了,不做處理了。
- 最終伺服器收到這個資料,它開始解封裝,檢視以太網頭部,發現目的MAC位址是自己,繼續解封裝,檢視IP頭部,發現目的IP還是自己,這個時候伺服器可以斷定這個資料是給我的了,繼續開始解封裝,從傳輸層頭部(TCP)中得到上層的端口号,最終通過端口号知道用戶端通路什麼服務,交給對應的應用程式處理,完成互動。
- 整個通信過程就是一個不斷封裝、解封裝的過程,不通的終端讀取的層次不一樣,并且在強調下之前提到過的,應用程式它不關心這個資料最終如何抵達對方的,同樣網絡層以及資料鍊路層,它也不關心你上層的應用是網頁浏覽、QQ、微信、還是遊戲,各層負責各自的事情,下層為上層提供對應的服務。
總結
到這裡呢,這篇内容就接近尾聲了,這裡先說下,最開始的案例有部分的流程是不對的,但是對于初學者來說,隻能簡化按這樣的順序講解,否則就非常的複雜,不易于了解,後續在随着深入,部落客會繼續把這個流程在梳理一次,這樣印象就更加深刻了,從最開始的舉例,到中間的生活中的快遞舉例,在到後面的重要細節總結,一直在重複的講解資料在傳遞過程中發生的事情,因為這個流程很關鍵,也是我們學習的重點,是以不斷的重複加深印象,了解了整個通信過程,好處在于後續學習協定的時候會更加了解,并且排錯的時候知道如何下手,因為清楚的知道每一層的作用,大緻能夠定位卡在哪個地方,比如網絡層,目的IP在路由表中不存在,那自然資料就發不出去了,又或者以太網頭部封裝中,網關裝置的MAC擷取錯誤,自然資料會轉發給錯誤的裝置,希望大家可以多花時間去了解這個大緻通信過程,做到心底有底,剩下的内容就是我們接下來要慢慢去學習的細節部分,完善整個路由交換的知識架構,這樣才好進行網絡的規劃、對接、運用什麼技術實作客戶的需求等。順便接下來留幾個疑問,這樣也是下面要開始涉及的内容了。
- 什麼是IP位址,它的作用是什麼呢?
- 電腦系統是怎麼知道要把這個資料交給網關處理呢?以及什麼情況下才需要交給網關處理?
- DNS是做什麼用的?
- ARP協定它如何實作的?
- 伺服器在解封裝的時候,它是在下一層的時候就知道上一層使用的是什麼協定?還是必須解封裝後,抵達上一層,才能知道呢?
- 電腦的IP位址是哪裡來的?
- 在網絡傳輸中,IP與MAC哪個變化,哪個是不變化的?
- 像網關這樣有多個接口的裝置,它在封裝MAC的時候以哪個口進行封裝呢?
(可以嘗試自己根據上面的舉例了解下,這樣提高學習興趣,後面會更有動力哇,但是切記不要鑽牛角尖,這樣很容易卡死在胡同裡面,降低學習興趣。)