tcp程式設計時,在雙方正式通訊之前,首先需要經過三次握手。但是據我所知,三次握手中,第三次傳送ACK的時候,如果此時ACK丟失,那麼服務端在一段時間內沒收到ACK,服務端就會重新發送SYN+ACK,以確保正確建立連線。而客戶端在發出ACK的時候,狀態就由SYN_SEND轉換為了ESTABLISHED,如果在ACK丟失的情況下(此時並沒有真正建立連線,但客戶端以為已經建立連線了),客戶端開始send資料給服務端,將會觸發RST,關閉連線
回覆列表
-
1 # 喲喲吼說科技
-
2 # 貓的天空之城Ty
標準是客戶端與伺服器之間可以通訊,並不是最後一次客戶端發給服務端的ACK包,三次握手並不能保證tcp的可靠性,這也不是tcp協議存在的問題,而是諸多協議想在不可靠通道上可靠傳輸的最低要求。
如題,TCP連線中,connect連線成功的標準是什麼?
喲喲認為在客戶端傳送完第三次ACK後即表明connect連線成功。
上圖為TCP三次握手建立連線的過程:
1、客戶端傳送SYN至伺服器端,客戶端狀態變為SYN-SENT;
2、伺服器端在接收到資料請求後,伺服器狀態迴應資料包後,狀態變為SYN-RCVD;
3、客戶端在接收到迴應的資料包後,迴應第三次ACK,客戶端狀態變為ESTAB-LISHED;
4、伺服器端接收到資料包後,伺服器的狀態才能進入ESTAB-LISHED;這時才能完成連線,可以進行資料傳送;
可以看出客戶端在傳送完第三次ACK後,狀態立刻變為ESTAB-LISHED,客戶端不會去在意自己傳送的ACK是否丟失,客戶端可以以ACK+DATA的格式來發送資料。當此資料包到達伺服器端時,雖然伺服器端的狀態為SYN-RVCD,但其依然可以將DATA快取下來,並且對ACK進行認證,即伺服器端進入ESTAB-LISHED狀態,最後將DATA提交給應用程式去處理。
因此喲喲認為,在客戶端傳送完第三次ACK後,自身狀態變為ESTAB-LISHED,就表示connect成功返回,可以接收使用者的資料。