一、HTTP簡介
1.http協議介紹
- HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是因特網上應用最為廣泛的一種網路傳輸協議,所有的WWW檔案都必須遵守這個標準。
- HTTP是基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)
- HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖
- HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。
- HTTP預設的埠號為80,HTTPS的埠號為443。
2.http協議工作流程
一次HTTP操作稱為一個事務,其工作過程大概如下:
- 使用者在瀏覽器中鍵入需要訪問網頁的URL或者點選某個網頁中連結;
- 瀏覽器根據URL中的域名,通過DNS解析出目標網頁的IP地址;
瀏覽器請求這個頁面:http://hackr.ip/index.html
在這一步,需要域名系統DNS解析域名hackr.ip,得主機的IP地址 20X.189.105.112。
然後將上面結合本機自己的資訊,封裝成一個http請求資料包
複製程式碼
- 在HTTP開始工作前,客戶端首先會通過TCP/IP協議來和服務端建立連結(TCP三次握手)
- 建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和可內容。
- 伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。
- 一般情況下,一旦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 | 資源的最後修改時間 |
參考: