1. 程式人生 > >為什麼tcp建立連線是三次握手而不是兩次握手或者四次握手?(筆試面試常考)

為什麼tcp建立連線是三次握手而不是兩次握手或者四次握手?(筆試面試常考)

        先說說tcp三次握手,  不細說了, 也就是syn,  ack/syn,  ack.

        為什麼不能是兩次呢?

        先假設是兩次吧。我們知道, tcp的連線過程中有一個超時重傳演算法(karn演算法是比較典型的), 如果client發出syn包後, 由於網路原因, 沒有立即收到ack/syn包, 那麼client會再次發起syn包, 這一點, 我們已經多次實驗過。

        如果第二次syn包正常達到且與server端建立了tcp連線, server端維護了一個連線, 一次貌似OK, 但別忘了, 第一次那個syn包可能就在此時達到server端了, 於是server端又要維護一個連線, 而這個連線是無效的, 可以認為是死連線。 而一個程序開啟的socket是有限度的, 維護這些死連線非常耗費資源。

        所以, 二次握手, 服務端有較大隱患, 容易因為資源耗盡而崩潰。

        而三次握手, 可以避免如上問題, 想想為什麼。

        實際上, 三次握手中, client和server都有一個發syn和收ack的過程, 雙方都是發後能收, 表明通訊則準備工作OK.

         舉個簡單例子吧:

         A:  美女, 你好

         B:  你好, 我線上, 有什麼要聊的?

         此時A知道B收到訊息了, 但B並不知道A能收到訊息啊。 所以, 兩次握手不太靠譜。

          為什麼不是四次握手呢? 大家應該知道通訊中著名的藍軍紅軍約定, 這個例子說明, 通訊不可能100%可靠, 而上面的三次握手已經做好了通訊的準備工作, 再增加握手, 並不能顯著提高可靠性, 而且也沒有必要。

          大家也可以思考一下, 這是個有趣的問題。