Wireshark抓包分析TCP協(xié)議:三次握手和四次揮手
前言
面試中我們經(jīng)常會(huì)被問(wèn)到TCP協(xié)議的三次握手和四次揮手的過(guò)程,為什么總喜歡問(wèn)這個(gè)問(wèn)題呢?
其實(shí)我們平時(shí)使用的很多協(xié)議都是應(yīng)用層協(xié)議,比如HTTP協(xié)議,https協(xié)議,DNS協(xié)議,F(xiàn)TP協(xié)議等;而應(yīng)用層協(xié)議都是要基于傳輸層的兩個(gè)協(xié)議之上的,也就是TCP協(xié)議和UDP協(xié)議。我們?cè)谑褂脩?yīng)用層協(xié)議遇到一些問(wèn)題需要去分析定位的時(shí)候,會(huì)需要涉及到底層協(xié)議的連接問(wèn)題上。所以,作為測(cè)試掌握這兩個(gè)底層協(xié)議的工作原理是非常有必要的!
UDP協(xié)議作為一個(gè)不可靠的傳輸層協(xié)議,工作過(guò)程相對(duì)比較簡(jiǎn)單!所以我們就重點(diǎn)來(lái)大家講一下TCP協(xié)議。
Wireshark抓包分析TCP協(xié)議 為了更好的學(xué)習(xí)和理解TCP協(xié)議的連接和斷開(kāi)連接的過(guò)程,我們來(lái)引入一個(gè)非常適合用來(lái)學(xué)習(xí)網(wǎng)絡(luò)協(xié)議的抓包工具Wireshark。這個(gè)抓包工具可以詳細(xì)看到每一層網(wǎng)絡(luò)報(bào)文的詳細(xì)信息。
TCP協(xié)議的三次握手過(guò)程 TCP建立連接需要經(jīng)歷三次握手,具體過(guò)程如下:
那么,這個(gè)過(guò)程我們配合抓包工具來(lái)看看具體的案例;如下圖是訪問(wèn)某個(gè)HTTP請(qǐng)求用wireshark抓到的報(bào)文,前面的三個(gè)報(bào)文就是TCP的三次握手過(guò)程:SYN包,SYN ACK包,ACK報(bào)文。
展開(kāi)看詳情:
第一次握手的報(bào)文如下:這是客戶端發(fā)起給服務(wù)器的報(bào)文,用于請(qǐng)求建立連接。
可以看到TCP報(bào)文里有一個(gè)Flags位:
當(dāng)Syn位標(biāo)記為1的時(shí)候,表示這個(gè)報(bào)文是一個(gè)請(qǐng)求鏈接的報(bào)文;
自己的序號(hào)(sequence number):0
第二次握手的報(bào)文如下:這是服務(wù)器回復(fù)給客戶端的報(bào)文,用于確認(rèn)并同意連接請(qǐng)求。
可以看到TCP報(bào)文里的Flags位:
Syn位也標(biāo)記為1,表示這個(gè)報(bào)文是一個(gè)同意建立鏈接的報(bào)文;
ACK位也標(biāo)記為1,表示是一個(gè)對(duì)上一個(gè)報(bào)文的確認(rèn)報(bào)文;
Sequence number:自己的序號(hào);
acknowledgment number:表示對(duì)上一個(gè)請(qǐng)求報(bào)文的確認(rèn)號(hào),所以是在上一個(gè)報(bào)文的序號(hào)+1
第三次握手:是客戶端發(fā)給服務(wù)器的,是對(duì)上一個(gè)同意連接請(qǐng)求的確認(rèn)。
Flags里的ACK位標(biāo)記為1,表示是一個(gè)對(duì)上一個(gè)報(bào)文的確認(rèn)報(bào)文;
Sequence number:自己的序號(hào),在上一個(gè)報(bào)文的基礎(chǔ)上+1;
acknowledgment number:表示對(duì)上一個(gè)請(qǐng)求報(bào)文的確認(rèn)號(hào),在上一個(gè)報(bào)文序號(hào)的基礎(chǔ)上+1.
至此,三次握手完成!接下來(lái)就開(kāi)始發(fā)送HTTP的請(qǐng)求了。
TCP協(xié)議的四次揮手過(guò)程
當(dāng)數(shù)據(jù)傳輸結(jié)束了,客戶端和服務(wù)器之間就開(kāi)始斷開(kāi)連接了。斷開(kāi)連接需要經(jīng)歷四次揮手,具體過(guò)程如下:
同樣,我們用wireshark工具來(lái)進(jìn)行詳細(xì)過(guò)程的報(bào)文的分析:
我們同樣展開(kāi)看下詳細(xì)的報(bào)文內(nèi)容:
第一次揮手:當(dāng)數(shù)據(jù)傳輸首先結(jié)束的端(比如客戶端),會(huì)率先發(fā)起結(jié)束斷開(kāi)連接的請(qǐng)求:
Flags位的 Fin位標(biāo)記為1,說(shuō)明這是個(gè)一個(gè)斷開(kāi)連接的請(qǐng)求的報(bào)文。
這時(shí)候我們發(fā)送這個(gè)請(qǐng)求的端已經(jīng)停止發(fā)送數(shù)據(jù)了!但是還可以接受數(shù)據(jù)。
第二次揮手:對(duì)上一個(gè)斷開(kāi)連接請(qǐng)求的報(bào)文進(jìn)行確認(rèn)。并同時(shí),停止接受數(shù)據(jù)。
所以,我們能看到這個(gè)報(bào)文的ACK位標(biāo)記為1,并且acknowledgment number是對(duì)上一個(gè)報(bào)文的序號(hào)+1,表示對(duì)上一個(gè)報(bào)文的確認(rèn)。
第三次揮手:服務(wù)器端也結(jié)束數(shù)據(jù)發(fā)送了,所以也會(huì)發(fā)起一個(gè)斷開(kāi)連接的請(qǐng)求。
這是個(gè)服務(wù)器發(fā)起FIN報(bào)文,請(qǐng)求斷開(kāi)連接,同時(shí),服務(wù)器也會(huì)停止發(fā)送數(shù)據(jù)。
第四次揮手:是客戶端對(duì)服務(wù)器斷開(kāi)連接請(qǐng)求的進(jìn)行確認(rèn)。
所以這個(gè)flags位是ACK位標(biāo)記為1。此時(shí),客戶端也停止接受數(shù)據(jù)了。
至此,服務(wù)器和客戶端都停止發(fā)送和接受數(shù)據(jù)了!四次揮手就完成了。