為什麼TCP連線要三次握手?

2021-08-21 13:22:54 字數 714 閱讀 3271

因為網路層是不可靠的。雙方在通訊的時候,就算是 tcp 連線,在網路層都有可能丟包,只不過是傳輸層有處理丟包的策略。若 tcp 連線是兩次握手,那麼突然來了乙個已失效的客戶端連線請求報文,伺服器會把這次失效的連線當成正常的連線對待。謝希仁版計算機網路中給出的例子如下:client 發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了(可能是網路延遲),以致延誤到連線釋放以後的某個時間才到達 server。本來這是乙個早已失效的報文段。但 server 收到此失效的連線請求報文段後,就誤認為是 client 再次發出的乙個新的連線請求。於是就向 client 發出確認報文段,同意建立連線。假設不採用"三次握手",那麼只要 server 發出確認,新的連線就建立了。由於現在 client 並沒有發出建立連線的請求,因此不會理睬 server 的確認,也不會向 server 傳送資料。但 server 卻以為新的傳輸連線已經建立,並一直等待 client 發來資料。這樣,server 的很多資源就白白浪費掉了。採用"三次握手"可以防止上述現象發生。

其實兩次握手還有乙個不好的地方,就是會更容易受到 syn 攻擊。我之前把關於 syn 攻擊原理的知識做了整理。原本三次握手情況下,伺服器在多次等不到客戶端的 ack 報文後,就會把分配的資源釋放掉。現在換成兩次握手,由於沒有第三次的 ack 報文,伺服器的資源就會一直被"浪費"。

TCP為什麼要三次握手?

在 計算機網路 一書中其中有提到,三次握手的目的是 為了防止已經失效的連線請求報文段突然又傳到服務端,因而產生錯誤 這種情況是 一端 client a發出去的第乙個連線請求報文並沒有丟失,而是因為某些未知的原因在某個網路節點上發生滯留,導致延遲到連線釋放以後的某個時間才到達另一端 server b。...

TCP為什麼要進行三次握手

今天無意中想起了這個問題,談談我的理解。先上圖 先約定兩個名字。a代表連線建立的發起方 客戶端 b代表連線建立的接收方 服務端 tcp連線是在實際通道中是全雙工的,即邏輯上分成兩個通道,乙個是a b,另乙個b a。要在不可靠的通道上建立起可靠的連線,那麼必須保證兩個通道是可靠的。而三次握手的過程就是...

為什麼要三次握手

tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來儲存從伺服器傳送來...