TCP連線為什麼三次握手和四次揮手

FreeeLinux發表於2017-01-30

最近開始複習了,以前學過的網路知識有點遺忘,所以做一點總結,讓自己回憶起來。

為什麼要三次握手

為什麼TCP連線採用三次握手而不是兩次,四次?

TCP的核心思想是,既要保證資料可靠傳輸,又要保證傳輸的效率。而三次恰好可以滿足這兩方面的需求。三次握手目的在於同步連線雙方的序列號和確認號並交換 TCP視窗大小資訊,讓雙方都確認自己傳送的資訊對方能夠收到。這樣三次就足夠了,四次效率低且浪費資源。如果採用兩次握手,並不能保證資料的可靠傳輸。舉例如下:

client認為傳送的第一個SYN請求報文段丟失,然後發起第二個SYN,如果是兩次握手,server端回應後連線就建立了。然而client發出的第一個SYN請求報文段並沒有丟失,而是在某個網路節點長時間滯留了,以致延誤到client-server連線釋放以後它才到達了server。本來這是一個早已失效的報文段,但server收到此失效的連線請求報文段後,就誤認為client再次發出一個新連線請求。於是就向client發出確認報文段,同意建立連線。在兩次握手的情況向,這時新的連線就建立了。但是client實際上並沒有發出建立連線的請求,因此並不會理睬server的確認,也不會像server傳送資料。但server卻單方面認為連線已經建立,就開始一直等待client傳送資料。這樣,server的資源就白白浪費掉了。採用”三次握手”的辦法可以防止上述現象發生。

實際上,三次握手可理解為兩次握手(兩次SYN)和兩次確認(兩次ACK),只不過中間的握手和確認合併為1次,這也是傳輸效率的一個體現。並且最後一次確認某些情況下可能會和資料一塊傳送,這和經受時延的ACK有關。

下面是TCP三次握手和四次揮手的圖,來自於酷殼網。
這裡寫圖片描述

為什麼要四次揮手?

TCP連線是一種面向連線的、可靠地、基於位元組流的運輸層通訊協議。TCP是全雙工模式,這就意味著,當主機A傳送FIN報文段時,只是表示主機A沒有資料要傳送了。但是,這個時候主機A還是可以接受來自主機B的資料,處於半關閉狀態;當主機B返回ACK報文段時,表示主機B已經知道主機A沒有資料要傳送了,但是主機B此時還是可以傳送資料到主機A的;只有當主機B也傳送FIN報文段時,表示主機B也沒有資料要傳送了。此時雙方都關閉了連線,全雙工TCP連線就真正斷開了。

實際上,有可能是三次揮手。被動關閉的一端由於不需要再傳送資料了。因此ACK和FIN可能會一起傳送。

相關文章