http協議詳解

我希望真正想要http的讀者能夠理解這篇文章。

http的六個重點:

1.在客戶端服務器模型間的一種協議。實際上我們衆所周知的瀏覽器就是客戶端,服務端就是被不同公司擁有的雲服務器。例如Youtube,Facebook等。

2.HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。

在Internet中所有的傳輸都是通過TCP/IP進行的。HTTP協議作爲TCP/IP模型中應用層的協議也不例外。HTTP協議通常於TCP協議基礎上使用,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。

3.http是無狀態的協議。HTTP是不會爲了下一次連接而維護這次連接所傳輸的信息,這是爲了保證服務器內存。

4.http協議規定了狀態碼。

狀態碼由三位數字組成,第一個數字定義了響應的類別,它有五種可能的值:

1xx:指示信息,請求已接收,繼續處理

2xx:成功,請求已被成功接收、理解

3xx:重定向,要完成請求必須進行更進一步的操作

4xx:客戶端錯誤,請求有語法錯誤或請求無法實現

5xx:服務器端錯誤,服務器未能實現合法的請求

常見的狀態碼、狀態描述,主要有以下幾種:

200 OK:客戶端請求成功

400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解

401 Unauthorize:請求未經授權,這個狀態碼必須和 WWW Authenticate報頭域一起使用

403 Forbidden:服務器收到請求,但是拒絕提供服務

404 Not Found:請求資源不存在,例如輸入了錯誤的URL

500 Internal Server Error:服務器發生了不可預期的錯誤

503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

5.http規定了請求方法:

GET:請求獲取Request URI所標識的資源

POST:在Request URI所標識的資源後附加新的數據

HEAD:請求獲取由Request URI所標識的資源的響應消息報頭

PUT:請求服務器存儲一個資源,並用Request URI作爲其標識

DELETE:請求服務器刪除Request URI所標識的資源

TRACE:請求服務器回送收到的請求信息,主要用於測試或診斷

CONNECT:保留以備將來使用

OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和需求

6.httpheader。

HTTP消息報頭(header)包括普通報頭、請求報頭、響應報頭、實體報頭。每個報頭域的組成形式爲,名稱: 值。

  • 普通報頭中有少數報頭域用於所有的請求和響應消息,但並不用於被傳輸的實體,只用於傳輸的消息(如緩存控制、連接控制等)。
  • 請求報頭允許客戶端向服務器端傳遞請求的附件信息以及客戶端自身的消息(如UA頭、Accept等)。
  • 響應報頭允許服務器傳遞不能放在狀態行中的附加響應信息,以及關於服務器的信息和對Request URI所標識的資源進行下一步訪問的信息(如Location)。
  • 實體報頭定義了關於實體正文和請求所標識的資源的元信息,例如有無實體正文。

注意:報頭域的名稱不區分大小寫,報頭都是自解釋的。

一次http請求稱爲一個事務,分爲四步:

(1)客戶端與服務器建立連接。在瀏覽器中訪問某個網址,HTTP協議開始工作。

(2)建立連接後,客戶端發送一個請求給服務器。格式爲:前面是統一資源定位符(URL),中間是協議版本號,後面是MIME信息(包括請求修飾符、客戶機信息和可能的內容)。

(3)服務器收到請求後,返回對應的響應信息。格式爲:首先是一個狀態行(包括信息的協議版本號、狀態碼),然後是MIME信息(包括服務器信息、實體信息和可能的內容)。

(4)客戶端接收服務器返回的信息並呈現給用戶,然後斷開與服務器的連接。

如果以上過程中的某一步出錯,產生的錯誤信息將返回給客戶端。

http請求:包括請求行、消息報頭、請求正文。(Method:請求方法的類型 Request-URI:統一資源標識符 HTTP-Version:http版本 CRLF


http響應:狀態行,消息報頭,響應正文。(HTTP-Version:服務器中http協議的版本。 Status-Code:服務器返回的響應狀態碼。 Reason-Phrase:狀態碼的簡短描述 CRLF


常見的幾個重要的報頭域:

Host:指定了請求資源的主機和端口,必須表示請求URL的原始服務器和網關的位置。HTTP 1.1 請求必須包含主機頭域,否則服務器會以400狀態碼返回。

User-Agent:簡稱UA,用戶代理,指定了發出請求的用戶代理的信息。如果是瀏覽器客戶端,則主要包含瀏覽器的名稱、版本和所用的操作系統的內核。UA頭不僅僅是使用瀏覽器才存在,只要使用了基於HTTP協議的客戶端都會發送這個報頭域。UA頭是辨別客戶端所用設備(電腦、手機還是iPad等)的重要依據。

Accept:告訴瀏覽器,客戶端可以接收的文件格式。通常這個值在各種瀏覽器中都差不多,不過WAP瀏覽器所能接收的格式要少一些,這也是用來區分WAP和計算機瀏覽器的主要依據之一。但隨着WAP瀏覽器的升級,它已經和計算機瀏覽器越來越接近,因此這個判斷所起的作用也越來越弱。

Cookie:Cookie分兩種,一種是客戶端向服務器發送的,使用Cookie報頭域,用來標記一些信息;另一種是服務器發送給瀏覽器的,報頭爲Set Cookie。二者的主要區別是Cookie報頭的value裏可以有多個Cookie值,並且不需要顯示指定domain等。而Set Cookie報頭裏一條記錄只能有一個Cookie的值,需要指明domain、path等。

Cache-Control:緩存控制,指定請求或響應時應該遵循的緩存機制。在請求頭或響應頭中設置Cache Control並不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令包括no cache、no store、max age、max stale、min fresh、only if cached;響應消息中的緩存指令包括public、private、no cache、no store、no transform、must revalidate、proxy revalidate、max age。

Referer:允許客戶端指定請求URI的源資源地址,這可以允許服務器生成回退鏈表,可用來登錄、優化緩存等,也允許廢除的或錯誤的連接由於維護的目的被追蹤。如果請求的URI沒有自己的URI地址,Referer不能被髮送。如果指定的是部分URI地址,則此地址應該是一個相對地址。Referer通常是流量統計系統用來記錄來訪者地址的參數。通過Referer的值,可以得知當前請求是從哪個URL跳轉過來的,PHP中可以用$_SERVER['HTTP_REFERER']獲取當前請求頭中的Referer的值,藉此實現網站的防盜鏈。

Content-Length:內容的長度

Content-Type:內容的類型

Content-Range:資源內容的範圍。可以在每次請求中標記請求的資源範圍,在連接斷開後重連時,客戶端只請求該資源未下載的部分,而不是重新請求整個資源,實現斷點續傳。迅雷就是基於整個原理,使用多線程分段讀取網絡上的資源,最後再合併。

Accept-Encoding:指定所能接收的編碼方式。通常服務器會對返回的內容進行gzip壓縮後再輸出以減少流量,瀏覽器一般都支持對這種壓縮後的數據進行處理。但對於我們來說,如果不想接收到這些看似“亂碼”的數據,可以指定不接收任何服務器的壓縮處理,要求其原樣返回。

自定義報頭:在消息頭(header)中,也可以使用一些在 HTTP 1.1 正式規範裏沒有定義的頭字段,這些頭字段統稱爲自定義的HTTP頭或擴展頭。比如:Server字段,在PHP中,可通過 header 函數實現。

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