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

引言

  • TCP 創建鏈接與斷開鏈接的過程
  • TCP 泛洪攻擊(TCP 創建鏈接過程當中的攻擊手段)與防禦

TCP 創建鏈接與斷開鏈接的過程

TCP 三次握手(鏈接過程)

第一次握手前端

客戶端向服務端發送鏈接請求報文段。該報文段中包含自身的數據通信初始序號。請求發送後,客戶端便進入 SYN-SENT 狀態。git

第二次握手github

服務端收到鏈接請求報文段後,若是贊成鏈接,則會發送一個應答,該應答中也會包含自身的數據通信初始序號,發送完成後便進入 SYN-RECEIVED 狀態。面試

第三次握手算法

當客戶端收到鏈接贊成的應答後,還要向服務端發送一個確認報文。客戶端發完這個報文段後便進入 ESTABLISHED 狀態,服務端收到這個應答後也進入 ESTABLISHED 狀態,此時鏈接創建成功。服務器

爲何須要三次握手,2次不行嗎?cookie

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

若是隻有 2 次的話,B 並不清楚 A 是否收到他發過去的信息。url

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 面試題庫 算法題庫

相關文章
相關標籤/搜索