1. 程式人生 > >TCP三次握手和四次揮手過程以及連線為什麼使用三次連線,釋放使用四次

TCP三次握手和四次揮手過程以及連線為什麼使用三次連線,釋放使用四次

TCP三次握手: 第一次握手:客戶端A傳送位碼為SYN=1,隨機產生序號seq=123的資料包到伺服器B,伺服器B由SYN=1知道,A                       要求建立聯機; 第二次握手:伺服器B收到請求後要確認聯機資訊,向A傳送ACK=1,SYN=1,ack=(客戶端A的seq+1),隨機產生                   seq=321的包; 第三次握手:客戶端A收到後,檢查伺服器中的ack是否為第一次握手中if(seq+1==124),以及位碼ACK是否為1,若                    正確,主機A會再發送ACK=1,ack=322(主機B的seq+1=322),seq=123+1(第一次握手seq+1);主機B收到後確
                    認seq124是否等於第一次seq+1(123+1),與ACK=1則連線建立成功。 完成三次握手,主機A與主機B開始傳送資料。 為什麼不用兩次握手: 答:兩次握手會產生錯誤,加入A發了兩次連線請求a,b(因為伺服器迴應超時),第二次請求b先到達,然後與伺服器建立連線,但是當a到達的時候,伺服器以為客戶端又發出一條新連線,所以會發送確認,並在伺服器上為此次新連線配置資源,但是客戶端已經建立連線,並沒有發起新的連線,所以會丟掉伺服器這次發來的確認,而此時伺服器已經配置了資源,所以造成伺服器浪費。
TCP四次揮手: 原因:因為tcp通訊是全雙工狀態,所以有兩個方向,如果要釋放,就要將釋放兩條線路上的,所以是四次。 步驟:

1、A傳送FIN=1,seq=u,則此時A就不可以傳送資料了

2、主機B收到A傳送的FIN,表示收到了,就會發送ACK=1,seq=v,ack=u+1回覆,A->B鏈路釋 放掉了。

3、但這個時候B可能還在傳送資料,沒有想要關閉資料口的意思,所以等到B資料傳送完了,才會傳送FIN=1,ACK=1,seq=w,ack=u+1給主機A,此時B就不可以傳送資料了。

4、A收到B發來的FIN,知道B的資料也傳送完了,回覆ACK=1,seq=u+1,ack=w+1, A等待2MSL以後,沒有收到B傳來的任何訊息,知道B已經收到自己的ACK了,A就關閉連結,B也關閉連結了。 注意:為什麼要等待2MSL時間呢? 答:MSL(最長報文段壽命Maximum Segment Lifetime),建議2分鐘,所以要等近4分鐘 原因1:保證A傳送的最後一個ACK報文段可以到達B,使得B正常關閉。如果不等的話,A傳送的ack丟失,則會造成b無法關閉。等待則保證B能正常接收。如果在2MSL時間中,又收到B傳送的FIN(超時重傳),則A重新發送ACK,並重啟定時器。 原因2:防止出現“已失效的連線請求報文段”,經過2MSL時間可以保證本連線時間內的所有報文段都可以從網路消失。