一次web訪問背後的整個過程
最近這段時間一直在學習計算機網路方面的知識,今天書差不多算是看完了,所以想寫一篇文章來給自己這段時間對於計算機網路的學習做一個總結吧。可能會顯得很基礎和囉嗦,主要是初學者,不要介意。
我們學生在學校經常會用自己的膝上型電腦來上網,比如想通過瀏覽器開啟百度的主頁,這個動作看起來很簡單,其實背後蘊藏著很多的計算機網路方面的知識。
首先我們的電腦為了可以與外網通訊,需要獲得自己本機的IP地址;一臺主機通常直接與一臺路由器連線,該路由器即為該主機的預設路由器(default router),又稱為第一跳路由器(first-hop router),每當某主機發送一個分組時,該分組就被傳送給它的預設路由器,我們將源主機的預設路由器稱為源路由器(source router),把目的主機的預設路由器稱為目的路由器(destination router)。(所以一個分組從源主機到目的主機的選路問題顯然可歸結為從源路由器到目的路由器的選路問題。)所以我們的電腦為了可以與外界通訊,也需要建立與自己的預設路的連線,此時需要獲得自己預設路由器的地址;為了可以瀏覽網頁,需要DNS域名服務系統,來把網頁地址轉換為該網頁所在伺服器的IP地址,為了獲得DNS的服務,需要取得本地DNS伺服器的地址。
我們的電腦首先執行的是DHCP(Dynamic host configuration protocol)--動態主機配置協議,DHCP協議使用的傳輸層協議是UDP,主機將DHCP請求經傳輸層UDP、網路層IP以及乙太網中802.3協議的封裝後的幀以廣播的形式(目的地址是全1)傳送到本地區域網中,然後本地區域網中的DHCP伺服器接收請求,併發送一個DHCP響應給主機,響應包括分配給主機的IP地址,其預設路由器的IP地址,以及DNS伺服器的名字和IP地址。如下圖所示,是主機與本地DHCP伺服器通訊的示意圖。
此時我們的電腦主機已經獲得了自己的IP地址、預設路由器的IP地址以及DNS伺服器的IP地址和名字。在我們傳送HTTP請求的時候需要先獲得網址:www.baidu.com所在伺服器的IP地址,這樣我們才可以跟該web伺服器通訊,傳送HTTP請求。此時就需要執行DNS協議,向DNS伺服器傳送請求,當主機把DNS請求經UDP、IP封裝成網路層的IP資料包以後,到鏈路層都是利用MAC地址而非IP地址在交換機、路由器等之間進行轉發的,但是主機現在只知道DNS伺服器的IP地址,而不知道DNS伺服器的MAC地址,此時需要執行網路層的ARP(Address
Resolution Protocol)
此時主機算是知道了預設路由器的MAC地址,可以把DNS請求幀傳送到預設路由器上。接著路由器從接收的幀中把IP資料包取出來,然後根據目的IP地址把該資料包從校園網傳送到外網上,然後經過多個路由器的轉發最終到達DNS伺服器,路由器根據轉發表來轉發該資料包,其中的轉發表是根據各種選路演算法、選路協議來確定的,其中包括RIP,OSPF。IS—IS以及BGP等協議。DNS伺服器一層層拆解資料包,最終得到DNS的請求,然後DNS伺服器再回送一個DNS響應,響應含有域名www.baidu.com的web伺服器的IP地址,然後也是相似的經運輸層、網路層、鏈路層和物理層到達主機的預設路由器,最終到達主機。
當知道了web伺服器的IP地址以後,主機就可以傳送HTTP請求了,HTTP協議所使用的運輸層協議是TCP,TCP連線建立需要三次握手,第一次握手:客戶機到伺服器的SYN、seq=x;第二次握手:伺服器到客戶機的SYN、ACK、ack=x+1、seq=y和第三次握手:客戶機到伺服器的ACK、seq=x+1、ack=y+1,客戶機在第三次握手時就把資料傳送給伺服器了,此時TCP連線已經建立。
客戶機把HTTP請求傳送到TCP socket中,當包含該HTTP請求的TCP資料段到達web伺服器以後,伺服器回送一個帶有HTTP響應(網頁內容)的TCP資料段給主機,主機從TCP資料段中取出HTTP響應,然後交付給響應的socket埠,瀏覽器最終讀取並解釋和渲染該網頁最終顯示在主機螢幕上。