TCP 傳輸連接管理
因為 TCP 三次握手建立連接、四次揮手釋放連接很重要,所以附上《計算機網絡(第 7 版)-謝希仁》書中對此章的詳細描述:https://gitee.com/huihut/interview/raw/master/images/TCP-transport-connection-management.png
TCP 三次握手建立連接
【TCP 建立連接全過程解釋】
客戶端發送 SYN 給服務器,說明客戶端請求建立連接;
服務端收到客戶端發的 SYN,并回復 SYN+ACK 給客戶端(同意建立連接);
客戶端收到服務端的 SYN+ACK 后,回復 ACK 給服務端(表示客戶端收到了服務端發的同意報文);
服務端收到客戶端的 ACK,連接已建立,可以數據傳輸。
TCP 為什么要進行三次握手?
【答案一】因為信道不可靠,而 TCP 想在不可靠信道上建立可靠地傳輸,那么三次通信是理論上的最小值。(而 UDP 則不需建立可靠傳輸,因此 UDP 不需要三次握手。)
【答案二】因為雙方都需要確認對方收到了自己發送的序列號,確認過程最少要進行三次通信。
【答案三】為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。
TCP 四次揮手釋放連接
【TCP 釋放連接全過程解釋】
客戶端發送 FIN 給服務器,說明客戶端不必發送數據給服務器了(請求釋放從客戶端到服務器的連接);
服務器接收到客戶端發的 FIN,并回復 ACK 給客戶端(同意釋放從客戶端到服務器的連接);
客戶端收到服務端回復的 ACK,此時從客戶端到服務器的連接已釋放(但服務端到客戶端的連接還未釋放,并且客戶端還可以接收數據);
服務端繼續發送之前沒發完的數據給客戶端;
服務端發送 FIN+ACK 給客戶端,說明服務端發送完了數據(請求釋放從服務端到客戶端的連接,就算沒收到客戶端的回復,過段時間也會自動釋放);
客戶端收到服務端的 FIN+ACK,并回復 ACK 給客戶端(同意釋放從服務端到客戶端的連接);
服務端收到客戶端的 ACK 后,釋放從服務端到客戶端的連接。
TCP 為什么要進行四次揮手?
【問題一】TCP 為什么要進行四次揮手?/ 為什么 TCP 建立連接需要三次,而釋放連接則需要四次?
【答案一】因為 TCP 是全雙工模式,客戶端請求關閉連接后,客戶端向服務端的連接關閉(一二次揮手),服務端繼續傳輸之前沒傳完的數據給客戶端(數據傳輸),服務端向客戶端的連接關閉(三四次揮手)。所以 TCP 釋放連接時服務器的 ACK 和 FIN 是分開發送的(中間隔著數據傳輸),而 TCP 建立連接時服務器的 ACK 和 SYN 是一起發送的(第二次握手),所以 TCP 建立連接需要三次,而釋放連接則需要四次。
【問題二】為什么 TCP 連接時可以 ACK 和 SYN 一起發送,而釋放時則 ACK 和 FIN 分開發送呢?(ACK 和 FIN 分開是指第二次和第三次揮手)
【答案二】因為客戶端請求釋放時,服務器可能還有數據需要傳輸給客戶端,因此服務端要先響應客戶端 FIN 請求(服務端發送 ACK),然后數據傳輸,傳輸完成后,服務端再提出 FIN 請求(服務端發送 FIN);而連接時則沒有中間的數據傳輸,因此連接時可以 ACK 和 SYN 一起發送。
【問題三】為什么客戶端釋放最后需要 TIME-WAIT 等待 2MSL 呢?
【答案三】
(1)為了保證客戶端發送的最后一個 ACK 報文能夠到達服務端。若未成功到達,則服務端超時重傳 FIN+ACK 報文段,客戶端再重傳 ACK,并重新計時。
(2)防止已失效的連接請求報文段出現在本連接中。TIME-WAIT 持續 2MSL 可使本連接持續的時間內所產生的所有報文段都從網絡中消失,這樣可使下次連接中不會出現舊的連接報文段。
TCP 有限狀態機
TCP 有限狀態機圖片
今天的分享就到這里了,大家要好好學C++喲~
編輯:jq
-
TCP
+關注
關注
8文章
1378瀏覽量
79306 -
C++
+關注
關注
22文章
2114瀏覽量
73859 -
服務端
+關注
關注
0文章
66瀏覽量
7058
原文標題:C++基礎語法梳理:計算機網絡丨傳輸管理(TCP)
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論