TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?
引言
在之前的講解中,我們已經介紹了TCP協議的一些面試內容,相信大家對于TCP也有了一些新的了解。今天,我們將繼續深入探討TCP的超時重傳、流量控制、TCP的keepalive機制以及端口號等相關信息。這些內容對于理解TCP協議的工作原理和實際應用非常重要,希望可以加深大家對TCP協議的理解。
TCP 的超時重傳時間是如何計算的
TCP具有超時重傳機制,即當一個數據包沒有收到確認回復時,會在一定的時間間隔后進行重傳。這個時間間隔被稱為超時重傳時間(Retransmission TimeOut,簡稱RTO)。
經典方法(適用 RTT 波動較小的情況)
往返時延(RTT)是指數據從發送端到接收端并返回發送端所需的時間。
一種簡單的方法是取RTT的平均值,例如:第一次RTT為500ms,第二次RTT為800ms,那么第三次發送時,可以將兩次RTT取平均得到RTO為650ms。
為了確定超時重傳時間和更準確地估計RTT,經典算法引入了「平滑往返時間」(Smoothed round trip time,SRTT):每次測量RTT后,都對SRTT進行更新計算,使其更加平滑和準確。
平滑因子α是用于計算平滑往返時間(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報文段中的窗口字段來告知發送方當前可接收的數據量。發送方根據接收方的窗口大小來調整發送的數據量,以確保發送的數據不會超過接收方的處理能力。
如果接收方的窗口變小,發送方會減少發送的數據量以避免數據丟失或擁塞。當接收方的窗口變大時,發送方可以增加發送的數據量,從而提高數據傳輸的效率。
接收窗口(接收緩沖區中空閑的部分)
發送端的數據包的狀態
在網絡通信中,存在以下幾種狀態:
- 已發送且已確認:表示數據已經成功發送到接收端,并且接收端已經發送確認信息回來。
- 已發送但未確認:表示數據已經發送到接收端,但接收端尚未發送確認信息回來。
- 未發送但接收端可以接收:表示接收端已經準備好接收數據,但發送端尚未發送數據。
- 未發送且不可發送:表示接收端暫時沒有足夠的空間來接收數據,因此發送端暫時無法發送數據。
發送端速度比較慢的情況
發送端速度比較快的情況
如何理解 TCP 的keep-alive的原理
TCP的Keep-Alive機制是為了確保在長時間沒有數據傳輸的情況下,能夠檢測和保持TCP連接的活躍狀態。它通過定期發送Keep-Alive報文來確認連接是否仍然有效。在一個TCP連接上,如果通信雙方都不向對方發送數據,那么TCP連接就不會有任何數據交換。假設應用程序是一個web服務器,如果客戶端在三次握手之后發生故障宕機或者斷開網絡連接,對于web服務器而言,下一個數據包將永遠無法到來,但是它對此一無所知。因此,通過使用Keep-Alive機制,TCP可以定期發送探測報文來檢測連接是否仍然有效,如果連接超過一定時間沒有收到對方的應答,就可以主動關閉連接,從而避免資源的浪費。
TCP協議的設計者考慮到了檢測長時間死連接的需求,因此設計了Keep-Alive機制。它的作用是通過定時發送探測報文來檢測連接的對端是否存活,從而探測對端的連接是否失效。然而,默認情況下,TCP需要經過7200秒(2小時)沒有數據包交互才會發送Keep-Alive探測報文。這個時間對于一些應用來說可能太長了,所以很多組件并沒有開啟Keep-Alive特性,而是選擇在應用層實現心跳機制來保持連接的活躍狀態。通過在應用層定時發送心跳包,可以更及時地檢測連接的狀態,并且可以根據實際需求進行靈活的設置。這樣可以更好地滿足應用程序對連接可靠性的要求。
聊?聊TCP中的端口號
在TCP中,端口號是用于標識不同應用程序或服務的。它是一個16位的無符號整數,范圍從0到65535。TCP連接是通過源IP地址、源端口號、目標IP地址和目標端口號來唯一標識的。端口號分為兩種類型:系統端口和動態端口。
端口號與網絡分層
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協議的相關細節。
總結
以上是生活随笔為你收集整理的TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个基于.NET7的开源DNS服务 Dn
- 下一篇: 设计模式六大原则