??TCP協議:超時重傳、流量控制、keep-alive和埠號,你真的瞭解嗎?

努力的小雨發表於2023-11-06

引言

在之前的講解中,我們已經介紹了TCP協議的一些面試內容,相信大家對於TCP也有了一些新的瞭解。今天,我們將繼續深入探討TCP的超時重傳、流量控制、TCP的keepalive機制以及埠號等相關資訊。這些內容對於理解TCP協議的工作原理和實際應用非常重要,希望可以加深大家對TCP協議的理解。

TCP 的超時重傳時間是如何計算的

TCP具有超時重傳機制,即當一個資料包沒有收到確認回覆時,會在一定的時間間隔後進行重傳。這個時間間隔被稱為超時重傳時間(Retransmission TimeOut,簡稱RTO)。

image

經典方法(適用 RTT 波動較小的情況)

往返時延(RTT)是指資料從傳送端到接收端並返回傳送端所需的時間。

一種簡單的方法是取RTT的平均值,例如:第一次RTT為500ms,第二次RTT為800ms,那麼第三次傳送時,可以將兩次RTT取平均得到RTO為650ms。

為了確定超時重傳時間和更準確地估計RTT,經典演算法引入了「平滑往返時間」(Smoothed round trip time,SRTT):每次測量RTT後,都對SRTT進行更新計算,使其更加平滑和準確。

image

平滑因子α是用於計算平滑往返時間(SRTT)的一個引數,建議取值範圍為0.8至0.9。具體而言,當α為0.8時,SRTT的計算公式為80%的原始值加上20%的新取樣RTT值。

當α趨近於1時,SRTT會更接近上一次的SRTT值,對新的RTT值的影響較小。這意味著對於短暫的時延變化,SRTT會表現出較低的敏感性。

相反,當α趨近於0時,1-α趨近於1,SRTT會更接近新取樣的RTT值,與舊的SRTT值的關係較小。這意味著對於時延的變化,SRTT會表現出更高的敏感性,能夠更快速地跟隨時延的變化而調整。

透過調整平滑因子α的取值,TCP可以根據網路環境的不同情況來靈活地調整SRTT的計算方式,以適應不同的時延變化。這樣可以提高TCP的適應性和效能,使其能夠更好地應對網路條件的變化。

能不能說一說 TCP 的流量控制

當傳送方傳送資料時,TCP使用流量控制機制來確保接收方能夠處理所傳送的資料量。流量控制的目的是防止接收方因為資料過載而無法處理,從而導致資料丟失或者網路擁塞。

TCP的流量控制基於滑動視窗機制。滑動視窗是一個動態的視窗大小,它表示了傳送方可以連續傳送給接收方的資料量。接收方透過傳送ACK(確認)訊息來通知傳送方當前可接收的資料量,傳送方根據接收方的視窗大小來調整傳送的資料量。

具體來說,當建立TCP連線時,傳送方和接收方會協商一個初始的視窗大小,稱為初始視窗。初始視窗大小取決於接收方的接收能力和網路條件。傳送方會根據初始視窗大小傳送資料,接收方接收到資料後會傳送ACK訊息來確認接收。

在資料傳輸過程中,接收方會不斷更新視窗大小,通常透過TCP報文段中的視窗欄位來告知傳送方當前可接收的資料量。傳送方根據接收方的視窗大小來調整傳送的資料量,以確保傳送的資料不會超過接收方的處理能力。

如果接收方的視窗變小,傳送方會減少傳送的資料量以避免資料丟失或擁塞。當接收方的視窗變大時,傳送方可以增加傳送的資料量,從而提高資料傳輸的效率。

image

接收視窗(接收緩衝區中空閒的部分)

image

傳送端的資料包的狀態

在網路通訊中,存在以下幾種狀態:

  1. 已傳送且已確認:表示資料已經成功傳送到接收端,並且接收端已經傳送確認資訊回來。
  2. 已傳送但未確認:表示資料已經傳送到接收端,但接收端尚未傳送確認資訊回來。
  3. 未傳送但接收端可以接收:表示接收端已經準備好接收資料,但傳送端尚未傳送資料。
  4. 未傳送且不可傳送:表示接收端暫時沒有足夠的空間來接收資料,因此傳送端暫時無法傳送資料。

image

傳送端速度比較慢的情況

image

傳送端速度比較快的情況

image

如何理解 TCP 的keep-alive的原理

TCP的Keep-Alive機制是為了確保在長時間沒有資料傳輸的情況下,能夠檢測和保持TCP連線的活躍狀態。它透過定期傳送Keep-Alive報文來確認連線是否仍然有效。在一個TCP連線上,如果通訊雙方都不向對方傳送資料,那麼TCP連線就不會有任何資料交換。假設應用程式是一個web伺服器,如果客戶端在三次握手之後發生故障當機或者斷開網路連線,對於web伺服器而言,下一個資料包將永遠無法到來,但是它對此一無所知。因此,透過使用Keep-Alive機制,TCP可以定期傳送探測報文來檢測連線是否仍然有效,如果連線超過一定時間沒有收到對方的應答,就可以主動關閉連線,從而避免資源的浪費。

image

TCP協議的設計者考慮到了檢測長時間死連線的需求,因此設計了Keep-Alive機制。它的作用是透過定時傳送探測報文來檢測連線的對端是否存活,從而探測對端的連線是否失效。然而,預設情況下,TCP需要經過7200秒(2小時)沒有資料包互動才會傳送Keep-Alive探測報文。這個時間對於一些應用來說可能太長了,所以很多元件並沒有開啟Keep-Alive特性,而是選擇在應用層實現心跳機制來保持連線的活躍狀態。透過在應用層定時傳送心跳包,可以更及時地檢測連線的狀態,並且可以根據實際需求進行靈活的設定。這樣可以更好地滿足應用程式對連線可靠性的要求。

聊⼀聊TCP中的埠號

在TCP中,埠號是用於標識不同應用程式或服務的。它是一個16位的無符號整數,範圍從0到65535。TCP連線是透過源IP地址、源埠號、目標IP地址和目標埠號來唯一標識的。埠號分為兩種型別:系統埠和動態埠。

埠號與網路分層

image

TCP使用兩位元組的整數來表示埠號。每臺主機最大允許65536個埠號。

其中前1024個埠號是系統埠(也稱為眾所周知的埠),用於預留給一些特定的服務或應用程式使用。例如,HTTP通訊一般使用埠號80,HTTPS通訊一般使用埠號443,FTP使用埠號21等。系統埠號在作業系統中已經預定義好了。

已登記的埠號範圍是1024~49151,其中包括一些常見的服務和應用程式的埠號,例如MySQL使用埠號3306,Redis使用埠號6379,MongoDB使用埠號27017等。

而臨時埠號的範圍是49152~65535,用於臨時分配給客戶端應用程式使用。透過使用埠號,TCP可以實現多對多的通訊。

總結

本文深入探討了TCP協議的超時重傳、流量控制、keep-alive機制及埠號等相關內容。超時重傳是根據RTT計算的,透過平滑往返時間(SRTT)來靈活調整超時重傳時間。流量控制使用滑動視窗機制,根據接收方視窗大小調整傳送資料量。Keep-alive機制透過定期傳送探測報文保持TCP連線活躍。埠號用於標識應用程式或服務,分為系統埠和動態埠。這些內容對於理解TCP協議的工作原理和應用非常重要。

以上只是一篇關於TCP協議的面試文章的一小部分內容。後續將會提供更多有針對性的面試題,以深入探討TCP協議的相關細節。

相關文章