關于傳輸層中的TCP協議,我們在之前的博客中對其報文格式、三次握手、四次揮手、流量控制、數據傳輸等機制進行了具體說明,接下來在前面所學的基礎上,我們再來講講TCP中三次握手和四次揮手各階段所處的狀態機以及為什么要使用三次握手和四次揮手?最后再來補充TCP的擁塞控制。
TCP三次握手和四次揮手過程中的狀態機
三次握手
三次握手詳細過程如下:
- 在未進行三次握手時,客戶端和服務端都處于closed狀態,當客戶端主動發起連接時,服務端被動打開,進入listen狀態。客戶端發送SYN置位,seq=x的包,表示想和服務端建立連接,稱為第一次握手,隨即客戶端接入SYN_SENT狀態;
- 服務端收到包后,立即回復SYN、ACK置位,seq=y,ack=x+1的包,表示同意和客戶端建立連接,并且自己也想和客戶端建立連接,稱為第二次握手,隨即進入SYN_RCVD狀態;
- 客戶端收到包后,發送ACK置位,seq=x+1,ack=y+1的包,表示同意和服務端建立連接,稱為第三次握手,隨即進入established狀態;
- 服務端收到包后,也進入established狀態,TCP連接成功建立。
三次握手中的哪一次握手可以開始傳輸數據?
第三次握手,表示客戶端和服務器都建立了連接,客戶端可以攜帶要傳輸的數據。
四次揮手
四次揮手詳細過程如下:
- 當客戶端數據傳輸完畢后,主動發送FIN置位,seq=u的包,表示想和服務端斷開連接,稱為第一次揮手,隨即客戶端接入FIN WAIT1狀態;
- 服務端收到包后,回應一個ACK置位,seq=v,ack=u+1的包,表示同意和客戶端斷開連接,稱為第二次揮手,隨即服務端接入CLOSE WAIT狀態;
- 客戶端收到包后,進入FIN WAIT2狀態;
- 等待服務端的數據傳輸完畢后,服務端主動發送FIN、ACK置位,seq=w,ack=u+1的包,表示想和客戶端斷開連接,稱為第三次揮手,隨即服務端進入LAST ACK狀態;
- 客戶端收到包后,回應一個ACK置位,seq=u+1,ack=w+1的包,表示同意和服務端斷開連接,稱為第四次揮手,隨即進入TIME WAIT狀態;
- 服務端收到包后,進入closed狀態;
- 等待TIME WAIT時間結束后,客戶端也進入closed狀態,TCP連接成功斷開。
為什么客戶端要等待TIME WAIT時間?
為了確保同意斷開連接的響應能安全發送到服務端,避免造成服務端收不到響應而無法關閉連接。
圖片來源:TCP三次握手與四次揮手詳解_三次握手和四次揮手-CSDN博客
使用三次握手和四次揮手的原因
三次握手
為什么TCP建立連接要使用三次握手,而不是兩次握手、四次握手?
為了避免歷史連接、避免服務器資源浪費、同時也為了初始化序列號。
- 避免歷史連接:在IP網絡中傳輸的數據是不安全的、無序的,當客戶端發送的第一個連接請求由于網絡延遲導致比第二個連接請求晚到服務端時,服務端對兩個連接請求都進行了回應,如果此時采用兩次握手的話,客戶端無法判斷出服務端回應的是哪一個請求,就造成了歷史連接。如果采用三次握手的話,客戶端就能夠判斷出服務端是對哪一個請求進行回應,就可以避免歷史連接。
- 避免服務器資源浪費:如果TCP連接采用的是兩次握手,當客戶端的連接請求在網絡中阻塞,客戶端沒有接收到確認報文,就會重新發送連接請求 ,由于沒有第三次握手,服務器不清楚客戶端是否收到了自己發送的確認信號,所以每收到一個 SYN 就只能先主動建立一個連接,那么服務器在收到請求后就會建立多個冗余的無效鏈接,造成資源浪費。若是采用三次握手,就不會產生這種情況。
- 初始化序列號:序列號在 TCP 連接中有著非常重要的作用,當客戶端發送攜帶序列號的連接請求的時候,需要服務端回應確認報文,表示客戶端的請求報文已被服務端成功接收,那當服務端發送攜帶序列號的連接請求給客戶端時,依然也要得到客戶端的回應,這樣一來一回,確保雙方的初始序列號能被可靠的同步,以上這種情況就需要進行三次握手。
四次揮手
為什么TCP連接斷開需要使用四次揮手,而不是兩次揮手、三次揮手?
因為TCP連接建立的是雙向的連接,既有客戶端到服務端的連接,也有服務端到客戶端的連接,而一個方向的連接斷開就需要請求和應答兩個報文,所以TCP斷開連接就需要四個報文,即四次揮手。
擁塞控制
TCP有了流量控制之后為什么還需要擁塞控制?
因為流量控制的作用是為了解決發送方和接收方速度不一致而導致數據丟失的問題,即兩個端點的問題,而擁塞控制是為了解決太多的數據注入到網絡中而導致網絡崩潰的問題,即兩個端點中間鏈路的問題。
流量控制方式:由接收端采用滑動窗口的形式,告知發送方允許/停止發包解決TCP丟包問題。
擁塞控制方式:由發送方采用擁塞窗口的形式去判斷網絡狀態,從而采取不同算法執行TCP動態發包解決網絡整體質量問題。
擁塞控制的四種算法:
- 慢開始
- 擁塞避免
- 超時重傳
- 快重傳和快恢復
具體原理請參考:TCP流量控制和擁塞控制詳解!圖解分,兩分鐘搞定TCP知識點!-CSDN博客