TCP協議簡介

前言

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議。

TCP的特性

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

TCP三次握手與四次揮手

三次握手

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

三次握手的目的是連接伺服器指定埠,建立 TCP 連接,並同步連接雙方的序列號確認號,交換 TCP 窗口大小信息。在Socket 編程中,客戶端執行 connect() 時。將觸發三次握手。

1. 第一次握手(SYN=1, seq=x); - 客戶端發送一個 TCP 的 SYN 標誌位置1的包, 指明客戶端打算連接的伺服器的埠,以及初始序號 X, 保存在包頭的序列號(Sequence Number)欄位裏。 - 發送完畢後,客戶端進入 `SYN_SEND` 狀態。 2. 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1); - 伺服器發回確認包(ACK)應答。即 SYN 標誌位和 ACK 標誌位均為1。伺服器端選擇自己 ISN 序列號, 放到 Seq 域裏, 同時將確認序號(Acknowledgement Number)設置為客戶端的 ISN 加1, 即x+1。 - 發送完畢後,伺服器端進入 `SYN_RCVD` 狀態。 3. 第三次握手(ACK=1,ACKnum=y+1) - 客戶端再次發送確認包(ACK), SYN 標誌位為0, ACK 標誌位為1, 並且把伺服器發來 ACK 的序號欄位+1, 放在確定欄位中發送給對方, 並且在數據段放寫ISN的+1 - 發送完畢後,客戶端進入 `ESTABLISHED` 狀態,當伺服器端接收到這個包時,也進入 `ESTABLISHED` 狀態,TCP 握手結束。

三次握手的過程的示意圖如下:

四次揮手

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

1. 第一次揮手(FIN=1, seq=x); - 假設客戶端想要關閉連接,客戶端發送一個 FIN 標誌位置為1的包, 表示自己已經沒有數據可以發送了, 但是仍然可以接受數據。 - 發送完畢後,客戶端進入 `FIN_WAIT_1` 狀態。 2. 第二次揮手(ACK=1, ACKnum=x+1); - 伺服器端確認客戶端的 FIN 包,發送一個確認包, 表明自己接受到了客戶端關閉連接的請求,但還沒有準備好關閉連接。 - 發送完畢後,伺服器端進入 `CLOSE_WAIT` 狀態, 客戶端接收到這個確認包之後,進入 `FIN_WAIT_2` 狀態, 等待伺服器端關閉連接。 3. 第三次揮手(FIN=1, seq=y); - 伺服器端準備好關閉連接時, 向客戶端發送結束連接請求, `FIN` 置為1。 - 發送完畢後, 伺服器端進入 `LAST_ACK` 狀態, 等待來自客戶端的最後一個ACK。 4. 第四次揮手(ACK=1,ACKnum=y+1) - 客戶端接收到來自伺服器端的關閉請求, 發送一個確認包, 並進入 `TIME_WAIT` 狀態, 等待可能出現的要求重傳的 ACK 包。 - 伺服器端接收到這個確認包之後, 關閉連接, 進入 `CLOSED` 狀態。 - 客戶端等待了某個固定時間(兩個最大段生命週期, 2MSL, 2 Maximum Segment Lifetime)之後, 沒有收到伺服器端的 ACK, 認為伺服器端已經正常關閉連接, 於是自己也關閉連接, 進入 `CLOSED` 狀態。

四次揮手的示意圖如下:

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技術


歡迎關注技術公眾號: 零壹技術棧

weixin.qq.com/r/VDgkPNH (二維碼自動識別)

本帳號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,非同步、緩存和消息中間件,分散式和微服務,架構學習和進階等學習資料和文章。


推薦閱讀:
相關文章