1、上網的整個過程
假設我們點擊了某網頁上的一個鏈接,指向清華大學院系設置,其URL是:http://www.tsinghua.edu.cn/chn/yxsz/index.html。我們來分析一下整個過程:
- 瀏覽器分析鏈接指向頁面的URL
- 瀏覽器向DNS請求解析www.tsinghua.edu.cn的IP地址
- DNS系統解析出清華大學服務器的地址是166.111.4.100
- 瀏覽器與服務器建立TCP連接
- 瀏覽器發出取文件命令:GET /chn/yxsz/index.html
- 服務器www.tsinghua.edu.cn給出響應,把文件index.html返回給瀏覽器
- 釋放TCP連接
- 瀏覽器解析並顯示“清華大學院系設置”文件index.html中的內容
2、HTTP協議
Internet的基本協議是TCP/IP協議,目前廣泛使用的FTP、HTTP協議都是基於TCP/IP的,HTTP是Web應用使用最主要的協議。
HTTP基於請求響應模型。客戶端向服務器發送一個請求,請求頭包含請求的方法、URI、協議版本、以及包含請求修飾符、客戶端信息和內容的類似MIME的消息結果。服務器則返回一個狀態行作為響應,內容包括消息協議的版本、成功或失敗編碼加上包含服務器信息、實體元信息以及可能的實體內容。
HTTP協議是無狀態的,也就是說同一用戶在第二次訪問同一台服務器上的頁面時,服務器的響應與第一次被訪問時相同。
HTTP是無連接的,雖然HTTP是基於TCP的,但是HTTP本身是無連接的。客戶端和服務器的鏈接是基於一種請求應答模式。及客戶端和服務器建立一個鏈接,客戶端提交一個請求,服務器端收到請求后返回一個響應,然后二者就斷開鏈接。
3、請求/響應過程
把上面的上網過程抽象一下,得到下面的模型:

上面這個模型比較簡單,它描述的是HTTP1.0中的請求/響應過程。我們分析一下,整個過程中花費的時間包括:建立TCP三次握手的時間、客戶端發送請求的時間、服務器返回響應的時間。
下圖為請求一個萬維網文檔所需的時間:

這樣一次成功的請求/響應就要花費2*RTT+傳輸文檔的時間,另外還要考慮客戶端和服務器為每一次建立TCP連接分配緩存和變量的開銷,如果每次請求都這樣,顯然開銷太大。特別是當有很多用戶訪問同一台服務器時,這種非持續的連接會使得服務器負擔很重。HTTP1.1通過引入持續連接較好的解決了這個問題。
所謂持續連接就是服務器在發送一次響應后不是立即斷開TCP連接,而是在一段時間內仍然保持連接,使同一用戶和該服務器可以繼續在這條連接上傳送后續的請求和響應。持續連接有兩種工作方式:非流水線式和流水線式。
- 非流水線式:客戶在收到一個響應后才能發送下一個請求
- 流水線式:客戶在收到HTTP的響應報文之前能夠接着發送新的請求報文。於是一個接一個的請求到達服務器后,服務器就可以連續的返回響應報文。
4、代理服務器
代理服務器是一種網絡實體,它又稱為萬維網高速緩存。代理服務器把最近的一些請求和響應暫存在本地磁盤中。若一個網絡中使用了代理服務器,該網絡中的主機瀏覽器向因特網的服務器請求服務時,就先和代理服務器建立TCP連接,並向代理服務器發出HTTP請求報文。若代理服務器中已經存放了所請求的對象,則把這個對象放入HTTP響應報文中返回給客戶瀏覽器;否則,代理服務器就代表客戶瀏覽器與因特網上的源點服務器建立TCP連接,並發送HTTP請求報文。源點服務器把所請求的對象放在HTTP響應報文中返回給代理服務器。代理服務器收到這個對象后,先復制在自己的本地存儲器中,然后再把這個對象放在HTTP響應報文中,通過已經建立的TCP連接返回給客戶瀏覽器。
5、報文
HTTP有兩類報文:
- 請求報文:從客戶向服務器發送請求報文。
- 響應報文:從服務器到客戶的回答。
由於HTTP是面向文本的,因此在報文中的每一個字段都是一些ASCII碼串,因而各個字段的長度都是不確定的。HTTP請求報文和響應報文都是由三個部分組成。這兩種報文格式的區別就是開始行不同。
- 開始行:用於區分是請求報文還是響應報文。在請求報文中的開始行叫做請求行,而在響應報文中的開始行叫做狀態行。
- 首部行:用來說明瀏覽器、服務器或報文主體的一些信息。首部可以有好幾行,但也可以不使用。
- 實體主體:在請求報文中一般都不用這個字段,而在響應報文中也可能沒有這個字段。


請求:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,/
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
上面是一個請求的例子。
6、請求方法和狀態碼
請求方法
客戶端和服務器之間交互會使用不同的方法。下表列出了HTTP請求報文的幾種方法:
方法(操作) | 意義 |
---|---|
OPTIOON | 請求一些選項的信息 |
GET | 請求讀取由URL所標記的信息 |
HEAD | 請求讀取由URL所標記的信息的首部 |
POST | 向服務器提交信息 |
PUT | 在指明的URL下存儲一個文檔 |
DELETE | 刪除指明的URL所標記的資源 |
TRACE | 用來進行環回測試的請求報文 |
CONNECT | 用於代理服務器 |
狀態碼
狀態碼都是三位數字的:
- 1xx 表示通知信息,如請求收到或正在進行處理
- 2xx 表示成功,如接受或知道了
- 3xx 表示重定向,如要完成請求還必須采取進一步的行動
- 4xx 表示客戶的差錯,如請求中有錯誤的語法或不能完成
- 5xx 表示服務器的差錯,如服務器失效無法完成請求