TCP 的三次握手和四次揮手,瞭解泛洪攻擊麼

youou發表於2021-09-09

引言

  • TCP 建立連線與斷開連線的過程
  • TCP 泛洪攻擊(TCP 建立連線過程中的攻擊手段)與防護

TCP 建立連線與斷開連線的過程

TCP 三次握手(連線過程)

圖片描述

第一次握手

客戶端向服務端傳送連線請求報文段。該報文段中包含自身的資料通訊初始序號。請求傳送後,客戶端便進入 SYN-SENT 狀態。

第二次握手

服務端收到連線請求報文段後,如果同意連線,則會傳送一個應答,該應答中也會包含自身的資料通訊初始序號,傳送完成後便進入 SYN-RECEIVED 狀態。

第三次握手

當客戶端收到連線同意的應答後,還要向服務端傳送一個確認報文。客戶端發完這個報文段後便進入 ESTABLISHED 狀態,服務端收到這個應答後也進入 ESTABLISHED 狀態,此時連線建立成功。

為什麼需要三次握手,2次不行嗎?

喂喂喂,我是A,你聽的到嗎? B:在在在,我能聽到,我是B,你能聽到我嗎? A:(聽到了,老子不想理你) B:喂喂喂?聽不聽到?我X,對面死了,我掛了。。

如果只有 2 次的話,B 並不清楚 A 是否收到他發過去的資訊。

TCP 四次揮手(斷開連結)

圖片描述

第一次揮手

若客戶端 A 認為資料傳送完成,則它需要向服務端 B 傳送連線釋放請求。

第二次揮手

B 收到連線釋放請求後,會告訴應用層要釋放 TCP 連結。然後會傳送 ACK 包,並進入 CLOSE_WAIT 狀態,此時表明 A 到 B 的連線已經釋放,不再接收 A 發的資料了。但是因為 TCP 連線是雙向的,所以 B 仍舊可以傳送資料給 A

第三次揮手

B 如果此時還有沒發完的資料會繼續傳送,完畢後會向 A 傳送連線釋放請求,然後 B 便進入 LAST-ACK 狀態。

PS:透過延遲確認的技術(通常有時間限制,否則對方會誤認為需要重傳),可以將第二次和第三次握手合併,延遲 ACK 包的傳送。

第四次揮手

A 收到釋放請求後,向 B 傳送確認應答,此時 A 進入 TIME-WAIT 狀態。該狀態會持續 2MSL(最長報文段壽命,指報文段在網路中生存的時間,超時會被拋棄) 時間,若該時間段內沒有 B 的重發請求的話,就進入 CLOSED 狀態。當 B 收到確認應答後,也便進入 CLOSED 狀態。

SYN 泛洪攻擊

我們已經知道,TCP 只有經過三次握手才能連線,而 SYN 泛洪攻擊就是針對 TCP 握手過程進行攻擊:

  • 攻擊者傳送大量的 SYN 包給伺服器(第一次握手成功)

  • 伺服器回應(SYN + ACK)包(第二次握手成功)

  • 但是攻擊者不回應 ACK 包(第三次握手不進行)

導致伺服器存在大量的半開連線,這些半連線可以耗盡伺服器資源,使被攻擊伺服器無法再響應正常 TCP 連線,從而達到攻擊的目的

圖片描述

幸運的是,一種稱為 SYN cookie 的有效防禦現在已部署在大多數主要的作業系統中:

  • 在客戶端傳送 SYN 報文給伺服器(第一次握手),服務端收到連線請求報文段後,伺服器不會為此SYN建立半開連線,而是生成一個序列號(所謂的 cookie)一起傳送給客戶端(第二次握手),在這個階段,伺服器不會為該連線分配任何資源
  • 客戶端返回 ACK 報文給伺服器(第三次握手),伺服器會驗證這個 cookie 值,只有驗證成功才建立 TCP 連線,分配資源
  • 如果客戶端沒有返回 ACK 報文給伺服器,也不會對伺服器造成任何的傷害,因為伺服器沒有分配任何資源給它

每天三分鐘,進階一個前端小 tip

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4729/viewspace-2797417/,如需轉載,請註明出處,否則將追究法律責任。

相關文章