前言
本文旨在用通俗的語(yǔ)言說明對(duì)TCP三次握手以及四次揮手的理解,以及為什么握手需要三次但是揮手需要四次
三次握手
我們先來(lái)看一張網(wǎng)絡(luò)上的圖

圖中SYN和ACK只是標(biāo)志位,我們不用關(guān)注,我們只需要關(guān)注syn和ack
這個(gè)過程用文字描述一下就是
- 客戶端向服務(wù)端發(fā)送seq=J
- 服務(wù)端收到后向客戶端發(fā)送ack=J+1,seq=K
- 客戶端向服務(wù)端回應(yīng)ack=K+1 ,至此連接建立完成
看到這里你可能會(huì)覺得又是ack又是seq這些都是什么意思,別急,我們可以把這個(gè)過程翻譯成人話來(lái)理解一下
建立連接的通俗理解
建立連接后我們認(rèn)為這個(gè)通訊是可靠的,通訊是可靠的說的直白一點(diǎn)就是 我能確定你能收到我的信息,你能確定我能收到你的信息,建立連接的過程實(shí)質(zhì)上是在互相確認(rèn)對(duì)方可以收到信息的過程
舉個(gè)??
我們現(xiàn)在用男女同學(xué)之間異地寫信來(lái)模擬一下三次握手的場(chǎng)景(皮一下很開心)
現(xiàn)在女生A想和男生B通信,于是寫了一封信寄給男生B男生B收到女A的信后很開心很激動(dòng)然后就去打了幾把游戲冷靜一下??,而生女生A把信發(fā)出去后發(fā)現(xiàn)一直沒有回應(yīng),以為對(duì)方收不到,然后就放棄了。
所以男生B收到女生A的信后應(yīng)該進(jìn)行回應(yīng)否則女生A是不知道你收到了信的
后來(lái)男生B收到女生A信后終于回信,然后女生A收到信后也忘了回信,于是男生B也以為女生A收不到信,就一直等呀等,一輩子就這么過去了(這真是個(gè)悲傷的故事???)
所以這時(shí)候女生A也應(yīng)該回信,讓男生B知道她能收到信,自此以后他們就能正式開始互通信件了
三次握手的本質(zhì)
上面這個(gè)例子中女生A其實(shí)是客戶端,男生B其實(shí)是服務(wù)端,三次握手實(shí)質(zhì)上是在做下面的確認(rèn)
- ① 客戶端:你是否能收到我的訊息(向服務(wù)端發(fā)送seq=J)
- ② 服務(wù)端:我可以收到你的信息(ack=J+1代表可以收到客戶端的信息),你能否收到我的信息(向客服端發(fā)送seq=K)
- ③ 客戶端:我可以收到你的信息(向服務(wù)端回應(yīng)ack=K+1代表可以收到服務(wù)端信息)
連接建立
syn攻擊
我們可以看到,在之前的例子中,如果女生A最后不回信,男生B會(huì)一直等待,這個(gè)如果換成我們實(shí)際tcp握手就會(huì)造成服務(wù)端資源的浪費(fèi)
我們可以想象這么一個(gè)場(chǎng)景:
如果客戶端向服務(wù)端發(fā)送大量的syn包(進(jìn)行大量操作①)那么服務(wù)器資源就會(huì)被大量占用,從而導(dǎo)致其無(wú)法正常提供服務(wù)
這就是syn洪水攻擊,目前這種攻擊還沒有什么好的防范方式目前大致方向有兩種
- 通過分析網(wǎng)絡(luò)流量特征,因?yàn)閟yn攻擊的流量和正常網(wǎng)絡(luò)流量是會(huì)有顯著區(qū)別的,比如數(shù)據(jù)包的密集度、半開連接數(shù)量(執(zhí)行完操作②的數(shù)量)
- 通過一個(gè)防火墻代理,大致是通過防火墻來(lái)過濾可靠連接放行
四次揮手
先上圖

- ① 主動(dòng)方:我不想給你發(fā)數(shù)據(jù)了我們分手吧(向被動(dòng)方發(fā)送seq=M)
- ② 被動(dòng)方:好(ack=M+1代表可以收到主動(dòng)方的信息)
此時(shí)被動(dòng)方把剩余數(shù)據(jù)發(fā)送完成
- ③ 被動(dòng)方:我不想給你發(fā)數(shù)據(jù)了我們分手吧(向主動(dòng)方發(fā)送seq=N)
- ④ 主動(dòng)方:好(向被動(dòng)方回應(yīng)ack=N+1代表可以收到被動(dòng)方信息)
被動(dòng)方關(guān)閉連接,主動(dòng)方等待一段時(shí)間后確定沒有數(shù)據(jù)接收了,關(guān)閉連接
四次揮手實(shí)質(zhì)上是在確認(rèn)我已經(jīng)沒有數(shù)據(jù)需要發(fā)送給你,你已經(jīng)沒有數(shù)據(jù)發(fā)送給我,雙方可以斷開連接
為什么握手是三次但是揮手需要四次
其實(shí)握手也可以是四次,如果是四次流程將會(huì)是下面這樣
- ① 客戶端:你是否能收到我的訊息(向服務(wù)端發(fā)送seq=J)
- ② 服務(wù)端:我可以收到你的信息(ack=J+1代表可以收到客戶端的信息)
- ③ 服務(wù)端:你能否收到我的信息(向客服端發(fā)送seq=K)
- ④ 客戶端:我可以收到你的信息(向服務(wù)端回應(yīng)ack=K+1代表可以收到服務(wù)端信息)
我們可以發(fā)現(xiàn)三次握手實(shí)質(zhì)上是把②、③合成一步了,他把回復(fù)客戶端(我能收到信息)和詢問客戶端(能否收到我的信息)合并為一步操作。
為什么揮手時(shí)不能合并成三次呢?
答:因?yàn)閾]手的②和③之間需要有一步把剩余數(shù)據(jù)發(fā)送完的操作