1. HTTP與SPDY協議
HTTP協議簡單是來說就是一種基於應用層的通訊規範,雙方要進行通訊,就要遵守的一種規範。HTTP協議從伺服器傳輸超文字到本地瀏覽器,可以使瀏覽器更加高效。HTTP協議不僅保證了超文字文件的快速和安全的傳輸,還能確定文件中哪一部分先傳輸,或者哪些部分優先顯示。
1.1 HTTP協議
HTTP協議是一個應用層的通訊規範,由請求和響應構成,是一個客戶端伺服器模型。HTTP協議承載於TCP協議之上,有時也承載於SSL、TLS協議之上(SSL、TLS也承載於TCP),這時就變成了我們常說的HTTPS。HTTP協議的預設埠是80,HTTPS是443。
HTTP協議的模型就是由客戶端發起請求,服務端回送響應。HTTP協議是一個無狀態的協議,一個客戶端的兩次請求沒有任何對應關係。這屬於典型的一問一答式互動,這種方式很多不足,例如服務端主動向客戶端push等。
1.2 SPDY協議
SPDY協議的出現主要是為了彌補HTTP協議的不足,SPDY協議支援流複用、主動發起請求、強制SSL傳輸等特性。SPDY協議是由google設計推廣的一種協議,目前在最新版本的Chrome和火狐等瀏覽器中都可以使用。
2. HTTP協議如何工作
瀏覽網頁是HTTP協議的主要作用,但是並不是全部作用。例如騰訊QQ、迅雷等都有使用HTTP協議。HTTP的主工作流程主要分為以下4步。
2.1 建立連線
客戶端與服務端建立連線。使用者點選一個超連結,HTTP協議開始工作。
2.2 發起請求
客戶端向服務端發起請求。請求內容格式如下:
統一資源識別符號(URL) HTTP協議版本號 請求MIME資訊(包含許可權修飾符、客戶端資訊等)
2.3 響應請求
服務端接收到請求處理完畢後向客戶端回送響應,響應格式為:
狀態行(包含協議版本號,成功或失敗的狀態) MIME資訊(包含伺服器資訊、響應實體等)
2.4 斷開連線
客戶端顯示響應後連線斷開。
3. HTTP協議中的主要概念
3.1 連線
首先需要說明的是,三次握手和四次揮手不屬於HTTP協議的部分,它們屬於TCP協議,但是上文有講到過:HTTP是基於TCP的應用層協議,所以,HTTP在連線和斷開時也要經過三次握手和四次揮手的過程。
3.1.1 TCP三次握手
首先看一張圖片
第一次握手
客戶端向伺服器發出連線報文,同時隨機生成一個初始序列號,這時客戶端處於同步已傳送狀態。TCP協議規定,SYN=1報文段中不能攜帶資料,但需要消耗一個序號。這是三次握手的開始,表示客戶端向想要和伺服器建立連線。第二次握手
伺服器收到連線請求後如果同意連線,則會發出ACK=1,SYN=1
,確認號是ack=client_jsn+1
,同時為自己初始化一個序列號server_jsn
。此時伺服器進入SYN-RCVD
(同步收到)狀態,此階段同樣不能攜帶資料,也要消耗一個序號。這是第二次握手,表示伺服器已同意並準備好連線,詢問客戶端是否準備完成。第三次握手
客戶端收到確認後向服務端發出報文ACK=1,ack=server_jsn+1
,表示已準備好,此時連線建立完成。
3.1.2 TCP四次揮手
第一次揮手
客戶端向服務端傳送FIN
報文,表示請求斷開連線。此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。第二次揮手
服務端收到FIN返回ACK
表示已經確認。此時服務端處於CLOSE-WAIT
(關閉等待)狀態,即伺服器已經知道客戶端沒有資料要傳送了,但是如果客戶端又傳送了資料服務端依然要接收。第三次揮手
服務端傳送FIN
到客戶端,表示已經關閉連線。此時伺服器進入LAST-ACK
(最後確認)狀態,等待客戶端的確認。第四次揮手
客戶端傳送ACK
(確認)報文,注意此時TCP連線還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。
伺服器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連線。可以看到,伺服器結束TCP連線的時間要比客戶端早一些。
3.2 請求
HTTP協議的請求中主要包含:請求行、請求主體、請求正文
, 請求行以請求方法符開頭,以空格分開,具體格式如下:
Method Request-URI HTTP-Version CRLF
POST /index.php/action/login HTTP/1.1
上述格式引數說明
引數 | 說明 |
---|---|
Method | 請求方法 |
Request-URI | 請求資源統一識別符號 |
HTTP-Version | 協議版本號 |
CRLF | 一個回車和換行 CR和LF不可單獨出現,僅可作為結尾 |
請求方法說明(大寫)
方法名 | 說明 |
---|---|
GET | 請求URI所標識的資源 |
POST | 在URI所標識的資源後附加資源 |
DELETE | 請求伺服器刪除URI所標識的資源 |
PUT | 請求伺服器儲存一個資源,使用URI作為標識 |
HEAD | 請求獲取由URI所標識的資源的響應報頭 |
TRACE | 請求伺服器回送收到的請求資訊,主要用於測試或診斷 |
CONNECT | 保留已備將來使用 |
OPTIONS | 請求查詢伺服器效能或者與URI所標識的資源相關的選項和需求 |
##### 3.3 響應 | |
在接收到客戶端的請求後,服務端處理完成後對該請求回送響應。響應主要又狀態行、響應報頭、響應正文組成。 | |
狀態行的格式如下: | |
``` | |
HTTP-Version Status-Code Reason-Phrase CRLF | |
HTTP/1.1 302 Moved Temporarily | |
``` | |
上述格式引數說明 |
引數 | 說明 |
---|---|
HTTP-Version | 協議版本號 |
Status-Code | 響應狀態碼 |
Reason-Phrase | 狀態碼的文字描述 |
CRLF | 一個回車和換行 CR和LF不可單獨出現,僅可作為結尾 |
響應狀態碼由三位數字組成,分別代表了不同含義,可取值如下:
可取值 | 說明 |
---|---|
1xx | 提示資訊。請求已接收,正在處理 |
2xx | 成功。請求已被成功接收、理解、接收 |
3xx | 重定向。要完成的請求需要更進一步的操作 |
4xx | 客戶端錯誤。請求有語法錯誤或者請求無法實現 |
5xx | 服務端錯誤。伺服器未能實現合法的請求 |
關於狀態碼還有更細的劃分,本文不做贅述。 |
3.4 報頭
HTTP訊息報頭主要包括普通報頭、請求報頭、響應報頭、實體報頭,報頭的格式如下:
名字+:+空格+值
Content-Length: 89
3.4.1 普通報頭
普通報頭中有少數報頭用於所有的請求和響應訊息。但並不被用於傳輸實體,只用於傳輸訊息,如快取控制、連線控制等。
3.4.2 請求報頭
請求報頭允許客戶端傳輸請求的附加資訊和自身的資訊,如UA頭、Accept頭等。
3.4.3 響應報頭
響應報頭用於伺服器傳輸在狀態行中不能傳輸的附加響應資訊,以及伺服器自身資訊,和對所標識的資源的下一步的操作資訊,如location等。
3.4.4 重要報頭說明
報頭 | 說明 |
---|---|
Connection | 如何處理長連線。在HTTP 1.1協議中client和server都預設對方支援長連結。 |
host | 指定所請求的資源的Internet主機和埠資訊。HTTP 1.1版本必須包含host頭。 |
User-Agent | 發出請求的使用者資訊。 |
Accept | 客戶端可接受的檔案格式。 |
Cookie | 客戶端向服務端傳輸的某些資訊。 |
Set-Cookie | 服務端向客戶端傳輸的資訊。只能包含一個value值,且需要設定path等。 |
Cache-Control | 指定請求和響應遵循的快取機制。 |
Referer | 客戶端指定的URL的來源,常用於生成退連結串列等。 |
Content-Lenth | 內容長度(位元組)。 |
Content-Range | 響應的資源範圍。可在每次請求中標記請求範圍,實現斷點傳輸等功能。 |
Accept-Encodeing | 指定可接受的編碼格式。 |
自定義報頭 | 可使用協議中未正式啟用或其他報頭。 |
本作品採用《CC 協議》,轉載必須註明作者和本文連結