HTTP 協議也是工做在客戶機 / 服務器模式下,分爲 HTTP 客戶端和 HTTP 服務器兩個部分,雙方每次進行交互,都是由客戶端發出的請求和服務器端發出的響應構成。 HTTP 協議規定的用戶使用瀏覽器訪問萬維網的過程能夠總結爲:html
1. 用戶在瀏覽器中鍵入須要訪問網頁的 URL 或者點擊某個網頁中連接;瀏覽器
2. 瀏覽器根據 URL 中的域名,經過 DNS 解析出目標網頁的 IP 地址;服務器
3. 瀏覽器與網頁所在服務器創建 TCP 鏈接;視頻
4. 瀏覽器發送 HTTP 請求報文,獲取目標網頁的文件;htm
5. 服務器發送 HTTP 響應報文,將目標網頁文件發送給瀏覽器;對象
6. 釋放 TCP 鏈接;資源
7. 瀏覽器將網頁的內容包括文本、圖像、聲音等顯示呈如今用戶計算機屏幕。文檔
HTTP 協議是無鏈接的,它使用面向鏈接的 TCP 協議所提供的服務。同時, HTTP 協議也是無狀態的,即服務器端不記錄客戶端訪問的時間和次數。最初的 HTTP 協議版本是 1.0 版,使用非持續鏈接(nonpersistentconnection) 。每傳輸一個對象都須要利用 1 個往返時間 RTT 創建 TCP 鏈接,用 1 個往返時間 RTT 申請並傳輸回對象,即平均用 2 個往返時間 RTT 獲取一個對象。目前使用比較普遍的是 HTTP協議的 1.1 版本( HTTP/1.1 ),其在默認狀況下使用持續鏈接 (persistentconnection) ,即利用同一個TCP 鏈接傳輸多個對象 。域名
HTTP 報文是面向文本的,報文中的每個字段都是一些 ASCII 碼串,各個字段的長度是不肯定的。HTTP 有兩類報文:請求報文和響應報文。 請求報文是從客戶端向服務器發送的報文,響應報文是從服務器到客戶端的報文。下面分別介紹請求報文和響應報文的具體格式。io
1. HTTP 請求報文格式
HTTP 請求報文的由請求行、請求頭部行、空行和請求數據四部分構成,具體格式以下所示:
(請求行) 方法名 + 空格 +URL+ 空格 + 版本 + 回車換行( \r\n )
(請求頭部行 1 )關鍵字 + 「:」 + 空格 + 值 + 回車換行( \r\n )
……
(請求頭部行 N )關鍵字 + 「:」 + 空格 + 值 + 回車換行( \r\n )
(空行)回車換行( \r\n )
(請求數據) ……
( 1 )請求行
請求行由請求方法字段、 URL 字段和 HTTP 協議版本字段 3 個字段組成,它們用空格分隔。最後由回車和換行表示請求行結束。例如:
GET www.sdu.edu.cn HTTP/1.1 回車換行 ( \r\n )
其中「方法」字段表示該請求報文但願服務器作什麼,請求報文的類型就是由所採用的方法決定的。 HTTP請求報文的主要方法包括: GET 、 POST 、 HEAD 、 PUT 、 DELETE 、 OPTIONS 、 TRACE 、CONNECT 等。最多見的方法有 GET 和 HEAD 。
GET 是最多見的一種請求方式,當客戶端要從服務器中讀取文檔時,當點擊網頁上的連接或者經過在瀏覽器的地址欄輸入網址來瀏覽網頁,使用的都是 GET 方式。 GET 方法要求服務器將 URL 定位的資源放在響應報文的數據部分,回送給客戶端。 GET 方式不適合傳送私密數據和大量數據。
HEAD 的功能與 GET 類似,只是服務器端接收到 HEAD 請求後只返回響應頭,而不會發送響應內容。當咱們只須要查看某個頁面的狀態的時候,使用 HEAD 是很是高效的,由於在傳輸的過程當中省去了頁面內容。
( 2 )請求頭部行( header )
請求頭部行包括若干行,每行由關鍵字及其值構成的,關鍵字和值用英文冒號 「:」 分隔,每一行都由回車換行表示結束。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭部關鍵字有:
User-Agent :產生請求的瀏覽器類型。
Accept :客戶端可識別的內容類型列表。
Accept-Language :客戶端可識別的語言類型
。
Host :請求的主機名。
Connection :告知服務器發送完文檔後釋放鏈接仍是保持鏈接。
( 3 )空行
最後一個請求頭部以後是一個空行,發送回車符和換行符,通知服務器如下再也不有請求頭部了。
( 4 )請求數據
GET 方法中沒有請求數據的內容, POST 方法使用請求數據,用於客戶端向服務器端填寫表單等操做。
好比瀏覽器使用 GET 方法訪問山東大學主頁中的「學校簡介」文檔( URL 爲www.sdu.edu.cn/2010/xxjj.htm ),則其 HTTP 請求報文能夠爲:
GET /2010/xxjj.html HTTP/1.1 \r\n
Host: www.sdu.edu.cn\r\n
User-Agent : Mozilla/5.0
Accept-Language:cn */*\r\n
2. 響應報文格式
HTTP 響應也由四個部分組成,分別是:狀態行、消息頭部、空行和響應正文。其具體格式以下:
(狀態行)版本 + 空格 + 狀態碼 + 空格 + 短語 + 回車換行
(消息頭部 1 )關鍵字 + 「:」 + 空格 + 值 + 回車換行
……
(消息頭部 N )關鍵字 + 「:」 + 空格 + 值 + 回車換行
(空行)回車換行( \r\n )
(響應正文) ……
在響應報文的狀態行中,版本字的表示服務器 HTTP 協議的版本,狀態碼字的表示服務器發回的響應狀態代碼;短語字段表示狀態代碼的文本描述。狀態碼由三位十進制數字組成,第一個數字定義了響應的類別,有五種可能取值( 1-5 ),每種狀態碼的含義以下:
1xx :指示信息。表示請求已接收,繼續處理。
2xx :成功。表示請求已被成功接收、理解、接受。
3xx :重定向。要完成請求必須進行更進一步的操做。
4xx :客戶端錯誤。請求有語法錯誤或請求沒法實現。
5xx :服務器端錯誤。服務器未能實現合法的請求。
常見狀態碼及狀態描述的說明以下:
200 OK :客戶端請求成功。
400 Bad Request :客戶端請求有語法錯誤,不能被服務器所理解。
401 Unauthorized :請求未經受權。
403 Forbidden :服務器收到請求,可是拒絕提供服務。
404 Not Found :請求資源不存在,好比輸入了錯誤的 URL 。
500 Internal Server Error :服務器發生不可預期的錯誤。
503 Server Unavailable :服務器當前不能處理客戶端的請求,一段時間後可能恢復正常。
消息頭部與請求頭部的格式類似,也是包含若干行,每行由關鍵字及其值構成,經常使用的關鍵字包括:
Date: 表示返回消息的時間。
Content-Type: 表示返回消息的內容類型。
Content-Length: 返回內容的長度(字節數)。
Server :使用的服務器軟件及其版本號。
一樣,最後一個消息頭部以後是一個空行,發送回車符和換行符,通知客戶端如下再也不有消息頭部了。