弄清這個問題,我們需要先弄明白三次握手的目的是什么,能不能只用兩次握手來達到同樣的目的。
第一次握手:客戶端發送網絡包,服務端收到了。 這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。
第二次握手:服務端發包,客戶端收到了。 這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器并不能確認客戶端的接收能力是否正常。
第三次握手:客戶端發包,服務端收到了。
這樣服務端就能得出結論:
客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。 因此,需要三次握手才能確認雙方的接收與發送能力是否正常。
試想如果是用兩次握手,則會出現下面這種情況:
如客戶端發出連接請求,但因連接請求報文丟失而未收到確認,于是客戶端再重傳一次連接請求。
后來收到了確認,建立了連接。
數據傳輸完畢后,就釋放了連接,客戶端共發出了兩個連接請求報文段,其中第一個丟失,第二個到達了服務端,但是第一個丟失的報文段只是在某些網絡結點長時間滯留了,延誤到連接釋放以后的某個時間才到達服務端,此時服務端誤認為客戶端又發出一次新的連接請求,于是就向客戶端發出確認報文段,同意建立連接,不采用三次握手,只要服務端發出確認,就建立新的連接了,此時客戶端忽略服務端發來的確認,也不發送數據,則服務端一致等待客戶端發送數據,浪費資源。