HTTP協議及請求/響應模型
1、上網的整個過程
- 瀏覽器分析連結指向頁面的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通過引入持續連線較好的解決了這個問題。
所謂持續連線
- 非流水線式:客戶在收到一個響應後才能傳送下一個請求
- 流水線式:客戶在收到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 表示伺服器的差錯,如伺服器失效無法完成請求