前言
前一篇介紹了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的時候以哪個口進行封裝呢?
(可以嘗試自己根據上面的舉例理解下,這樣提高學習興趣,后面會更有動力哇,但是切記不要鉆牛角尖,這樣很容易卡死在胡同里面,降低學習興趣,)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317869.html
標籤:其他
上一篇:實作一個網頁直播功能超級簡單(EasyRTMP.apk + nginx-http-flv + vue + flv.js) 不使用 Flash
下一篇:Nginx代理mysql埠
