為什麼TCP需要“三次握手”、“四次揮手”? 阿新 • • 發佈:2018-12-25 更多傳輸層知識點:傳輸層的UDP通訊和TCP通訊 為什麼TCP需要“三次握手”、“四次揮手”? 三次握手過程 1、連線過程最新的一次連線都不可靠,因為最新的這次連線可能丟包、損壞等。 2、如果是兩次握手,伺服器在接收到連線請求後,需要建立資料結構來維護連線請求,如果伺服器的ACK丟失的狀況大量出現,那麼會出現SYN攻擊伺服器 3、三次握手保護伺服器,第三次ACK丟失,客戶端認為連線成功,伺服器處於半連線狀態,伺服器認為連線沒有成功,只有客戶端會建立資料結構維護連結,如此伺服器可以達到高效、安全。客戶端給伺服器傳送資料,伺服器的資料結構沒有建立好,TCP首部的標誌位RST復位置1,報文重新建立連線。 四次揮手過程 1、揮手是雙向的,不僅要拆除客戶端對於伺服器的連線,還要拆除伺服器對於客戶端的連線。 2、客戶端傳送FIN包給伺服器,伺服器知道了客戶端要把連線斷開了,伺服器把自己的連線狀態改為半連線狀態,繼續接受客戶端的資料,但不再發送資料給客戶端,並且給客戶端傳送ACK確認包,客戶端收到ACK之後,客戶端到服務端的連線就拆除了。由於網路中可能還存在雙方之前傳送的資料,因此,伺服器要在保證資料傳輸完畢了之後,給客戶端傳送FIN包拆除伺服器給客戶端建立的連線。 3、客戶端收到服務端的FIN包之後,知道伺服器也要斷開伺服器對於客戶端建立的連線了,然後客戶端回覆伺服器,告訴伺服器它收到了斷開連線的FIN報,此時雙向連線均已拆除,可是伺服器並不知道自己的FIN包是否被客戶端接收,客戶端的ACK也有可能丟失,因此,進入TIME_WAIT狀態。 syn泛洪攻擊 SYN攻擊利用的是TCP的三次握手機制,攻擊端利用偽造的IP地址向被攻擊端發出請求(SYN),而被攻擊端發出的響應報文(ACK+SYN)將永遠傳送不到目的地,那麼被攻擊端在等待關閉這個連線的過程中(半連線掛起等待狀態,接收不到攻擊端的ACK,就重發ACK+SYN,直到超過時間SYN timeout,才會丟棄連線,釋放資源)消耗了資源,如果有成千上萬的這種連線,主機資源將被耗盡,從而達到攻擊的目的。 為什麼會有TIME_WAIT? 1、主動關閉方在最後一次傳送ACK之後,有可能這個ACK會丟掉,被動方等待一段時間之後,沒有接收到ACK會認為FIN請求沒有傳送成功,然後重新發送一個FIN到主動方,如果主動方傳送ACK之後直接關閉,釋放資源,那麼當傳送的ACK丟失後被動方會維持這個無效連結很長時間,浪費被動斷開方資源。如果主動方又重新建立socket,會對新的socket造成影響。 2、因此我們讓主動方等待2個MSL時間,確保ACK已經發送到對方,在這個時刻如果收到被動方超時重傳的FIN包,計時器重置。(MSL最大報文生存週期) 3、TIME_WAIT狀態,等待時間是為了保護主動關閉方,在超過2個MSL時間後主動方再收到FIN包,這個FIN包將會被丟棄,不再傳到主動方。 4、有TIME_WAIT,就可以保證最後一個報文在某種程度達到基本可靠,“TIME_WAIT期間沒有訊息就是好訊息” 5、有TIME_WAIT,把通訊通道雙方以前的合法資料儘量消散。