四 請(qǐng)求頭和響應(yīng)頭
還記得我們前面提到的上網(wǎng)流程吧?
1 DNS解析,獲取A記錄,找到網(wǎng)站對(duì)應(yīng)的IP地址
2 三次握手
三次握手之前服務(wù)器處在listen狀態(tài) 建立完三次握手之后服務(wù)器處于established狀態(tài)可以傳輸數(shù)據(jù)
Established階段的工作
1) 客戶端發(fā)起請(qǐng)求,告訴服務(wù)器要什么
http://www.sina.com.cn/meizi.jpg
2) 服務(wù)器接收請(qǐng)求:讀取請(qǐng)求信息內(nèi)容
3) 服務(wù)器處理請(qǐng)求:將請(qǐng)求交給文件系統(tǒng),讓文件系統(tǒng)去找文件
4) 服務(wù)器響應(yīng)請(qǐng)求:將數(shù)據(jù)交給客戶端
a) 要不要壓縮?(取決于雙方是否支持壓縮)
b) 是否開了長(zhǎng)連接(長(zhǎng)連接:在服務(wù)器和客戶端建立連接之后,不會(huì)立即斷開,會(huì)等待一定時(shí)間,在此時(shí)間內(nèi)如果再有數(shù)據(jù)包發(fā)送就不需要進(jìn)行三次握手,可直接發(fā)送,對(duì)應(yīng)的就是短連接)
3 四次斷開
在這個(gè)流程中接收請(qǐng)求和處理請(qǐng)求是在服務(wù)器內(nèi)部完成的,所以呢,我們來(lái)看一下發(fā)起請(qǐng)求和響應(yīng)請(qǐng)求
環(huán)境準(zhǔn)備
為Apache生成一個(gè)web頁(yè)面
echo "hello" > /var/www/html/index.html
systemctl restart httpd
訪問(wèn)測(cè)試
安裝wireshark(圖形界面查看數(shù)據(jù)包內(nèi)容的工具)
[root@manage01 ~]# dnf install wireshark* -y
抓包
[root@manage01 ~]# tcpdump -nn -vvv -s 1500 -w /tmp/httpd host 172.16.121.141 and port 80 -i ens37
切換到另一臺(tái)主機(jī)訪問(wèn)
curl 172.16.121.141
使用apache主機(jī)查看抓到的數(shù)據(jù)包
[root@manage01 ~]# wireshark /tmp/httpd
wireshark的幾面分為三部分
第一部分是數(shù)據(jù)包列表
No.: 序號(hào)
Time: 時(shí)間
Source: 源地址
Destination: 目標(biāo)地址
Protocol:協(xié)議
Length:長(zhǎng)度
info:簡(jiǎn)介
第二部分為數(shù)據(jù)包的詳細(xì)信息
Frame&Ethernet 數(shù)據(jù)鏈路層數(shù)據(jù),主要是mac地址和幀
Internet protocol 網(wǎng)絡(luò)層信息 邏輯鏈路尋址,主要是IP地址
Transmssion Control 傳輸控制,可以查看應(yīng)用層信息
第三部分為16進(jìn)制數(shù)據(jù)
在wireshark中如果是確認(rèn)包,在選中的時(shí)候前面會(huì)有√的標(biāo)記,如果是請(qǐng)求包會(huì)有→的標(biāo)記,如果是響應(yīng)包會(huì)有←的標(biāo)記
我們先看一下第四個(gè)包,請(qǐng)求頭
Hypertext Transfer Protocol
#HTTP協(xié)議
GET / HTTP/1.1rn #請(qǐng)求信息
[Expert Info (Chat/Sequence): GET / HTTP/1.1rn]#專家信息
[GET / HTTP/1.1rn]
#獲取根下的數(shù)據(jù),http協(xié)議的版本是1.1 rn=換行符
[Severity level: Chat]
#嚴(yán)重級(jí)別 chat note warn error
[Group: Sequence]
#數(shù)據(jù)包屬于哪個(gè)組(類)
Checksum:校驗(yàn)和類
Sequence:序列號(hào)類
Response:響應(yīng)類
Request:請(qǐng)求類
Undecoded:不能識(shí)別類
Reassemble:重組問(wèn)題類
Malformed:畸形數(shù)據(jù)包類
Debug:不應(yīng)該出現(xiàn)匹配此類型的數(shù)據(jù)包
Request Method: GET
#請(qǐng)求的方法是get,獲取數(shù)據(jù),獲取的數(shù)據(jù)通過(guò)Request URI指定
get 獲取指定的資源
post 向指定資源提交數(shù)據(jù)進(jìn)行處理,有可能導(dǎo)致新的資源的建立或原有資源的修改
put 向指定資源位置上上傳其最新內(nèi)容(從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定資源的內(nèi)容)
delete 刪除指定的資源
opions 返回服務(wù)器針對(duì)特定資源所支持的HTML請(qǐng)求方法 或web服務(wù)器發(fā)送測(cè)試服務(wù)器功能(允許客戶端查看服務(wù)器性能)
Trace 回顯服務(wù)器收到的請(qǐng)求,用于測(cè)試和診斷
Connect 將服務(wù)器作為代理,讓服務(wù)器代替用戶去訪問(wèn)其他網(wǎng)頁(yè),之后將數(shù)據(jù)返回給用戶。
Head 與get請(qǐng)求類似,返回的響應(yīng)中沒(méi)有具體內(nèi)容,用于獲取報(bào)頭
Request URI: /
#請(qǐng)求的資源信息
Request Version: HTTP/1.1
#請(qǐng)求的版本
Host: 172.16.121.141rn
#請(qǐng)求的主機(jī)信息
User-Agent: curl/7.64.1rn
#客戶端瀏覽器和版本
Accept: */*rn
rn
#客戶端支持的內(nèi)容類型,服務(wù)器會(huì)根據(jù)此內(nèi)容返回信息
內(nèi)容類型主要指的是文本類,視頻,音頻,圖片等
Accept:text/html,Application/xhtml+xm… #接受的數(shù)據(jù)類型
Accept-Language:en-US,en;q=0.5 #語(yǔ)言環(huán)境
Accept-Encoding:gzip, deflate #是否支持壓縮,及類型
Connection:keep-alive #是否支持長(zhǎng)連接
Upgrade-Insecure-Requests:1 #客戶端優(yōu)先選擇加密及帶有身份驗(yàn)證的響應(yīng)
If-Modified-Since: Wed, 25 Mar 2020 12:18:04 GMT
#把瀏覽器端緩存頁(yè)面的最后修改時(shí)間一起發(fā)到服務(wù)器去,服務(wù)器會(huì)把這個(gè)時(shí)間與服務(wù)器上實(shí)際文件的最后修改時(shí)間進(jìn)行比較。如果時(shí)間一致,那么返回HTTP狀態(tài)碼304(不返回文件內(nèi)容),客戶端接到之后,就直接把本地緩存文件顯示到瀏覽器中。如果時(shí)間不一致,就返回HTTP狀態(tài)碼200和新的文件內(nèi)容,客戶端接到之后,會(huì)丟棄舊文件,把新文件緩存起來(lái),并顯示到瀏覽器中。(如果客戶端是第一次訪問(wèn),不會(huì)出現(xiàn)此字段,因?yàn)榭蛻舳藳](méi)有相關(guān)緩存數(shù)據(jù))
If-None-Match: "5-5a1acdc3a6d9e" #驗(yàn)證標(biāo)簽,用來(lái)幫助控制緩存驗(yàn)證
[Full request URI: http://172.16.121.141/]
#完整的請(qǐng)求信息
[HTTP request 1/1]
#http請(qǐng)求進(jìn)度
[Response in frame: 6]
#響應(yīng)幀是第6幀
[Next request in frame:8]
#下一個(gè)請(qǐng)求幀
請(qǐng)求頭我們就看完了,接下來(lái)就是一個(gè)應(yīng)答包
這個(gè)應(yīng)答包的作用就是服務(wù)器告訴客戶端:“你的請(qǐng)求我收到了,等著吧,我給你找數(shù)據(jù)”,如果客戶端收不到這個(gè)應(yīng)答吧,就會(huì)再次發(fā)起請(qǐng)求
然后第六個(gè)就是響應(yīng)包,來(lái)看下響應(yīng)包當(dāng)中的響應(yīng)頭
Hypertext Transfer Protocol
HTTP/1.1 200 OKrn
#響應(yīng)代碼
[Expert Info (Chat/Sequence): HTTP/1.1 200 OKrn]
[HTTP/1.1 200 OKrn]
[Severity level: Chat]
[Group: Sequence]
Response Version: HTTP/1.1
#響應(yīng)版本
Status Code: 200
#響應(yīng)代碼
[Status Code Description: OK]
#狀態(tài)代碼介紹
Response Phrase: OK
#響應(yīng)短語(yǔ)
Date: Wed, 25 Mar 2020 02:37:05 GMTrn
#響應(yīng)時(shí)間
Server: Apache/2.4.37 (centos)rn
#服務(wù)器版本
Last-Modified: Wed, 25 Mar 2020 02:33:30 GMTrn
#服務(wù)器認(rèn)定的資源做出修改的日期及時(shí)間。 它通常被用作判斷接收到的或者存儲(chǔ)的資源是否一致。由于精確度比ETag要低,所以這是一個(gè)備用機(jī)制。
ETag: "6-5a1a4b1a67408"rn
#驗(yàn)證標(biāo)簽,用來(lái)幫助控制緩存驗(yàn)證,當(dāng)瀏覽器請(qǐng)求服務(wù)器的某項(xiàng)資源(A)時(shí), 服務(wù)器根據(jù)A算出一個(gè)哈希值,并通過(guò) ETag 返回給瀏覽器,瀏覽器把對(duì)應(yīng)的哈希值和A同時(shí)緩存在本地,當(dāng)下次再次向服務(wù)器請(qǐng)求A時(shí),會(huì)把這個(gè)哈希值發(fā)送給服務(wù)器,服務(wù)器再次計(jì)算A的哈希值并和剛剛接收到的哈希值做比較,如果發(fā)現(xiàn)A發(fā)生了變化就把A返回給瀏覽器(200),如果發(fā)現(xiàn)A沒(méi)有變化就給瀏覽器返回一個(gè)304未修改。這樣通過(guò)控制瀏覽器端的緩存,可以節(jié)省服務(wù)器的帶寬,因?yàn)榉?wù)器不需要每次都把全量數(shù)據(jù)返回給客戶端
Accept-Ranges: bytesrn
#接受范圍,如果出現(xiàn)此字段表示,這是一個(gè)續(xù)傳的下載(斷點(diǎn)續(xù)傳),bytes表示服務(wù)器可接受范圍請(qǐng)求的單位是bytes,none表示不支持
Content-Length: 6rn
#返回的數(shù)據(jù)長(zhǎng)度,單位為字節(jié)
[Content length: 6]
Keep-Alive: timeout=5, max=100
#長(zhǎng)連接的時(shí)長(zhǎng)及能夠處理的請(qǐng)求數(shù)量
Connection:keep-alive
#支持長(zhǎng)連接
Content-Type: text/html; charset=UTF-8rn
rn
#頁(yè)面類型,文本、圖片、視頻、音頻,及字符編碼
[HTTP response 1/1]
#響應(yīng)進(jìn)度
[Time since request: 0.019117000 seconds]
#響應(yīng)耗時(shí)
[Request in frame: 4]
#請(qǐng)求幀是第四幀
[Next request in frame:8]
#下一個(gè)請(qǐng)求幀
[Next response in frame:9]
#下一個(gè)響應(yīng)幀
File Data: 6 bytes
#數(shù)據(jù)大小
Line-based text data: text/html (1 lines)
#數(shù)據(jù)類型及相關(guān)信息
hellon
#數(shù)據(jù)內(nèi)容
以上就是http的請(qǐng)求頭內(nèi)容和響應(yīng)頭內(nèi)容
1xx(臨時(shí)響應(yīng))
100: 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求。
101(切換協(xié)議) 請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備進(jìn)行切換。
2xx(成功)
200:正確的請(qǐng)求返回正確的結(jié)果,如果不想細(xì)分正確的請(qǐng)求結(jié)果都可以直接返回200。
201:表示資源被正確的創(chuàng)建。比如說(shuō),我們 POST 用戶名、密碼正確創(chuàng)建了一個(gè)用戶就可以返回 201。
202:請(qǐng)求是正確的,但是結(jié)果正在處理中,這時(shí)候客戶端可以通過(guò)輪詢等機(jī)制繼續(xù)請(qǐng)求。
203:請(qǐng)求的代理服務(wù)器修改了源服務(wù)器返回的 200 中的內(nèi)容,我們通過(guò)代理服務(wù)器向服務(wù)器 A 請(qǐng)求用戶信息,服務(wù)器 A 正常響應(yīng),但代理服務(wù)器命中了緩存并返回了自己的緩存內(nèi)容,這時(shí)候它返回 203 告訴我們這部分信息不一定是最新的,我們可以自行判斷并處理。
3xx(已重定向)
300:請(qǐng)求成功,但結(jié)果有多種選擇。
301:請(qǐng)求成功,但是資源被永久轉(zhuǎn)移。比如說(shuō),我們下載的東西不在這個(gè)地址需要去到新的地址。
303:使用 GET 來(lái)訪問(wèn)新的地址來(lái)獲取資源。
304:請(qǐng)求的資源并沒(méi)有被修改過(guò)。
308:使用原有的地址請(qǐng)求方式來(lái)通過(guò)新地址獲取資源。
4xx(請(qǐng)求錯(cuò)誤)
400:請(qǐng)求出現(xiàn)錯(cuò)誤,比如請(qǐng)求頭不對(duì)等。
401:沒(méi)有提供認(rèn)證信息。
402:為以后需要所保留的狀態(tài)碼。
403:請(qǐng)求的資源不允許訪問(wèn)。就是說(shuō)沒(méi)有權(quán)限。
404:請(qǐng)求的內(nèi)容不存在。
406:請(qǐng)求的資源并不符合要求。
408:客戶端請(qǐng)求超時(shí)。
413:請(qǐng)求體過(guò)大。
415:類型不正確。
416:請(qǐng)求的區(qū)間無(wú)效。
5xx(服務(wù)器錯(cuò)誤)
500:服務(wù)器錯(cuò)誤。
501:請(qǐng)求還沒(méi)有被實(shí)現(xiàn)。
502:網(wǎng)關(guān)錯(cuò)誤。
503:服務(wù)暫時(shí)不可用。服務(wù)器正好在更新代碼重啟
505:請(qǐng)求的 HTTP 版本不支持。
總結(jié)
如何使用抓包工具
如何使用wireshark查看抓取到的數(shù)據(jù)包
wireshark的界面包含哪些內(nèi)容
請(qǐng)求頭當(dāng)中所包含的信息的含義
響應(yīng)頭分析
常用的響應(yīng)代碼含義
重點(diǎn):相關(guān)工具的使用,請(qǐng)求頭當(dāng)中包含的內(nèi)容,響應(yīng)頭當(dāng)中包含的內(nèi)容
難點(diǎn):記住并理解請(qǐng)求頭當(dāng)中所包含的信息和作用,理解響應(yīng)頭中字段的含義和作用,記住常用的響應(yīng)代碼功能