說說 TCP 的四次揮手?
TCP的四次揮手事用于安全關閉一個已建立的連接的過程,它確保雙方都能完成數據傳輸并安全地釋放連接資源。
簡述步驟:
- 第一次揮手(FIN --> ACK):客戶端主動關閉連接,發送FIN包,進入FIN_WAIT_1狀態。服務器收到FIN后,表示不再接收數據,但仍可能繼續發送數據。
- 第二次揮手(ACK):服務器發送ACK包,確認已收到FIN。此時服
- 務器進入CLOSE_WAIT狀態,客戶端進入FIN_WAIT_2狀態。
- 第三次揮手(FIN --> ACK):服務器完成所有數據傳輸后,發送FIN包,進入LAST_ACK狀態。客戶端收到FIN后,準備關閉連接。
- 第四次揮手(ACK):客戶端發送最后一個ACK包,進入TIME_WAIT狀態,等待可能遲到的FIN包。服務器收到ACK后,關閉連接,進入CLOSED狀態。客戶端在TIME_WAIT計時結束后(2MSL),正式關閉連接。
TCP 的粘包和拆包能說說嗎?
- 粘包與拆包(也稱半包)現象:
- 粘包:TCP傳輸中,發送方的多個數據包在接收方被合并成一個包接收,導致多條消息數據粘在一起,接收方無法正確區分這些消息的邊界。
- 拆包:指的是發送方的一個數據包在接收方被分成了多個包接收,導致一條完整的消息被拆成多個部分,接收方無法一次性接收到完整的數據。
- 原因:
- 粘包:主要由于TCP是面向字節流的協議,它不關心數據邊界,數據在發送方可能被一次性發送,接收方在讀取時可能會將多個消息拼接在一起。
- 拆包:可能由于網絡傳輸中的MTU(最大傳輸單元)限制或發送緩沖區大小限制,一個大包被分成了多個小包傳輸。
- 解決方法:
- 使用定長消息:每個消息都有固定的長度,接收方按照固定長度讀取數據。
- 添加消息分隔符:在每個消息之間添加特定的分隔符(如換行符),接收方可以通過分隔符來區分消息。
- 使用消息頭:在消息的頭部添加一個長度字段,指示消息的長度,接收方根據這個長度來讀取響應長度的數據。
說說 TCP 擁塞控制的步驟?
-
慢啟動(Slow Start):
發送方在連接建立初期,緩慢地增加數據發送速率。初始地擁塞窗口(cwnd)通常為一個MSS(最大報文段大小),然后再每次收到ACK后成倍增加cwnd,直到達到慢啟動閾值(ssthresh)或檢測到網絡擁塞。
-
擁塞避免(Congestion Avoidance):
當cwnd達到ssthresh后,TCP進入擁塞避免階段,擁塞窗口地增長速度從指數變為線性增長,即每個RTT(往返時間)增加一個MSS。這一階段旨在避免激烈的擁塞反應,保持網絡穩定性。
-
快速重傳(Fast Retransmit):
發送方在收到三個重復的ACK后,立即重傳被認為丟失的報文段,而無需等待超時。這減少了重傳的延遲,迅速應對數據丟失。
-
快速恢復(Fast Recovery):
在快速重傳后,TCP不進入慢啟動,而是減小cwnd到當前的一半,并設置ssthresh為當前新的cwnd的值,然后開始線性增加cwnd,以快速恢復到丟包前的傳輸速率。