44-http協議

參考資料:

《Web性能權威指南》

《HTTP權威指南》

 

1. http協議概述

http協議全稱爲超文本傳輸協議(HTTP,HyperText Transfer Protocol),是基於tcp協議的一個應用層協議,主要定義web瀏覽器和web服務器之間交換數據的過程以及數據的格式。

經過不斷地發展,現在http協議不僅成爲了瀏覽器使用的通信協議,而且還成爲了大部分的互聯網軟件和硬件應用的協議,所以在學習計算機網絡時還是有必要學習http協議的。

 

2. http發展史

http協議發展到現在共經歷了好幾個版本,這裏簡單瞭解下:

1. HTTP/0.9版本,HTTP 的 1991 原型版本稱爲 HTTP/0.9, 這個協議有很多嚴重的設計缺陷,只應該用於與老客戶端的交互 ,僅支持GET方式和HTML文本傳輸。

2. HTTP/1.0版本,HTTP/1.0 添加了版本號、 各種 HTTP首部、 一些額外的方法, 以及對多媒體對象的處理,多種請求方式,如:GET,POST,PUT等。

3. HTTP/1.1版本,1999年公佈的HTTP/1.1是目前主流的HTTP協議版本,直到現在都還在廣泛使用。

4. HTTP/2.0版本,2015年HTTP/2.0正式發佈,它重點關注的是性能的大幅優化,安全性更高。

 

雖然HTTP/2.0版本很早就發佈了,但是HTTP/1.1版本目前還在大量使用。

 

3. http連接過程

另外,http協議具備無連接,無狀態的特點,服務器無法記住客戶端的身份。

在http1.0版本中,瀏覽器與WEB服務器的連接過程中,每次連接只處理一個請求和響應,對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接,瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應。這種連接稱爲短連接。

如果每次進行http請求就會進行一次tcp連接建立和斷開,這顯然降低了通信的性能的。後來在http1.1中改進了這個問題,使用了持久連接,持久連接的特點就是隻要任意一端沒有主動發起斷開連接,那麼則會一直保持連接狀態。

 

http協議建立連接的過程:

 

首先http是一個基於tcp協議的應用層協議,客戶端在和服務器進行通信前會先建立tcp連接,然後才正式開始進行http通信,通信完畢後釋放tcp連接。 

我們可以把客戶端和服務器的通信過程分四個過程:建立連接、發送請求信息、發送響應信息、關閉連接。 一般來說http協議並不關心網絡通信的細節,它把這些工作都交給了tcp協議來完成,因此在這四個過程中,我們重點關注發出請求和發出響應信息這兩個過程,也就是http請求和http響應。

 

4. http請求和http響應

 

什麼是http請求和http響應?

http請求:如果你想要向web服務器獲取某些web資源時,就需要發出http請求信息向服務器請求web資源。

http響應:當服務器收到http請求後,服務器就會發送http響應信息把請求的web資源返回給客戶端。

 

什麼是web資源?

簡單來說,web資源就是web服務器存儲的數據,這些數據可以是文本文件,html頁面,圖片等其他格式的文件資源。當你發出http請求後,web服務器就會根據http請求知道你想要請求的具體類型的資源,然後把對應的資源以http響應方式發送給你。

 

HTTP請求格式

客戶端連接上服務端後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求,HTTP的請求最常見的有兩種:GET方式和POST方式,但是不管是哪一種請求方式,一個完整的請求須包括幾下及部分:

  1. 請求行
  2. 請求頭
  3. 請求消息

一般來說,在請求頭可以有多個,且請求頭和請求消息中的內容都是可選的,請求頭和請求消息之間要用空行進行隔開。下面通過抓包的方式來看一下HTTP請求包的格式。

 

HTTP響應格式

服務器收到客戶端的HTTP請求後,會根據請求包中的信息把對應的web資源組裝到HTTP響應包中,並返回給客戶端。一個完整的HTTP響應包的內容應該包括以下幾部分:

  1. 響應行
  2. 響應頭
  3. 響應消息

同理,在響應頭中也是可以有多個,且響應頭和響應消息中的內容都是可選的,響應頭和響應消息之間要用空行進行隔開。下面通過抓包的方式來看一下HTTP響應包的格式。

 

5. http協議抓包

以訪問51cto網站爲例,ip爲59.110.244.199。

5.1HTTP請求包

在下圖中是wireshark抓取到的數據包,輸入“http”把http包過濾出來,75是一個HTTP請求包。

 

GET方式

從http請求信息中可以看出,75這個HTTP請求包是一個GET方式的HTTP請求包,其中第一行爲請求行,後面就是請求頭,這個GET方式沒有攜帶請求消息。 

 

 

POST方式

下圖是POST方式的HTTP請求包,第一行爲請求行,第二行往下就是請求頭,下面的HTML Form表單就是請求消息內容。

 

5.2 HTTP響應包

109是一個HTTP響應包,是針對75這個HTTP請求包進行響應的

 

6. HTTP狀態碼

HTTP協議對於每一個HTTP響應包都會設置一個狀態碼。

HTTP響應包的格式:HTTP版本號 狀態碼 原因敘述<CRLF>

舉例: HTTP/1.1 200 OK

 

狀態碼用於表示服務器對請求的各種不同處理結果和狀態,它是一個三位的十進制數。響應狀態碼分爲5類:

   狀態碼           含義

100~199         表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程

200~299         表示成功接收請求並已完成整個處理過程

300~399         爲完成請求,客戶需進一步細化請求。例如,請求的資源已經移動一個新地址

400~499         客戶端的請求有錯誤

500~599          服務器端出現錯誤

 

下面是一些常用的狀態碼:

200(正常)

表示一切正常,返回的是正常請求結果

302/307(臨時重定向)

指出被請求的文檔已被臨時移動到別處,此文檔的新的URL在Location響應頭中給出。

304(未修改)

表示客戶機緩存的版本是最新的,客戶機可以繼續使用它,無需到服務器請求。

404(找不到)

服務器上不存在客戶機所請求的資源。

500(服務器內部錯誤)

服務器端的程序發生錯誤,無法提供服務

503(服務器內部錯誤)

服務器暫時無法提供服務,需等待一段時間恢復

 

7. HTTP請求包的字段

7.1 請求行

請求行格式:請求方式 資源路徑 HTTP版本號 <CRLF>

舉例:GET / HTTP/1.1\r\n

請求方式主要有:GET,POST,HEAD,OPTION,DELETE,TRACE,PUT,比較常用的有GET和POST。如果沒有設置,瀏覽器一般默認以GET方式請求,例如在瀏覽器中直接輸入地址訪問,如果要設置POST方式可通過更改表單的提交方式實現。不管是GET和POST,都是用於向服務器請求某個web資源,區別主要在於傳遞數據方式不一樣。

 

這裏主要介紹GET和POST兩種請求方式:

GET方式,如果客戶端請求方式爲GET方式,那麼可以在請求的URL地址後以?的形式帶上交給服務器的數據,可以攜帶多個參數,每個參數之間以&進行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1 ,但是GET方式也有限制,在URL地址後附帶的參數的其數據容量通常不能超過1K。

 

POST方式,如果客戶端請求方式爲POST方式,說明客戶端在表單內填寫了內容,並提交,那麼可以在請求消息內容中向服務器發送數據,且傳遞的數據容量沒有限制。在前面我們通過wireshark軟件抓到一個POST方法的http包,其實就是我們在51cto頁面進行登錄輸入用戶名和密碼進行提交所發送的http包。

 

資源路徑:請求的資源在哪個路徑,上面的舉例中請求的資源路徑是 / 根目錄。

HTTP版本號:當前請求是使用啊HTTP協議哪一個版本,上面的舉例中的http請求的版本號是HTTP/1.1版本

<CRLF>:就是回車鍵\r\n

 

7.2 請求頭

請求頭又稱請求首部,是隻在請求報文中有意義的首部。 用於說明是誰或什麼在發送請求、 請求源自何處, 或者客戶端的喜好及能力。 服務器可以根據請求首部給出的客戶端信息,試着爲客戶端提供更好的響應,請求的首部的信息有以下一些:

Host:接收請求的服務器的主機名和端口號。

 

User-Agent:表示"用戶代理"的意思,用於將客戶端的操作系統和瀏覽器信息告知服務器,服務端可以根據這個字段,判斷並統計終端用戶的類型,一般很多安全軟件可以僞造這個字段,欺騙服務器。

 

Referer:表示從哪個鏈接跳轉到此頁面的,包含一個URL,當我們從一個頁面跳轉到另外一個頁面時一般會有Referer信息。

 

Origin:跟Referer類似,表示從哪個網站(域)跳轉過來的,相比Referer,更加安全,不會攜帶參數包括賬號密碼。

Cookie:Cookie是一種客戶端技術,用於記錄客戶端的身份信息,例如通過cookie可以登錄網站。也就是說,服務器會給每個用戶的數據以cokkile的形式寫入每個用戶的瀏覽器中,不同用戶的cookie也是不同的,當用戶通過各自的瀏覽器訪問服務器時就會帶着自己的數據,這樣服務器通過cookie區分不同的用戶,並把數據返回給不同的用戶。

Range:用於分塊請求實體內容,例如一個較大的文件,通過range多線程下載

x-forward-for:表示客戶端的IP地址,一般稱爲“XXF”頭,服務端通過這個頭可以知道客戶端的真實或代理IP

Accept:表示客戶端能夠接收哪些文件類型(MIME)

Accept-Charset:表示客戶端的瀏覽器能夠接受的字符集,常見的有UTF-8字符集

Accept-Encoding:表示客戶端的瀏覽器能夠進行解碼的數據編碼方式,比如gzip

Accept-Language:表示客戶端的瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。 可以在瀏覽器中進行設置。

DNT:Chrome瀏覽器提供的安全功能,用於解決流量追蹤問題,Do Not Track有幾個取值:1代表用戶不想被第三方網站追蹤,0代表用戶接受追蹤,一般設置爲1。

 

8. HTTP響應包的字段

8.1 響應頭

Set-Cookie:服務器通過此字段爲客戶端設置cookie信息,後續客戶端根據此cookie來進行請求

Connection:表示是否需要持久連接。如果服務器看到這裏的值爲“Keep -Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接 )

Server:表示Web服務器信息,爲了安全性,可以關閉或修改。例如:Server: nginx/1.4.6 (Ubuntu)或者Server: Apache

X-Powered-By:表示服務器的程序版本,爲了安全性,可以關閉或修改

Locatioin:服務器告知客戶端去哪裏訪問這個資源,一般用於重定向,配合狀態碼302使用

Refresh:服務器告知客戶端,定時刷新瀏覽器

 

9. 通用頭部字段

不管是構建請求報文還是響應報文,都可以使用通用字段,下面是一些比較重要的通用字段:

Connection:用於表示連接是否可持續,如果Connection是 keep-alive選項表示連接持續,如果是close選項則表示不持續。

Transfer-Encoding:表示輸出的內容長度不能確定,需要分塊處理,對於動態的內容或者在發送數據前不能判定長度的情況下,可以使用分塊的方法來傳送編碼,比如說直播傳輸的數據量比較大,也不能確定數據的大小;對於靜態的內容或者發送數據可以預判長度的情況下,可以使用content-length來標識

Cache-Control:用於控制緩存信息,no-cache表示防止緩存過期的網頁信息,要求獲取最新緩存,max-age=94608000表示服務器告訴客戶端,緩存這個信息的最長時間

Via:報文經過的代理服務器信息

Data:用於表示內容產生的時間

 

 

說明:關於HTTP請求包和HTTP響應包中的請求行和響應行,請求頭和響應頭中的比較常用的字段已經介紹完了,另外,大家在用抓包工具抓到的http包中可能會出現一些書上沒介紹過的字段,或者說不是HTTP標準中的字段,一般來說,這種字段是由瀏覽器廠商自行實現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章