1. 程式人生 > >TCP協議(三次握手和四次握手)

TCP協議(三次握手和四次握手)

TCP的特性

TCP提供一種面向連線的、可靠的位元組流服務
在一個TCP連線中,僅有兩方進行彼此通訊。廣播和多播不能用於TCP
TCP使用校驗和,確認和重傳機制來保證可靠傳輸
TCP使用累積確認
TCP使用滑動視窗機制來實現流量控制,通過動態改變視窗的大小進行擁塞控制
三次握手與四次揮手

所謂三次握手(Three-way Handshake),是指建立一個 TCP 連線時,需要客戶端和伺服器總共傳送3個包。

三次握手的目的是連線伺服器指定埠,建立 TCP 連線,並同步連線雙方的序列號和確認號,交換 TCP 視窗大小資訊。在 socket 程式設計中,客戶端執行 connect() 時。將觸發三次握手。

  • 第一次握手(SYN=1, seq=x):

    客戶端傳送一個 TCP 的 SYN 標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號 X,儲存在包頭的序列號(Sequence Number)欄位裡。

    傳送完畢後,客戶端進入 SYN_SEND 狀態。

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

    伺服器發回確認包(ACK)應答。即 SYN 標誌位和 ACK 標誌位均為1。伺服器端選擇自己 ISN 序列號,放到 Seq 域裡,同時將確認序號(Acknowledgement Number)設定為客戶的 ISN 加1,即X+1。
    傳送完畢後,伺服器端進入 SYN_RCVD

    狀態。

  • 第三次握手(ACK=1,ACKnum=y+1)

    客戶端再次傳送確認包(ACK),SYN 標誌位為0,ACK 標誌位為1,並且把伺服器發來 ACK 的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫ISN的+1

    傳送完畢後,客戶端進入 ESTABLISHED 狀態,當伺服器端接收到這個包時,也進入 ESTABLISHED 狀態,TCP 握手結束。
    三次握手的過程的示意圖如下:

three-way-handshake

TCP的連線的拆除需要傳送四個包,因此稱為四次揮手(Four-way handshake),也叫做改進的三次握手。客戶端或伺服器均可主動發起揮手動作,在 socket 程式設計中,任何一方執行 close() 操作即可產生揮手操作。

第一次揮手(FIN=1,seq=x)

假設客戶端想要關閉連線,客戶端傳送一個 FIN 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。

傳送完畢後,客戶端進入 FIN_WAIT_1 狀態。

第二次揮手(ACK=1,ACKnum=x+1)

伺服器端確認客戶端的 FIN 包,傳送一個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。

傳送完畢後,伺服器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態,等待伺服器端關閉連線。

第三次揮手(FIN=1,seq=y)

伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN 置為1。

傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。

第四次揮手(ACK=1,ACKnum=y+1)

客戶端接收到來自伺服器端的關閉請求,傳送一個確認包,並進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。

伺服器端接收到這個確認包之後,關閉連線,進入 CLOSED 狀態。

客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)之後,沒有收到伺服器端的 ACK ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入 CLOSED 狀態。

四次揮手的示意圖如下:

four-way-handshake

SYN攻擊

什麼是 SYN 攻擊(SYN Flood)?

在三次握手過程中,伺服器傳送 SYN-ACK 之後,收到客戶端的 ACK 之前的 TCP 連線稱為半連線(half-open connect)。此時伺服器處於 SYN_RCVD 狀態。當收到 ACK 後,伺服器才能轉入 ESTABLISHED 狀態.

SYN 攻擊指的是,攻擊客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地傳送SYN包,伺服器回覆確認包,並等待客戶的確認。由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列,正常的SYN請求被丟棄,導致目標系統執行緩慢,嚴重者會引起網路堵塞甚至系統癱瘓。

SYN 攻擊是一種典型的 DoS/DDoS 攻擊。

如何檢測 SYN 攻擊?

檢測 SYN 攻擊非常的方便,當你在伺服器上看到大量的半連線狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。在 Linux/Unix 上可以使用系統自帶的 netstats 命令來檢測 SYN 攻擊。

如何防禦 SYN 攻擊?

SYN攻擊不能完全被阻止,除非將TCP協議重新設計。我們所做的是儘可能的減輕SYN攻擊的危害,常見的防禦 SYN 攻擊的方法有如下幾種:

縮短超時(SYN Timeout)時間
增加最大半連線數
過濾閘道器防護
SYN cookies技術
參考資料

計算機網路:自頂向下方法
TCP三次握手及四次揮手詳細圖解
TCP協議三次握手過程分析
TCP協議中的三次握手和四次揮手(圖解)
百度百科:SYN攻擊