HTTP協議詳解
一、HTTP簡介
HTTP協議,即超文字傳輸協議(Hypertext transfer protocol)。是一種詳細規定了瀏覽器和全球資訊網(WWW = World Wide Web)伺服器之間互相通訊的規則,通過因特網傳送全球資訊網文件的資料傳送協議。HTTP是一個基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)。
二、 HTTP協議的特點
1、簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
2、靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
3、HTTP 0.9和1.0使用非持續連線:限制每次連線只處理一個請求,伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。HTTP 1.1使用持續連線:不必為每個web物件建立一個新的連線,一個連線可以傳送多個物件,採用這種方式可以節省傳輸時間。
4、無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
5、支援B/S和C/S模式。
三、HTTP的工作流程
一次HTTP操作稱為一個事務,其工作過程可分為四步:
1、首先客戶機與伺服器需要建立連線。只要單擊某個超級連結,HTTP的工作開始。
2、建立連線後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可能的內容。
3、伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。
4、客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的顯示屏上,然後客戶機與伺服器斷開連線。如果在以上過程中的某一步出現錯誤,那麼產生錯誤的資訊將返回到客戶端,有顯示屏輸出。對於使用者來說,這些過程是由HTTP自己完成的,使用者只要用滑鼠點選,等待資訊顯示就可以了。
四、URI和URL的區別
1、URI
URI,是uniform resource identifier,統一資源識別符號,用來唯一的標識一個資源。
Web上可用的每種資源如HTML文件、影象、視訊片段、程式等都是一個來URI來定位的。URI一般由三部組成:
(1)、訪問資源的命名機制;
(2)、存放資源的主機名;
(3)、資源自身的名稱,由路徑表示,著重強調於資源。
2、URL
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明瞭如何定位這個資源。
URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和伺服器程式上。採用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的地址和目錄等。URL一般由三部組成:
(1)、協議(或稱為服務方式);
(2)、存有該資源的主機IP地址(有時也包括埠號);
(3)、主機資源的具體地址。如目錄和檔名等。
HTTP URL的格式如下所示:
ofollow,noindex">http://host[ ":"port][abs_path]
https://www.jianshu.com/u/72588c94a841
http表示要通過HTTP協議來定位網路資源;host表示合法的Internet主機域名或者IP地址;port指定一個 埠號,為空則使用預設埠80;abs_path指定請求資源的URI(Web上任意的可用資源)。
五、HTTP請求報文
HTTP 報文是面向文字的,報文中的每一個欄位都是一些ASCII碼串,各個欄位的長度是不確定的。一 般一個HTTP請求報文由請求行、請求報頭、空行和請求資料4個部分組成。如下圖:

請求報文的一般格式
1.請求行
請求行由請求方法、URL欄位和HTTP協議的版本組成,格式如下:
Method Request-URI HTTP-Version CRLF 其中 Method表示請求方法;Request-URI是一個統一資源識別符號;HTTP-Version表示請求的HTTP協議 版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現單獨的CR或LF字元)。
HTTP請求方法有8種,分別是GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、 OPTIONS。對於移動開發最常用的就是GET和POST了。
• GET:請求獲取Request-URI所標識的資源。
• POST:在Request-URI所標識的資源後附加新的資料。
• HEAD:請求獲取由Request-URI所標識的資源的響應訊息報頭。
• PUT:請求伺服器儲存一個資源,並用Request-URI作為其標識。
• DELETE:請求伺服器刪除Request-URI所標識的資源。
• TRACE:請求伺服器回送收到的請求資訊,主要用於測試或診斷。
• CONNECT:HTTP 1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
• OPTIONS:請求查詢伺服器的效能,或者查詢與資源相關的選項和需求。
2.請求報頭
請求報頭通知伺服器關於客戶端請求的資訊。在下文 HTTP的訊息報頭 中詳細介紹
3.請求資料
請求資料不在GET方法中使用,而在POST方法中使用。POST方法適用於需要客戶填寫表單的場合, 與請求資料相關的最常用的請求報頭是Content-Type和Content-Length
4.示例

請求報文
六、HTTP響應報文
在接收和解釋請求訊息後,伺服器返回一個HTTP響應訊息。HTTP 的響應報文由狀態行、響應報頭、空行、響應正文組成。
1.狀態行
狀態行格式如下所示:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態碼;ReasonPhrase表示狀態碼的文字描述。狀態碼由3位數字組成,第一個數字定義了響應的類別,且有以下5種可能取值:
• 100~199:指示資訊,收到請求,需要請求者繼續執行操作。
• 200~299:請求成功,請求已被成功接收並處理。
• 300~399:重定向,要完成請求必須進行更進一步的操作。
• 400~499:客戶端錯誤,請求有語法錯誤或請求無法實現。
• 500~599:伺服器錯誤,伺服器不能實現合法的請求。
常見的狀態碼如下:
• 200 OK:客戶端請求成功。
• 301: 請求永久重定向
• 400 Bad Request:客戶端請求有語法錯誤,伺服器無法理解。
• 401 Unauthorized:請求未經授權,這個狀態碼必須和WWW-Authenticate報頭域一起使用。
• 403 Forbidden:伺服器收到請求,但是拒絕提供服務。
• 500 Internal Server Error:伺服器內部錯誤,無法完成請求。
• 503 Server Unavailable:伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常。
2.響應報頭
用於伺服器傳遞自身資訊的響應。在下文 HTTP的訊息報頭 中詳細介紹
3.響應正文
響應正文就是伺服器返回的資源的內容。
4.示例

響應報文
七、HTTP的訊息報頭
訊息報頭分為通用報頭、請求報頭、響應報頭、實體報頭等。訊息報頭由鍵值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。
1.通用報頭
它既可以出現在請求報頭,也可以出現在響應報頭中,如下所示:
• Date:表示訊息產生的日期和時間。
• Connection:允許傳送指定連線的選項。例如指定連線是連續的;或者指定“close”選項,通知服務 器,在響應完成後,關閉連線。
• Cache-Control:用於指定快取指令,快取指令是單向的(響應中出現的快取指令在請求中未必會出現),且是獨立的(一個訊息的快取指令不會影響另一個訊息處理的快取機制)。
2.請求報頭
在請求行之後會有0個或者多個請求報頭,請求報頭通知伺服器關於客戶端請求的資訊。典型的請求報頭如下所示:
• Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
• User-Agent:傳送請求的瀏覽器型別、作業系統等資訊。
• Accept:客戶端可識別的內容型別列表,用於指定客戶端接收哪些型別的資訊。
• Accept-Charset請求報頭域用於指定客戶端接受的字符集 。
• Accept-Encoding:客戶端可識別的資料編碼。
• Accept-Language:表示瀏覽器所支援的語言型別。
• Authorization請求報頭域主要用於證明客戶端有權檢視某個資源。
• Connection:允許客戶端和伺服器指定與請求/響應連線有關的選項。例如,這時為Keep-Alive則表示 保持連線。
• Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文采用了什麼編碼方式。
3.響應報頭
用於伺服器傳遞自身資訊的響應。常見的響應報頭如下所示:
• Location:用於重定向接收者到一個新的位置,常用在更換域名的時候。
• Server:包含伺服器用來處理請求的系統資訊,與User-Agent請求報頭是相對應的。
4.實體報頭
實體報頭用來定義被傳送資源的資訊,其既可用於請求也可用於響應。請求和響應訊息都可以傳送一 個實體。常見的實體報頭如下所示:
• Content-Type:傳送給接收者的實體正文的媒體型別。
• Content-Lenght:實體正文的長度。
• Content-Language:描述資源所用的自然語言。
• Content-Encoding:實體報頭被用作媒體型別的修飾符。它的值指示了已經被應用到實體正文的附加 內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體型別,必須採用相應的解碼機制。
• Last-Modified:實體報頭用於指示資源的最後修改日期和時間。
• Expires:實體報頭給出響應過期的日期和時間。
如理解有誤,還望指正,謝謝!