在比較的正式的來講描述三次握手,一般主動發起連線請求的我們習慣性叫客戶端,所以上面的計算機a和計算b即為客戶端和服務端,所以上圖的標識即為發起第一次客戶端向服務端發起建立會話請求,第二次服務回應已經收到了請求,第三次客戶端回應收到可以建立連線的回應。通常我們講兩次就應該可以建立請求,在自然對話中,你要和你對話,對方回應好的,接下的時間雙方就展開愉快的聊天。為什麼計算需要三次,又或者為什麼不是四次。這裡先籠統的回答一下兩次不可靠,三次為了保證可靠性,三次就可以保證可靠性,就沒有必要四次或者更多次。下面我們通過解釋為什麼需要是三次握手來記憶和分析。
我們需要明白的是tcp協議是全雙工的可靠的協議。我的理解是這樣子,既然是雙工,雙方計算計算都需要可讀(發)可寫(收),模擬於自然對話,我們可以簡單的這麼認為:嘴巴=發,耳朵=收。自然對話中我們需要確認雙方都有對話的能力,且雙方都知道自己的能力,
①a同學說b同學我要和你發起一輪對話,該次是試探性看ab有沒有對話的可能,a能發起請對話僅僅代表a的嘴巴的是正常,但是a對於b還一無所知。
②b同學回應a同學說我同意和你發起對話,該次表示b的耳朵是正常,接收到資訊了,同時b知道a嘴巴正常,a知道b的耳朵正常,a也知道b嘴巴正常。但是b不知道a的耳朵是否正常,此時建立對話,a並不可靠。
③a回應b說b我已經準備好和你對話了,b收到該資訊終於知道a的耳朵是正常,好吧我這邊也可以就緒了。
通過上面的樣例我們已經很清楚的知道a、b都是可收可發的,這樣子才算可靠。當然在我理解來講,為什麼客戶端不一次性告訴服務端可收可發情況都正常,服務端準備好資源建立連線,一起反饋客戶端資訊服務端可收可發,客戶端準備好資源建立連線。這樣子不就只有兩次了嗎。我認為有以下的原因:
a.我們要知道在複雜的網路環境中其實雙方都無法確認自己的資訊是可達的,另外tcp是全雙工,此時服務端也無法知道客戶端是否收到自己的seq值,在這種情況下如果伺服器有訊息要傳送給客戶端,假設是對齊資訊是和資料分開傳送,客戶端如果先收到資料後收到對齊資訊則無法處理,對齊資訊和資料一起傳送,如果客戶端無法接收則存在資源浪費,所以必不能這樣子設計,分開傳送的對齊資訊和資料也是比較合理的,避免資料先到無法處理的情況,同時也可以在一定程度上減少syn洪流的影響。
b.網路通訊世界存在短時間內多次會話,客戶端的埠存在復用,tcp協議是個五元組=ip+埠+協議+ip+埠,如果第一次握手客戶端傳送的syn資訊由於某些原因延遲,客戶端由於沒有收到服務端的ack,放棄該次會話請求,此時如果服務還要準備資源的明顯存在資源浪費。
c.網上比較多的解釋為什麼要三次握手,我理解也有一定合理性。
三次握手 主要是為了防止已失效的連線請求報文段突然有傳送到了b,因而產生錯誤。
「已失效的連線請求報文段」是指a發出連線請求,但因連線請求報文丟失二位收到確認。 於是a再重傳一次連線請求。後收到連線請求確認,建立連線。資料傳送完畢後,就釋放了連線。a共傳送了兩個連線請求報文段,其中第乙個丟失,第二個到達了b。沒有」已失效的連線請求報文段「。
現在假定出現一種異常情況,即a發出的第乙個連線請求報文段並沒有丟失,而是在某些網路節點長時間滯留了,以致延誤到連線釋放以後的某個時間才到達b。本來這是乙個早已失效的報文段。但b收到此失效的連線請求報文段後,就誤以為是a又發出一次新的連線請求。於是就向a發出確認報文段,同意建立連線。假定不採用三次握手,那麼只要b發出確認,新的連線就建立了。
由於現在a並沒有發出建立連線的請求,因此不會理財b的確認,也不會向b傳送資料。但b確以為新的運輸連線已經建立了,並一直等待a發來資料。b的許多資源就這樣白白浪費了。
採用三次握手的辦法可以防止上述現象的發生。
總結:三次握手比較合理,網路通訊環境太複雜,這樣子減少一些資源浪費,降低一些惡意影響,同時用較少的次數確認了機器和網路的資訊,所以這樣子設計還是相對合理的。
寫給自己:感覺第三次握手中傳送的ack的時候是可以一起傳送資料的,因為雙方的對齊資訊和狀態都已經同步了,但是實際設計中服務端是沒有準備好,好像發了也沒有用。
tcp三次握手 TCP 三次握手總結
tcp特點概述 tcp segment structure 段結構 step2 server host receives syn,replie with syn ack segment 答覆syn ack報文段 step3 client receives synack,replies with ac...
TCP 三次握手
tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...
TCP三次握手
1.伺服器準備好接受外來連線。passive open 被動開啟 需呼叫 socket bind listen 函式來完成。2.客戶端通過呼叫 connect 主動開啟 active open 這使得客戶 tcp傳送乙個 syn 表示同步 分節,這個分節告訴伺服器,客戶端將在待建立的連線中傳送的資料...