1.HTTP協議簡介
1.HTTP協議介紹
1.HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是因特網上應用最為廣泛的一種網路傳輸協議,所有的WWW檔案都必須遵守這個標準。
2.HTTP是基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)
2.HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。
3.HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。4.HTTP預設的埠號為80,HTTPS的埠號為443。
HTTP協議工作流程
一次HTTP操作稱為一個事務,其工作過程大概如下:
1.使用者在瀏覽器中鍵入需要訪問網頁的URL或者點選某個網頁中連結;
2.瀏覽器根據URL中的域名,通過DNS解析出目標網頁的IP地址;
eg:
a.瀏覽器請求這個頁面:hackr.ip/index.html
b.在這一步,需要域名系統DNS解析域名hackr.ip,得主機的IP地址 20X.189.105.112。
c.然後將上面結合本機自己的資訊,封裝成一個http請求資料包
3.在HTTP開始工作前,客戶端首先會通過TCP/IP協議來和服務端建立連結(TCP三次握手)
4.建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和內容。
5.伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。
6.一般情況下,一旦Web伺服器向瀏覽器傳送了請求資料,它就要關閉TCP連線,然而如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼:Connection:keep-alive,TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。
2.1 短連線
短連線的操作步驟是:建立連線——資料傳輸——關閉連線...建立連線——資料傳輸——關閉連線
如果客戶請求頻繁,將在TCP的建立和關閉操作上浪費較多時間和頻寬。
2.2 長連結
示意:長連結,指在一個連線上可以連續傳送多個資料包,在連線保持期間,如果沒有資料包傳送,需要雙方發鏈路檢測包。
長連結操作步驟:建立連線——資料傳輸...(保持連線)...資料傳輸——關閉連線
長連線可以省去較多的TCP建立和關閉的操作,減少浪費,節約時間
長連結分為 without pipelining 和 with pipelining,下圖中是without
pipelining,客戶端只在收到前一個請求的響應後,才發出新的請求
2.3 管線化
下圖是with pipelining,每次建立連結後無需等待請求回來就可以傳送下一個請求
3. Http請求報文
客戶端傳送一個HTTP請求到伺服器的請求訊息包括以下格式:
請求行(request line)、請求頭部(header)、請求體組成,下圖給出了請求報文的一般格式。
請求行:
方法:
GET 獲取資源
POST 向伺服器端傳送資料,傳輸實體主體
PUT 傳輸檔案
HEAD 獲取報文首部
DELETE 刪除檔案
OPTIONS 詢問支援的方法
TRACE 追蹤路徑
協議/版本號
URL
複製程式碼
請求頭:
通用首部(General Header)
請求首部(Request Header)
響應首部(Response Header)
實體首部(Entity Header Fields)
複製程式碼
請求體
請求報文拆解:
3.1 get請求
3.2 post請求
4. Http響應報文
HTTP響應組成:響應行、響應頭、響應體。
響應行
(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態訊息為(ok)
複製程式碼
響應頭
Date:生成響應的日期和時間;
Content-Type:指定了MIME型別的HTML(text/html),編碼型別是ISO-8859-1
複製程式碼
響應體
響應報文拆解:
5. Http狀態碼
類別 原因
1XX Informational(資訊性狀態碼)
2XX Success(成功狀態碼)
3XX Redirection(重定向)
4XX Client Error(客戶端錯誤狀態碼)
5XX Server Error(伺服器錯誤狀態嗎)
5.1 2XX 成功
200(OK 客戶端發過來的資料被正常處理
204(Not Content 正常響應,沒有實體
206(Partial Content 範圍請求,返回部分資料,響應報文中由Content-Range指定實體內容
5.2 3XX 重定向
301(Moved Permanently) 永久重定向
302(Found) 臨時重定向,規範要求,方法名不變,但是都會改變
303(See Other) 和302類似,但必須用GET方法
304(Not Modified) 狀態未改變,
配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307(Temporary Redirect) 臨時重定向,不該改變請求方法
5.3 4XX 客戶端錯誤
-
400(Bad Request) 請求報文語法錯誤
-
401 (unauthorized) 需要認證
-
403(Forbidden) 伺服器拒絕訪問對應的資源
-
404(Not Found) 伺服器上無法找到資源
5.4 5XX 伺服器端錯誤
-
500(Internal Server Error)伺服器故障
-
503(Service Unavailable) 伺服器處於超負載或正在停機維護
6. 首部
6.1 通用首部欄位
首部欄位名 說明
-
Cache-Control 控制快取行為
-
Connection 連結的管理
-
Date 報文日期
-
Pragma 報文指令
-
Trailer 報文尾部的首部
-
Trasfer-Encoding 指定報文主體的傳輸編碼方式
-
Upgrade 升級為其他協議
-
Via 代理伺服器資訊
-
Warning 錯誤通知
6.2 請求首部欄位
首部欄位名 說明
Accept 使用者代理可處理的媒體型別
Accept-Charset 優先的字符集
Accept-Encoding 優先的編碼
Accept-Langulage 優先的語言
Authorization Web認證資訊
Expect 期待伺服器的特定行為
From 使用者的電子郵箱地址
Host 請求資源所在的伺服器
If-Match 比較實體標記
If-Modified-Since 比較資源的更新時間
If-None-Match 比較實體標記
If-Range 資源未更新時傳送實體Byte的範圍請求
If-Unmodified-Since 比較資源的更新時間(和If-Modified-Since相反)
Max-Forwards 最大傳輸跳數
Proxy-Authorization 代理伺服器需要客戶端認證
Range 實體位元組範圍請求
Referer 請求中的URI的原始獲取方
TE 傳輸編碼的優先順序
User-Agent HTTP客戶端程式的資訊
6.3 響應首部欄位
首部欄位名 說明
Accept-Ranges 是否接受位元組範圍
Age 資源的建立時間
ETag 資源的匹配資訊
Location 客戶端重定向至指定的URI
Proxy-Authenticate 代理伺服器對客戶端的認證資訊
Retry-After 再次傳送請求的時機
Server 伺服器的資訊
Vary 代理伺服器快取的管理資訊
www-Authenticate 伺服器對客戶端的認證
6.4 實體首部欄位
首部欄位名 說明
Allow 資源可支援的HTTP方法
Content-Encoding 實體的編碼方式
Content-Language 實體的自然語言
Content-Length 實體的內容大小(位元組為單位)
Content-Location 替代對應資源的URI
Content-MD5 實體的報文摘要
Content-Range 實體的位置範圍
Content-Type 實體主體的媒體型別
Expires 實體過期時間
Last-Modified 資源的最後修改時間
7、HTTP中的重定向和請求轉發的區別
解釋一 一句話,轉發是伺服器行為,重定向是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程:
轉發過程:客戶瀏覽器傳送http請求----》web伺服器接受此請求--》呼叫內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源傳送給客戶;在這裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
重定向過程:客戶瀏覽器傳送http請求----》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再傳送一個新的http請求,請求url是新的location地址----》伺服器根據此請求尋找資源併傳送給客戶。在這裡location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。
解釋二
重定向,其實是兩次request, 第一次,客戶端request A,伺服器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。
請求轉發是伺服器內部把對一個request/response的處理權,移交給另外一個 對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸的資訊不會丟失。
解釋三 假設你去辦理某個執照,
重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然後,你就從A退了出來,自己乘車去了B局。
轉發:你先去了A局,A局看了以後,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到後面辦公室聯絡了B的人,讓他們辦好後,送了過來。