相信大家總是能聽到TCP、UDP,還有TCP三次握手,之前都是看的書上的理論,今天來用Wireshark抓一個(gè)tcp三次握手。
在平時(shí)的開發(fā)中,如果是一般的Http或者Https請(qǐng)求,我們直接在Windows上使用Fiddler、Mac上使用Charles來抓包即可。當(dāng)然,使用Wireshark也可以抓取http、https請(qǐng)求,不過一般使用Wireshark來抓TCP請(qǐng)求。
官方下載地址:https://www.wireshark.org/download.html
首先,來看下wireshark界面

這里選擇Wi-Fi就能抓到本機(jī)所有的請(qǐng)求了,我這里是wifi,如果是直接連網(wǎng)線,看到的就是本地連接了。這個(gè)很簡單,你試一下就能知道了。
然后就能看到各種網(wǎng)絡(luò)請(qǐng)求了,包括應(yīng)用層協(xié)議和傳輸層協(xié)議。

因?yàn)閿?shù)據(jù)傳輸記錄太多了,那么就一定需要過濾器功能了。上面的過濾器欄中支持以下幾種表達(dá)式:
表達(dá)式規(guī)則
- 協(xié)議過濾
比如tcp,只顯示TCP協(xié)議。http,就是只顯示HTTP協(xié)議。注意,這里是區(qū)分大小寫的。 - IP 地址過濾
比如 ip.src ==192.168.1.102 顯示源地址為192.168.1.102,
ip.dst==192.168.1.102, 目標(biāo)地址為192.168.1.102 - 端口過濾
tcp.port ==80, 端口為80的
tcp.srcport == 80, 只顯示TCP協(xié)議的愿端口為80的。 - Http模式過濾
http.request.method=="GET", 只顯示HTTP GET方法的。 - 邏輯運(yùn)算符為 AND/ OR
點(diǎn)擊任意一個(gè)記錄,下面會(huì)顯示該記錄的封包詳細(xì)信息

- Frame: 物理層的數(shù)據(jù)幀概況
- Ethernet II: 數(shù)據(jù)鏈路層以太網(wǎng)幀頭部信息,這里就可以看到本機(jī)mac地址以及目標(biāo)mac地址了
- Internet Protocol Version 4: 互聯(lián)網(wǎng)層IP包頭部信息,這里可以看到本機(jī)以及目標(biāo)ip地址
- Transmission Control Protocol: 傳輸層T的數(shù)據(jù)段頭部信息,此處是TCP,這里能看到TCP的數(shù)據(jù)包了,下面會(huì)講到。
- Hypertext Transfer Protocol: 應(yīng)用層的信息,此處是HTTP協(xié)議
關(guān)于互聯(lián)網(wǎng)通信協(xié)議,推薦阮一峰的“互聯(lián)網(wǎng)協(xié)議入門”,寫的真好。http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
下面看下TCP報(bào)文頭部格式:

再來對(duì)比看一下Wireshark抓的TCP包,終于從理論到實(shí)踐了。大學(xué)期間看了很多遍TCP報(bào)文頭都記不住。重點(diǎn)關(guān)注一下Sequence number 和 Acknowledgment number 以及Flags。

現(xiàn)在進(jìn)入我們的重點(diǎn),TCP三次握手,這個(gè)歷史性的握手
我們先訪問一個(gè)http請(qǐng)求“http://www.cnblogs.com/tankxiao”,注意這里不是https哦,關(guān)于https我后面再講。

我們找到我們請(qǐng)求的http地址,注意看Stream index = 2,這個(gè)index等下可以追蹤到這次http建立之前的tcp三次握手過程。
我們鼠標(biāo)右鍵這個(gè)http請(qǐng)求,F(xiàn)ollow-TCP Stream,就可以看到此次tcp建立連接的歷史性握手了。

上面的地址欄過濾"tcp.stream eq 2"中的2就是上面的Stream index。
咱么首先看下TCP三次握手經(jīng)典圖

大學(xué)時(shí)看過很多遍這個(gè)圖,卻記不住到底啥意思,就是因?yàn)樘橄罅?,抽象到只能死記硬背,今天通過wireshark一看就明白了。
下面來分步解析一下三次握手過程,主要關(guān)注三個(gè)參數(shù),分別是Flags、Sequence number、Acknowledgment number。
第一次握手
Flags:SYN
Sequence number:0
Acknowledgment number:0

第二次握手
Flags:SYN,ACK
Sequence number:0
Acknowledgment number:1

第三次握手
Flags:ACK
Sequence number:1
Acknowledgment number:1

總結(jié):TCP三次握手過程
- 客戶端發(fā)送SYN標(biāo)志和序列號(hào)Seq來向服務(wù)器發(fā)起連接
- 服務(wù)端收到請(qǐng)求,向客戶端發(fā)送ACK表示確認(rèn),確認(rèn)號(hào)是接收到的序列號(hào)+1。同時(shí)發(fā)送SYN標(biāo)志位以及自己的序列號(hào)給客戶端發(fā)起連接
- 客戶端再發(fā)送ACK標(biāo)志給服務(wù)端表示確認(rèn),其中確認(rèn)號(hào)是服務(wù)端發(fā)送過來的序列號(hào)+1
參考博客:https://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html