HTTP協議屬於TCP/IP中的應用層,用於客戶端與服務端之間的通訊,客戶端請求訪問文字或影像等資源,伺服器端則提供資源響應,HTTP協議中,必定是客戶端先發起請求,服務端在未收到請求之前不會進行響應。這一章主要針對HTTP/1.1版本進行講解,因為和HTTP/2.0有些區別。後面有空會對比這兩個版本的區別。
##1 HTTP在TCP/IP中的位置
找了張神圖,很清晰明瞭的標明瞭HTTP的應用層協議與其它層協議的關係。- 1.1 DNS:屬於應用層,域名解析系統,通過把域名轉換為IP地址,因為底層的網路層是通過IP來定址的,域名它不認識;
- 1.2 TCP協議:屬於傳輸層,負責端對端的連線,通過三次握手提供可靠性連線;
- 1.3 IP協議:屬於網路層,負責把上面要傳輸的資料從一臺主機打包帶到目標IP主機上;
##2 HTTP協議請求與響應頭 HTTP協議通過客戶端請求和服務端的響應來建立通訊,所以必須請求和響應的資訊必須得按照特定的套路來,不然雙方就不認識,比如說,給日本人打電話先你得先確認好用哪種語言進行溝通,這個舉例有些蒼白,但是Who Care! ####2.1 請求報文 客戶端請求的格式我們稱之為請求報文,由請求的方法,URI,HTTP協議的版本號,請求的欄位(可選),還有請求的內容(可選)構成。
請求方法、請求URI和協議版本號構成請求行,請求首部是可選的,包括請求首部,通用首部,實體首部,報文主體與報文首部之間必須有空行,因為服務端是通過空行來判斷報文主體的。下面講一下這些各個組成。
- 2.1.1 請求方法:首先,你客戶端需要服務端提供服務,你首先要讓伺服器知道你要幹嘛,是洗腳還是按摩或者一條龍,不同的請求意圖價位可是不一樣的,伺服器應對方式也會有所區別。 2.1.1.1 GET方法:獲取資源。 2.1.1.2 POST方法:獲取資源的時候帶上傳輸實體,GET也可以,但GET一般不這樣用。 2.1.1.3 PUT方法:傳輸實體檔案。一般不用,因為不安全,方法自身沒有安全驗證,導致誰都可以 給你的伺服器傳檔案。 2.1.1.4 HEAD方法:和GET一樣獲取資源,但是隻拿響應頭,服務端不返回報文主體; 2.1.1.5 DELETE: 刪除指定的資源,作用和PUT相反; 2.1.1.6 OPTIONS: 獲取服務端針對請求的URI支援的方法; 2.1.1.7 TRACE: 追蹤路徑,追蹤請求經過的代理伺服器,可以用來確認請求經過代理時進行的操作; 2.1.1.8 CONNECT:用隧道協議連線代理,用隧道協議進行通訊。
- 2.1.2 URI(統一資源識別符號 Uniform Resource Identifier) URI用於標識資源,而URL(統一資源定位符)是用於標識網際網路資源,URL是狹義的概念,URI是廣義的概念,URI包含URL,在RFC文件中,已經不再使用URL,轉用URI,絕對URI的格式為
- 2.1.3 客戶端使用的HTTP協議版本,顧名思義,HTTP協議的版本號 HTTP/0.9(出現的時候沒有作為標準),HTTP/1.0(開始作為標準), HTTP/1.1(目前的普及版本),HTTP/2.0(最新版本,正在快速普及的版本)。
- 2.1.4 請求首部欄位 需要服務端處理的請求內容或屬性,可以新增一些附加的要求,這一塊的欄位超級多,後面再講。
- 2.1.5 內容實體 客戶端要傳送資料內容,比如用POST請求附加的檔案和欄位就是加在這裡。
###2.2 響應報文 收到客戶端的大佬請求後,服務端會返回對應的請求資訊,即響應報文,響應報文主要包括伺服器端的HTTP協議版本、狀態碼、表示狀態碼的原因短語,這三者組成狀態行,除此之外還有響應首部欄位,以及響應主體,整體結構除了狀態行,其它部分結構和請求報文類似。
報文主體和首部欄位之間有一個必不可少的空行。
這裡也大概講一下響應報文各部分資訊:- 2.2.1 協議版本 伺服器端使用的HTTP協議版本號
- 2.2.2 狀態碼和原因短語:這兩個是孿生的,狀態碼會伴隨著描述狀態碼的原因短語,我們客戶端就是通過狀態碼來判斷請求是成功了還是失敗了,狀態碼以3位數字組成,主要分為下面幾類 2.2.2.1 1xx 資訊性狀態碼,表示請求正在處理中 2.2.2.2 2xx 請求成功狀態碼,請求正常處理完成,常用的有200,204,206 2.2.2.3 3xx 重定向狀態碼,需要進行一些附加的操作才能完成請求,常用的有301,302,303,307 2.2.2.4 4xx 客戶端錯誤狀態碼,表示客戶端的請求存在錯誤,常用的有400,401,403,404 2.2.2.5 5xx 伺服器端錯誤狀態碼,表示伺服器端處理髮生錯誤,常用的有500,503 大概碼一下這些常用的,以後翻起來也方便不是。
狀態碼 | 原因短語 | 原因短語 |
---|---|---|
200 | OK | 成功處理客戶端發來的請求 |
204 | No Content | 成功處理請求,但不返回主體內容,通常用於客戶端向伺服器傳送資訊而伺服器無需返回新內容的情況下使用 |
206 | Partial Content | 客戶端進行範圍請求,即GET方法要求獲取資源的部分內容 |
301 | Moved Permanently | 永久重定向,所請求的資源已經更換URI了 |
302 | Found | 臨時重定向,所請求的資源暫時更換成新的URI |
303 | See Other | 資源存在另一個URI,明確要求客戶端採用GET方法獲取資源 |
304 | Not Modified | 表示客戶端帶有附加條件請求資源時,伺服器端已找到資源,但是不滿足客戶端的附加條件,3xx裡的奇葩,因為跟重定向沒關係 |
307 | Temporary Redirect | 臨時重定向,和302有一樣的意思,滿足特定瀏覽器需求 |
400 | Bad Request | 請求報文中存在語法錯誤 |
401 | Unauthorized | 表示請求的內容需要有身份認證資訊,嗯,大概就是你許可權還不夠的意思 |
403 | Forbidden | 伺服器拒絕服務,沒有為什麼,就是拒絕 |
404 | Not Found | 伺服器找不到對應請求的資源,在伺服器想委婉拒絕你的時候也會用這個藉口 |
500 | Internal Server Error | 什麼都不用說了,伺服器端出現bug了 |
503 | Service Unavailable | 還請求個蛋啊,伺服器已經掛了 |
請求報文還有響應報文的首部欄位還沒有細講,因為這些欄位實在太多了,看緣分,後面再碼一下,就當做掃盲了。