HTTP 協議詳解
HTTP(HyperText Transfer Protocol)超文本傳輸協議,其最初的設計目的是為了提供一種發布和接收HTML頁面的方法,
HTTP是一個客戶端(用戶)和服務端之間請求和應答的標準,
- 用戶通過
Web瀏覽器或其它軟體工具,向指定服務器的指定埠(默認埠為80)發起一個HTTP請求,
請求獲取該服務器上存盤的一些資源,比如:HTML檔案、圖片、檔案 等; HTTP服務器則在指定埠(默認埠為80)監聽客戶端的請求,
一旦收到客戶端請求,服務器會向客戶端回傳一個狀態,比如HTTP/1.1 200 OK;并回傳請求內容,如檔案、圖片等;或對應請求的錯誤資訊,
一、HTTP請求
HTTP請求由三部分組成,分別是:請求行、request-header、request-body
1.1、請求行
請求行格式:Method Request-URI HTTP-Version CRLF
請求行舉例:GET /form.html HTTP/1.1 /r/n
Method
HTTP/1.1協議中共定義了八種Method方法來以不同方式操作指定的資源:
| Method | 方法說明 |
|---|---|
| GET | 請求獲取由Request-URI所標識的資源 |
| POST | 向指定資源提交資料,請求服務器進行處理(例如提交表單或者上傳檔案) |
| HEAD | 請求獲取由Request-URI所標識的資源的回應訊息報頭 |
| PUT | 向指定資源位置上傳其最新內容 |
| DELETE | 請求服務器洗掉由Request-URI所標識的資源 |
| TRACE | 請求服務器回送收到的請求資訊,主要用語測驗或診斷 |
| OPTIONS | 這個方法可使服務器傳回該資源所支持的所有HTTP請求方法,向Web服務器發送OPTIONS請求,可以測驗服務器功能是否正常運作 |
| CONNECT | 保留將來使用 |
Request-URI 統一資源標識,例:https://www.baidu.com/
HTTP-Version HTTP的版本,例:HTTP/1.1
CRLF 回車換行,例:/r/n
1.2、request-header
request-header舉例:
mob-token: iammobtokeniammobtokeniammobtoken
User-Agent: Demo_Android
Cookie:
client_i=android#v1.0.0#deviceid#android6.0.1;
[email protected];
client_urstoken=iamtokeniamtokeniamtoken
Connection: Keep-Alive
Host: demo.com
request-header關鍵詞含義如下表所示:
| request-header | 含義說明 | 舉例 |
|---|---|---|
| User-Agent | User-Agent的內容包含發出請求的用戶資訊 | User-Agent: Mozilla/5.0 (Linux; X11) |
| Host | 指定請求的服務器的域名和埠號 | Host: www.zcmhi.com |
| Cookie | HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器, | Cookie: $Version=1; Skin=new; |
| Content-Length | 請求的內容長度 | Content-Length: 348 |
| Content-Type | 請求的與物體對應的MIME資訊 | Content-Type: application/x-www-form-urlencoded |
| Accept | 指定客戶端能夠接收的內容型別 | Accept: text/plain, text/html |
| Accept-Charset | 瀏覽器可以接受的字符編碼集, | Accept-Charset: iso-8859-5 |
| Accept-Encoding | 指定瀏覽器可以支持的web服務器回傳內容壓縮編碼型別, | Accept-Encoding: compress, gzip |
| Accept-Language | 瀏覽器可接受的語言 | Accept-Language: en,zh |
| Accept-Ranges | 可以請求網頁物體的一個或者多個子范圍欄位 | Accept-Ranges: bytes |
| Authorization | HTTP授權的授權證書 | Authorization: BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Connection | 表示是否需要持久連接,(HTTP 1.1默認進行持久連接) | Connection: close |
| Date | 請求發送的日期和時間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
| From | 發出請求的用戶的Email | From: [email protected] |
| Expect | 請求的特定的服務器行為 | Expect: 100-continue |
| Cache-Control | 指定請求和回應遵循的快取機制 | Cache-Control: no-cache |
| If-Match | 只有請求內容與物體相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
| If-Modified-Since | 如果請求的部分在指定時間之后被修改則請求成功,未被修改則回傳304代碼 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
| If-None-Match | 如果內容未改變回傳304代碼,引數為服務器先前發送的Etag,與服務器回應的Etag比較判斷是否改變 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
| If-Range | 如果物體未改變,服務器發送客戶端丟失的部分,否則發送整個物體,引數也為Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
| If-Unmodified-Since | 只在物體在指定時間之后未被修改才請求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
| Max-Forwards | 限制資訊通過代理和網關傳送的時間 | Max-Forwards: 10 |
| Pragma | 用來包含實作特定的指令 | Pragma: no-cache |
| Proxy-Authorization | 連接到代理的授權證書 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Range | 只請求物體的一部分,指定范圍 | Range: bytes=500-999 |
| Referer | 先前網頁的地址,當前請求網頁緊隨其后,即來路 | Referer: http://www.zcmhi.com/archives/71.html |
| TE | 客戶端愿意接受的傳輸編碼,并通知服務器接受接受尾加頭資訊 | TE: trailers,deflate;q=0.5 |
| Upgrade | 向服務器指定某種傳輸協議以便服務器進行轉換(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
| Via | 通知中間網關或代理服務器地址,通信協議 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
| Warning | 關于訊息物體的警告資訊 | Warn: 199 Miscellaneous warning |
二、HTTP回應
服務端處理客戶端的請求后,會回傳一個HTTP回應訊息,與HTTP請求類似,HTTP回應也是三個部分組成,分別是:
狀態行、response-header、response-body,
2.1、狀態行
狀態行格式: HTTP-Version Status-Code Reason-Phrase CRLF
狀態行舉例: HTTP/1.1 200 OK /r/n
Status-Code狀態碼:
狀態代碼由3位數字組成,表示請求是否被理解或被滿足,
狀態代碼的第一個數字定義了回應的類別,后面兩位沒有具體的分類,
第一個數字有五種可能的取值:
| 狀態碼 | 含義 |
|---|---|
| 1xx: | 指示資訊—表示請求已接收,繼續處理 |
| 2xx | 成功—表示請求已經被成功接收、理解、接受 |
| 3xx | 重定向—要完成請求必須進行更進一步的操作 |
| 4xx | 客戶端錯誤—請求有語法錯誤或請求無法實作 |
| 5xx | 服務器端錯誤—服務器未能實作合法的請求 |
狀態碼舉例:
| 狀態碼舉例 | 狀態描述 | 詳情說明 |
|---|---|---|
| 200 | OK | 客戶端請求成功 |
| 400 | Bad Request | 由于客戶端請求有語法錯誤,不能被服務器所理解, |
| 401 | Unauthonzed | 請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 |
| 403 | Forbidden | 服務器收到請求,但是拒絕提供服務,服務器通常會在回應正文中給出不提供服務的原因 |
| 404 | Not Found | 請求的資源不存在,例如,輸入了錯誤的URL |
| 500 | Internal Server Error | 服務器發生不可預期的錯誤,導致無法完成客戶端的請求 |
| 503 | Service Unavailable | 服務器當前不能夠處理客戶端的請求,在一段時間之后,服務器可能會恢復正常 |
2.2、response-header
response-header舉例:
Server: xiaxl
Date: Thu, 29 Aug 2019 06:10:55 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: XIAXL=xiaxl; Domain=demo.com; Path=/
response-header關鍵詞含義如下表所示:
| response-header | 解釋 | 示例 |
|---|---|---|
| Content-Encoding | web服務器支持的回傳內容壓縮編碼型別, | Content-Encoding: gzip |
| Content-Language | 回應體的語言 | Content-Language: en,zh |
| Content-Length | 回應體的長度 | Content-Length: 348 |
| Content-Location | 請求資源可替代的備用的另一地址 | Content-Location: /index.htm |
| Content-MD5 | 回傳資源的MD5校驗值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
| Content-Range | 在整個回傳體中本部分的位元組位置 | Content-Range: bytes 21010-47021/47022 |
| Content-Type | 回傳內容的MIME型別 | Content-Type: text/html; charset=utf-8 |
| Accept-Ranges | 表明服務器是否支持指定范圍請求及哪種型別的分段請求 | Accept-Ranges: bytes |
| Age | 從原始服務器到代理快取形成的估算時間(以秒計,非負) | Age: 12 |
| Allow | 對某網路資源的有效的請求行為,不允許則回傳405 | Allow: GET, HEAD |
| Date | 原始服務器訊息發出的時間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
| Cache-Control | 告訴所有的快取機制是否可以快取及哪種型別 | Cache-Control: no-cache |
| ETag | 請求變數的物體標簽的當前值 | ETag: “737060cd8c284d8af7ad3082f209582d” |
| Expires | 回應過期的日期和時間 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
| Last-Modified | 請求資源的最后修改時間 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
| Location | 用來重定向接收方到非請求URL的位置來完成請求或標識新的資源 | Location: http://www.zcmhi.com/archives/94.html |
| Pragma | 包括實作特定的指令,它可應用到回應鏈上的任何接收方 | Pragma: no-cache |
| Proxy-Authenticate | 它指出認證方案和可應用到代理的該URL上的引數 | Proxy-Authenticate: Basic |
| refresh | 應用于重定向或一個新的資源被創造,在5秒之后重定向(由網景提出,被大部分瀏覽器支持) | Refresh: 5; url=http://www.zcmhi.com/archives/94.html |
| Retry-After | 如果物體暫時不可取,通知客戶端在指定時間之后再次嘗試 | Retry-After: 120 |
| Server | web服務器軟體名稱 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
| Set-Cookie | 設定Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
| Trailer | 指出頭域在分塊傳輸編碼的尾部存在 | Trailer: Max-Forwards |
| Transfer-Encoding | 檔案傳輸編碼 | Transfer-Encoding:chunked |
| Vary | 告訴下游代理是使用快取回應還是從原始服務器請求 | Vary: * |
| Via | 告知代理客戶端回應是通過哪里發送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
| Warning | 警告物體可能存在的問題 | Warning: 199 Miscellaneous warning |
| WWW-Authenticate | 表明客戶端請求物體應該使用的授權方案 | WWW-Authenticate: Basic |
三、HTTP 舉例
這里舉兩個例子:
- 一個Http get 請求和回應;
- 一個Http post 請求和回應;
3.1、Http get 舉例
http get 請求抓包資料如下:
GET /demo/getData.do?deviceId=123&userId=xiaxl HTTP/1.1 // 請求行
mob-token: iammobtokeniammobtokeniammobtoken // request-header
User-Agent: Demo_Android
Cookie:
client_i=android#v1.0.0#deviceid#android6.0.1;
[email protected];
client_urstoken=iamtokeniamtokeniamtoken
Connection: Keep-Alive
Host: demo.com
http get 回應抓包資料如下:
HTTP/1.1 200 OK // 回應 狀態行
Server: xiaxl // response-header
Date: Thu, 29 Aug 2019 06:10:55 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: XIAXL=xiaxl; Domain=demo.com; Path=/
{"code":200} // response-body
3.2、Http post 舉例
Http post請求抓包資料如下所示:
POST /demo/postData.do?sign=abc HTTP/1.1 // 請求行
mob-token: iammobtokeniammobtokeniammobtoken // request-header
User-Agent: Demo_Android
Cookie:
client_i=android#v1.0.0#deviceid#android6.0.1;
[email protected];
client_urstoken=iamtokeniamtokeniamtoken
Content-Length: 371
Content-Type:
application/x-www-form-urlencoded;
charset=utf-8
Connection: Keep-Alive
Host: demo.com
[{"deviceId":"123","userId":"xiaxl"}] // request-body
http post 回應抓包資料如下:
HTTP/1.1 200 OK // 回應 狀態行
Server: xiaxueliang // response-header
Date: Thu, 29 Aug 2019 06:09:41 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: XIAXL=xiaxl; Domain=demo.com; Path=/
{"code":200} // response-body
3.3、Http Post 檔案上傳
Http post檔案上傳請求,抓包資料如下所示:
POST /demo/photoUpload.do HTTP/1.1 // 請求行
mob-token: iammobtokeniammobtokeniammobtoken // request-header
User-Agent: Demo_Android
Cookie:
client_i=android#v1.0.0#deviceid#android6.0.1;
[email protected];
client_urstoken=iamtokeniamtokeniamtoken
Content-Length: 12345
Content-Type:
multipart/form-data;
boundary=f9817fcb-6ad7-4445-9f7b-2ab30578c4ac
Connection: Keep-Alive
Host: demo.com
// body 檔案資料 省略... // request-body
Http post檔案上傳, 回應抓包資料如下:
HTTP/1.1 200 OK // 回應 狀態行
Server: xiaxl // response-header
Date: Thu, 29 Aug 2019 06:10:55 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: XIAXL=xiaxl; Domain=demo.com; Path=/
{"code":200} // response-body
四、部分知名網站Reponse Header中包含 客戶端IP
發現部分知名網站Reponse Header中包含 客戶端IP
查看其Response Header資料
五、參考:
維基百科:超文本傳輸協議
https://zh.wikipedia.org/wiki/超文本傳輸協議
HTTP請求和MIME介紹
https://www.cnblogs.com/Dev0ps/p/8074972.html
HTTP Header 詳解
https://kb.cnblogs.com/page/92320/
========== THE END ==========

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/30957.html
標籤:其他
上一篇:只有努力了,你才能成為想要的樣子
