三次握手與四次揮手解讀

TCP連接的三次握手和四次揮手問題是面試對常見問題,本文作者嘗試總結歸納。如有問題,請指教!

三次握手:

首先,客戶端向服務器發送syn報文(syn=x,並進入SYN_SEND狀態,等待服務器確認。

然後,服務器確認客戶端的syn報文(ack=x+1,併發送服務器的syn報文(syn=y,即服務器發送syn+ack包。隨即服務器進入了SYN_RECV狀態。

最後,客戶端接收到syn+ack包後,向服務器發送ack確認包(syn=y+1)。此包發送完畢後,服務器和客戶端進入ESTABLISHED狀態。

SYN攻擊:

在三次握手過程中,Server發送SYN-ACK之後,收到ClientACK之前的TCP連接稱爲半連接(half-open connect),此時Server處於SYN_RECV狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些僞造的SYN包將產時間佔用未連接隊列,導致正常的SYN請求因爲隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

#netstat -nap |grep SYN_RECV

四次揮手:

首先,主動關閉方向被動關閉方發送FIN包(FIN=n),用來關閉客戶端和服務器之間的數據傳輸,這時主動關閉方進入FIN_WAIT_1狀態。

其次,被動關閉方收到了FIN包後,向主動關閉方發送ACK確認包(ACK=n+1),此時被動關閉方進入CLOSE_WAIT狀態。主動關閉方接收到ACK確認包後進入FIN_WAIT_2狀態。

然後,被動關閉方再次發送FIN包(FIN=m),用來關閉服務器和客戶端之間的數據傳輸,此時被動關閉方進入LACK_ACK狀態。

最後,主動關閉方接收到FIN包後,向被動關閉方發送ACK確認包(ACK=m+1),此時主動關閉方進入TIME_WAIT狀態。被動關閉方接收到ACK確認包後進入CLOSED狀態。

爲什麼建立連接是需要三次握手,關閉連接時需要四次揮手?

這是因爲在建立連接時,服務器和客戶端之間沒有數據傳輸,所有服務器在收到請求報文SYN後,可以將SYN+ACK確認報文一起發送給客戶端。而在關閉連接時,主動關閉方會發送一個FIN報文,但這個報文僅僅表示”我不會再向你發送數據了“(丟失的數據依然會繼續發送),被動關閉方也不一定接受或者發送了全部數據,所以被動關閉方要進入CLOSE_WAIT狀態等待數據接收完畢,發送ACK確認報文。這時,被動關閉方再發送FIN報文,向主動方表示”自己同意現在關閉連接了“。因此,關閉連接時ACK確認報文和FIN關閉連接報文是分開發送的。








發佈了35 篇原創文章 · 獲贊 26 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章