理解一個簡單的網頁請求過程


我們似乎每天都要做這樣一件事情,打開一個瀏覽器,輸入網址,回車,一個空白的頁面頓時有了東西,它可能是百度之類的搜索頁面,或是一個擠滿了文字和圖片的門戶網站。從我們打開瀏覽器,到我們看到我們想看的內容,這過程究竟發生了什么?

下面我們就從三個方面理解這個過程,一個是瀏覽器,二個是服務器,第三個是瀏覽器和服務器之間通信的協議。在理解這三方面之前我們必須先搞明白將這三方面聯系起來的一個詞:web。 

1,world wide web 

我們通常所說的web就是指world wide web。一般來講,這一種通過瀏覽器來訪問資源的技術。我們經常說的上網,應該大部都是指的是上萬維網(web),但是我們經常將萬維網和因特網(Internet)搞混。因特網是一種網絡互連的技術,它更指的是物理層面上的互連,而萬維網應該算是跑在因特網上的一種服務。

我們通常通過瀏覽器還訪問web,我們常見到的網頁中包含超文本,圖片,視頻音頻等各項內容。向我們提供這些資源的是一個一個的站點,通過互聯網,這些站點相互連接起來。我們通過超鏈接從一個網頁訪問到另外一個網頁,從一個站點到另外一個站點,所有的這一切組成一個龐大的網,這就是web。

支持web的技術,首先是底層的網絡,因為web就是建立在Internet之上,web的基本協議是HTTP協議,它跑在TCP上的協議之上,而TCP協議又需要IP協議的支持,IP協議又要由底層鏈路來支撐,所以我們可以從高到第看到這樣一個協議棧 http->tcp->ip->連路層協議。要理解web到ip就已經足夠了。

我們可以想一想web上的資源有哪些? 首先是文本,后來添加了圖片,到現在的各種音頻視頻資源,所有互聯網上的資源都要通過一個叫做URI的東西還標記,當然了我們更常見是URL。現在也不必糾結於兩者有何不同,URL就是URI的一個子集,URL給了我們資源的地址,所以我們能夠找到它。

現在看一個URL:https://www.google.com.hk/images/nav_logo107.png 這是一個圖片的url。它是按照這樣的語法來定義:scheme://domain:port/path?query_string#fragment_id.scheme就是協議,在瀏覽器里通常是http,例子中的是https是一種由HTTP和SSL/TLS組合起來的應用,用以提供加密通信和對網絡服務器的身份驗證(http://zh.wikipedia.org/zh/HTTPS )。然后就是域名,每個站點都至少有一個域名,上面例子上的域名部分是www.google.com.hk,這個域名也是分為三部分的,www是主機名,com.hk算是頂級域名,除了com還有cn,net等。域名后面是端口號默認為80,通常被省略,這是服務器端服務器軟件偵聽的端口,也是TCP里面一個端口號的值。然后就是path,資源在服務器上的路徑。最后問號部分的客戶端利用url傳給服務器的一些參數值,通常值比較少,不太重要時這么做。

2,協議

(1)HTTP協議

web里最重要的協議就是HTTP協議,對於經典的ISO七層網絡模型來說, HTTP處於最高層--應用層。HTTP應用的模型是client/server模型。因此對應着兩種HTTP消息類型,request和response。客戶端向服務器發出請求,服務器向客戶端發回請求。下面看一下兩種類型消息的格式:


 

 

下面分別進行解釋。

首先是HTTP Request Message

 請求行:請求行以一個方法符號開頭,以空格分開,后面跟着請求的URI和協議的版本。請求方法常見的有:GET POST HEAD PUT等。

消息報頭:在普通報頭中,有少數報頭域用於所有的請求和響應消息,但並不用於被傳輸的實體,只用於傳輸的消息。 請求報頭允許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。 請求和響應消息都可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但並不是說實體報頭域和實體正文要在一起發送,可以只發送實體報頭域。實體報頭定義了關於實體正文(eg:有無實體正文)和請求所標識的資源的元信息。 POST請求的內容放在實體正文中。 

 HTTP Response Message

 狀態行:最主要的一個字段是服務器響應代碼。比如,200 OK ,400 Bad Request ,401 Unauthorized ,403 Forbidden ,404 Not Found ,500 Internal Server Error ,503 Server Unavailable

消息報頭:普通報頭和實體報頭與 請求報頭的類似。有區別的在於響應包頭,響應報頭允許服務器傳遞不能放在狀態行中的附加響應信息,以及關於服務器的信息和對Request-URI所標識的資源進行下一步訪問的信息。

 (這部分說的比較粗略,網上的資源比較多,可以參考這一篇:http://blog.csdn.net/gueter/article/details/1524447 和http://book.51cto.com/art/200902/109036.htm )

 下面是ethereal抓到的一個get報文,post報文和響應報文,可以大概看一下。

 

 

 

(2)TCP協議

HTTP協議基於TCP協議,也就是HTTP的所有內容將作為TCP的實體被封裝到TCP報文里面。TCP協議是面向連接,可靠的傳輸機制。也就是說客戶端在與服務器交互數據的過程中會有一個連接建立和釋放的過程,看上面的Http頭部字段可以看到相關的字段。TCP有強大的窗口機制能夠適應發送方和接收方的發送接收能力,也能根據整個網絡狀況進行調整。

(3)IP協議

 IP協議處於整個TCP/IP協議族的承上啟下地位。我們知道因特網上主機是靠一個32位的ip地址來定位的,HTTP用的URL也算是地址,但是比較高級,IP協議是理解不了的,所以需要一個從URL到IP的轉換,這個過程通過DNS(域名查詢系統)協議完成。我們用的每一台電腦上都配置了DNS服務器的地址,如果沒有配置那么你的網關默認充當了,當我們有一個URL想知道對應的IP時就需要向DNS服務器發送查詢請求了,它會把查詢的結果發回。

2,瀏覽器

 在web的世界里最不能少的角色就是瀏覽器。前面我們說到HTTP協議,HTTP消息有兩種,request和response。瀏覽器的主要工作就是發送http request報文和接收處理http response報文。沒有看過瀏覽器的開源文檔,但是我覺得一個軟件只要完成下面幾件事,基本上就可以稱的上一個瀏覽器了。

(1)能夠根據用戶的請求生成合適的HTTP REQUEST報文。比如用戶在瀏覽器地址欄上輸入地址進行訪問,瀏覽器要能夠生成HTTP GET報文,表單的發送生成POST報文等等。

(2) 能夠對各種的RESPONSE進行處理。

(3)渲染Html文檔,生成文檔樹,能夠解釋css,還要有個javascript引擎。

(4)能夠發起dns查詢得到ip地址。

瀏覽器是個非常復雜的軟件,當然現在的瀏覽器對http協議的支持應該不是問題,它們主要糾結於html文檔渲染部分,對於用戶層出不窮的新需求,w3c層出不窮的新標准,瀏覽器的路應該才剛剛開始。 

3, 服務器

服務器有兩個層級的概念,它可以是機器,它上面存着一個站點的所有東西,也可以是軟件,安裝在一個也叫做服務器的機器上,幫助這個機器分發用戶想要的東西。 我對服務器研究不多,只是用過幾次apache。所以只是簡單的談談我的認識。

服務器最基本的功能就是響應客戶端的資源請求。服務器首先會偵聽80端口,來了http請求,就根據請求進行處理,請求一個圖片那就根據路徑找到資源發回,請求靜態html頁面也是如此,如果請求的是像php這樣的動態頁面應該先調用php編譯器(或是解釋器吧)生成html代碼,然后返回給客戶端。當然還要解決的一個問題就是並行問題以應對大訪問量。

因為對這方面不太了解,只想到了這么多。

 

先說到這里, 有了新的認識再寫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM