抓了個包,搞懂了網(wǎng)絡(luò)
? 今天用 postman 發(fā)了請求
GET http://www.flashhost.com/check
只返回了一個字符串
success
整個過程的網(wǎng)絡(luò)包,用 wireshark 全都抓下來了

三次握手
A->B? ?TCP? ?[SYN]
A<-B? ?TCP? ?[SYN,ACK]
A->B? ?TCP? ?[ACK]
HTTP 請求
A->B? ?HTTP? GET / HTTP/1.1
A<-B? ?TCP? ? [ACK]
A<-B? ?HTTP? 200(text/plain)
A->B? ?TCP? ? [ACK]
Keep-Alive
A->B? ?TCP? ? [TCP Keep-Alive]
A<-B? ?TCP? ? [TCP Keep-Alive ACK]
A->B? ?TCP? ? [TCP Keep-Alive]
A<-B? ?TCP? ? [TCP Keep-Alive ACK]
...(幾分鐘后)
A->B? ?TCP? ? [TCP Keep-Alive]
A<-B? ?TCP? ? [TCP Keep-Alive ACK]
四次揮手
A<-B? ?TCP? ? [FIN,ACK]
A->B? ?TCP? ? [ACK]
A->B? ?TCP? ? [FIN,ACK]
A<-B? ?TCP? ? [ACK]
這么多包,我看心情點開了 A->B 發(fā)送的第一個 HTTP 協(xié)議的包
A->B? ?HTTP? GET / HTTP/1.1
在 wireshark 里查看它的詳情
aa aa aa aa?aa?aa bb?bb bb bb bb bb 08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a
沒錯,這一長串用 16 進(jìn)制表示的數(shù)據(jù),就是從網(wǎng)卡直接發(fā)出去的數(shù)據(jù),一個字節(jié)都沒有省略
來,給你一分鐘時間肉眼拆一下包
一
分
鐘
思
考
時
間
哈哈,還是我來吧
數(shù)據(jù)鏈路層
aa aa aa aa?aa?aa bb?bb?bb?bb?bb?bb?08 00 45 00 01 1d 6d 7e 40 00 80 06 00 00 c0 a8 1f a4 6e f2 44 04 db 08 00 50 2c 85 bd c9 05 ae c5 63 50 18 02 02 94 52 00 00 47 45 54 20 63 68 65 63 6b 20 48 54 54 50 2f 31 2e 31 0d 0a 0d 0a
最開頭是數(shù)據(jù)鏈路層,使用的協(xié)議是?Ethernet?以太網(wǎng)協(xié)議,協(xié)議格式如下:
原地址(6字節(jié)):aa?aa?aa?aa?aa?aa(mac地址)
目標(biāo)地址(6字節(jié)):bb?bb?bb?bb?bb?bb(mac地址)
類型(2字節(jié)):08 00(ipv4)
數(shù)據(jù):45 00 01 ... ... ...
網(wǎng)絡(luò)層

信息太多,只提取幾個關(guān)鍵的信息
協(xié)議:06(TCP)
源地址:c0 a8 1f a4(IP地址:192.168.31.164)
目的地址:6e f2 44 04(IP地址:110.242.68.4)
數(shù)據(jù):db 08 00 50?... ... ...
傳輸層
再次去掉網(wǎng)絡(luò)層的 IP 協(xié)議的首部

TCP?協(xié)議大家都知道,超級多的細(xì)節(jié),這里不展開,仍然提取關(guān)鍵信息,走主流程
源端口:db 08(端口號:56072)
目的端口:00 50(端口號:80)
數(shù)據(jù):47 45 54 20?... ..
這里的 源 和 目的 不再是 mac 地址,也不再是 IP 地址了,因為此時包已經(jīng)到達(dá)了目標(biāo)機(jī)器,需要找具體對應(yīng)的進(jìn)程,所以這里是端口號。
同樣由于進(jìn)程自己知道將以什么樣的協(xié)議,來解讀數(shù)據(jù)部分,所以這里也沒有上層協(xié)議的指定,因為這已經(jīng)是應(yīng)用程序的事了。
我們接著拆...
應(yīng)用層
再次去掉傳輸層的 TCP 協(xié)議的首部
就來到了我們最熟悉的應(yīng)用層,使用的協(xié)議是什么呢?因為我知道我請求的服務(wù)是提供 HTTP 協(xié)議的 web 服務(wù),同時我發(fā)送的也是 HTTP 協(xié)議的數(shù)據(jù),所以使用的協(xié)議當(dāng)然就是 HTTP 協(xié)議啦~
請求行:47 ... 0a(GET /check HTTP/1.0 \r\n)
請求頭:無
請求體:無
最后:0d 0a(\r\n)

