2.1 TTP 協議規定,請求從客戶端發出,最後服務器端響應該請求並返回。換句話說,確定是先從客戶端開始 創建通訊的,服務器端在沒有接收到請求以前不會發送響應。 html
下面則是從客戶端發送給某個 HTTP 服務器端的請求報文中的內容 瀏覽器
GET /index.htm HTTP/1.1 Host: hackr.jp
請求報文是由請求方法、請求 URI、協議版本、可選的請求首部字段和內容實體構成的。 安全
響應報文基本上由協議版本、狀態碼(表示請求成功或失敗的數字代碼)、用以解釋狀態碼的緣由短語、可選的響應 首部字段以及實體主體構成。 服務器
HTTP/1.1 200 OK Date: Tue, 10 Jul 2012 06:50:15 GMT Content-Length: 362 Content-Type: text/html <html> ......
在起始行開頭的 HTTP/1.1 表示服務器對應的 HTTP 版本。
緊挨着的 200 OK 表示請求的處理結果的狀態碼(status code)和緣由短語(reason-phrase)。下一行顯 網站
示了建立響應的日期時間,是首部字段(header field)內的一個屬性。 接着以一空行分隔,以後的內容稱爲資源實體的主體(entity body)。 url
GET: 獲取資源 方法用來請求訪問已被 URI 識別的資源。指定的資源經服務器端解析後返回響應內容。也就是說,若是 請求的資源是文本,那就保持原樣返回 spa
POST:傳輸實體主體 雖然用 GET 方法也能夠傳輸實體的主體,但通常不用 GET 方法進行傳輸,而是用 POST 方法。雖然說 POST 的功能與 GET 很類似,但 POST 的主要目的並非獲取響應的主體內容 PS(主要用Post傳實體是由於實體不用跟在url後面吧) code
PUT:傳輸文件 PUT 方法用來傳輸文件。就像 FTP 協議的文件上傳同樣,要求在請求報文的主體中包含文件內容,而後保存到請求 URI 指定的位置 (可是,鑑於 HTTP/1.1 的 PUT 方法自身不帶驗證機制,任何人均可以上傳文件 , 存在安全性問題,所以通常 的 Web 網站不使用該方法 ) htm
DELETE:刪除文件 DELETE 方法用來刪除文件,是與 PUT 相反的方法。DELETE 方法按請求 URI 刪除指定的資源 ( 圖片
可是,HTTP/1.1 的 DELETE 方法自己和 PUT 方法同樣不帶驗證機制,因此通常的 Web 網站也不使用 DELETE 方法。當配合 Web 應用程序的驗證機制,或遵照 REST 標準時仍是有可能會開放使用的。 )
OPTIONS:詢問支持的方法 OPTIONS 方法用來查詢針對請求 URI 指定的資源支持的方法。
TRACE:追蹤路徑 方法是讓 Web 服務器端將以前的請求通訊環回給客戶端的方法。可是,TRACE 方法原本就不怎麼經常使用,再加上它容易引起 XST(Cross-Site Tracing,跨站追蹤)攻擊,通 常就更不會用到了。
向請求 URI 指定的資源發送請求報文時,採用稱爲方法的命令。 方法的做用在於,能夠指定請求的資源定期望產生某種行爲。方法中有 GET、POST 和 HEAD 等。
HTTP 協議的初始版本中,每進行一次 HTTP 通訊就要斷開一次 TCP 鏈接。
好比,使用瀏覽器瀏覽一個包含多張圖片的 HTML 頁面時,在發送請求訪問 HTML 頁面資源的同時,也會請 求該 HTML 頁面裏包含的其餘資源。所以,每次的請求都會形成無謂的 TCP 鏈接創建和斷開,增長通訊量的 開銷。
2.7.1 持久鏈接
爲解決上述 TCP 鏈接的問題,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久鏈接(HTTP Persistent Connections,也稱爲 HTTP keep-alive 或 HTTP connection reuse)的方法。持久鏈接的特色是,只要任意 一端沒有明確提出斷開鏈接,則保持 TCP 鏈接狀態。
持久鏈接的好處在於減小了 TCP 鏈接的重複創建和斷開所形成的額外開銷,減輕了服務器端的負載。另外,減小開銷的那部分時間,使 HTTP 請求和響應可以更早地結束,這樣 Web 頁面的顯示速度也就相應提升了。
在 HTTP/1.1 中,全部的鏈接默認都是持久鏈接,但在 HTTP/1.0 內並未標準化。雖然有一部分服務器經過非 標準的手段實現了持久鏈接,但服務器端不必定可以支持持久鏈接。毫無疑問,除了服務器端,客戶端也需 要支持持久鏈接。
持久鏈接使得多數請求以管線化(pipelining)方式發送成爲可能。從前發送請求後需等待並收到響應,才能發送下一個請求。管線化技術出現後,不用等待響應亦可直接發送下一個請求。
這樣就可以作到同時並行發送多個請求,而不須要一個接一個地等待響應了。
HTTP 是無狀態協議,它不對以前發生過的請求和響應的狀態進行管理。
保留無狀態協議這個特徵的同時又要解決相似的矛盾問題,因而引入了 Cookie 技術。Cookie 技術經過在請 求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。
Cookie 會根據從服務器端發送的響應報文內的一個叫作 Set-Cookie 的首部字段信息,通知客戶端保存 Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值後發送出去。
服務器端發現客戶端發送過來的 Cookie 後,會去檢查到底是從哪個客戶端發來的鏈接請求,而後對比服務 器上的記錄,最後獲得以前的狀態信息。
1. 請求報文(沒有 Cookie 信息的狀態)
GET /reader/ HTTP/1.1 Host: hackr.jp *首部字段內沒有Cookie的相關信息
2. 響應報文(服務器端生成 Cookie 信息)
HTTP/1.1 200 OK Date: Thu, 12 Jul 2012 07:12:20 GMT Server: Apache <Set-Cookie: sid=1342077140226724; path=/; expires=Wed, 10-Oct-12 07:12:20 GMT> Content-Type: text/plain; charset=UTF-8
3. 請求報文(自動發送保存着的 Cookie 信息)
GET /image/ HTTP/1.1 Host: hackr.jp Cookie: sid=1342077140226724