抓了個包,搞懂了網絡
? 今天用 postman 發(fā)了請求
GET http://www.flashhost.com/check
只返回了一個字符串
success
整個過程的網絡包,用 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 進制表示的數(shù)據,就是從網卡直接發(fā)出去的數(shù)據,一個字節(jié)都沒有省略
來,給你一分鐘時間肉眼拆一下包
一
分
鐘
思
考
時
間
哈哈,還是我來吧
數(shù)據鏈路層
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ù)據鏈路層,使用的協(xié)議是?Ethernet?以太網協(xié)議,協(xié)議格式如下:
原地址(6字節(jié)):aa?aa?aa?aa?aa?aa(mac地址)
目標地址(6字節(jié)):bb?bb?bb?bb?bb?bb(mac地址)
類型(2字節(jié)):08 00(ipv4)
數(shù)據:45 00 01 ... ... ...
網絡層

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

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

