TCP三次握手和四次揮手

重要的幾個(gè)概念:

  1. SYN: 發(fā)起新的連接
  2. ACK:確認(rèn)序號(hào)有效。
  3. seq序號(hào)
  4. ack序號(hào): 只有在ACK=1的情況下有效,ack序號(hào) = seq序號(hào)+ 1
  5. FIN: 釋放一個(gè)連接

三次握手協(xié)議

三次握手.png
  1. 客戶端發(fā)起SYN=1,表示需要新建連接,并且?guī)想S機(jī)數(shù)seq=x (Client進(jìn)入SYN_SENT狀態(tài))
  2. 服務(wù)端在收到數(shù)據(jù)包之后,根據(jù)SYN=1知道客戶端是希望建立新的連接,所以服務(wù)端發(fā)送的信息里面SYNACK都置為1,并且對(duì)客戶端上傳上的seq序號(hào)=x+1==>ack=x+1,并且?guī)献约荷傻碾S機(jī)數(shù)seq=y (Server進(jìn)入SYN_RCVD)
  3. 客戶端收到服務(wù)端返回的包后,確認(rèn)ACK是否等于1并且確認(rèn)ack是否等于x+1,如果正確則將ACK=1,ack=y+1 (Client和Server進(jìn)入ESTABLISHED)
  4. 完成三次握手,正確的連接建立成功,服務(wù)端和客戶端可以開始傳輸數(shù)據(jù)了

為什么要用三次握手,而不是兩次握手呢??

如果客戶端發(fā)送第一次握手之后,因?yàn)榫W(wǎng)絡(luò)不好,消息在網(wǎng)絡(luò)中走的有點(diǎn)久,等到消息到達(dá)服務(wù)端的時(shí)候,消息已經(jīng)失效了(但是這個(gè)時(shí)候服務(wù)端并不知曉),假設(shè)沒有第三次握手,服務(wù)端在收到消息做出響應(yīng)之后,就建立起新的連接,一直等待客戶端發(fā)送消息,但是客戶端已經(jīng)認(rèn)為失效了。這樣就會(huì)導(dǎo)致服務(wù)端的資源被白白浪費(fèi)。采用三次握手就是為了防止這種情況的發(fā)生,server會(huì)因?yàn)槭詹坏酱_認(rèn)的報(bào)文,就知道client并沒有建立連接。這就是三次握手的作用。

SYN攻擊:

在三次握手過程中,Server發(fā)送SYN-ACK之后,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時(shí)Server處于SYN_RCVD狀態(tài),當(dāng)收到ACK后,Server轉(zhuǎn)入ESTABLISHED狀態(tài)。SYN攻擊就是Client在短時(shí)間內(nèi)偽造大量不存在的IP地址,并向Server不斷地發(fā)送SYN包,Server回復(fù)確認(rèn)包,并等待Client的確認(rèn),由于源地址是不存在的,因此,Server需要不斷重發(fā)直至超時(shí),這些偽造的SYN包將產(chǎn)時(shí)間占用未連接隊(duì)列,導(dǎo)致正常的SYN請求因?yàn)殛?duì)列滿而被丟棄,從而引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。SYN攻擊時(shí)一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當(dāng)Server上有大量半連接狀態(tài)且源IP地址是隨機(jī)的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現(xiàn)行:#netstat -nap | grep SYN_RECV

四次揮手

Tcp四次揮手.png
  1. 客戶端發(fā)送 FIN=1標(biāo)識(shí)需要釋放連接,并且?guī)献约旱碾S機(jī)數(shù)seq=u
  2. 服務(wù)端接收到FIN后知道客戶端要釋放連接,做出響應(yīng)ACK=1,并將ack=u+1,最后帶上自己的隨機(jī)數(shù) seq=v
  3. 服務(wù)端向客戶端發(fā)送FIN,用來關(guān)閉服務(wù)端客戶端的數(shù)據(jù)傳輸,這里用到的ack也是=u+1
  4. 客戶端收到FIN后,進(jìn)入TIME_WAIT狀態(tài),并對(duì)FIN的做出應(yīng)答
  5. 服務(wù)端收到應(yīng)答后,進(jìn)行CLOSE狀態(tài)

為什么建立連接是三次握手,斷開連接確實(shí)四次揮手呢?

因?yàn)殛P(guān)閉連接時(shí),A向B發(fā)送FIN,僅僅表示A不再發(fā)送數(shù)據(jù)了,但是還是可以接收數(shù)據(jù),此時(shí)B也未必已經(jīng)把所有數(shù)據(jù)都發(fā)送給A了,所以B可以立即發(fā)送FIN做響應(yīng)關(guān)閉,也可以接著把未發(fā)完的數(shù)據(jù)發(fā)完了,在發(fā)送FIN。

為什么客戶端會(huì)在發(fā)送完最后一個(gè)ACK后,還要等待2MSL.

因?yàn)榭蛻舳朔祷氐腁CK可能在網(wǎng)絡(luò)傳輸中丟失,服務(wù)端會(huì)超時(shí)重傳FIN,客戶端就能在這2MSL的時(shí)間內(nèi)接收到這個(gè)FIN,再次做出ACK。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容