1. 程式人生 > >TCP連線建立過程中為什麼需要“三次握手”

TCP連線建立過程中為什麼需要“三次握手”

傳輸控制協議(Transmission Control Protocol, TCP)是一種面向連線的、可靠的、基於位元組流的運輸層(Transport layer)通訊協議。是專門為了在不可靠的網際網路絡上提供一個可靠的端到端位元組流而設計的。網際網路絡與單個網路不同,因為網際網路絡的不同部分可能有著截然不同的拓撲、頻寬、延遲、分組大小和其他引數。TCP的設計目標是能夠動態的適應網際網路絡的這些特性,而且當面對多種失敗的時候仍然能夠健壯。
每一次TCP連線都需要三個階段:連線建立、資料傳送和連線釋放。“三次握手”就發生在連線建立階段。“三次握手”的具體過程網上有很多詳解。可自行Google之。這裡探討的是——為什麼需要“三次握手”。
我Google該問題答案後發現,網路上對於“三次握手”的過程都有很詳細的描述,但對於為什麼需要“三次握手”來建立連線卻沒有很好的答案。只能求助於書本了。
在謝希仁著《計算機網路》第四版中講“三次握手”的目的是“為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤

”。在另一部經典的《計算機網路》一書中講“三次握手”的目的是為了解決“網路中存在延遲的重複分組”的問題。這兩種不用的表述其實闡明的是同一個問題。

謝希仁版《計算機網路》中的例子是這樣的,“已失效的連線請求報文段”的產生在這樣一種情況下:client發出的第一個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用“三次握手”,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。”
這個例子很清晰的闡釋了“三次握手”對於建立可靠連線的意義。

在Google Groups的TopLanguage中看到一帖討論TCP“三次握手”覺得很有意思。貼主提出“TCP建立連線為什麼是三次握手?”的問題,在眾多回復中,有一條回覆寫道:“這個問題的本質是, 通道不可靠, 但是通訊雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在訊息中包含什麼資訊, 三次通訊是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足”在不可靠通道上可靠地傳輸資訊”這一需求所導致的. 請注意這裡的本質需求,通道不可靠, 資料傳輸要可靠. 三次達到了, 那後面你想接著握手也好, 發資料也好, 跟進行可靠資訊傳輸的需求就沒關係了. 因此,如果通道是可靠的, 即無論什麼時候發出訊息, 對方一定能收到, 或者你不關心是否要保證對方收到你的訊息, 那就能像UDP那樣直接傳送訊息就可以了”。這可視為對“三次握手”目的的另一種解答思路。