-
1 # 喲喲吼說科技
-
2 # EasyNetworking
看有人列舉了很多TCP和UDP的特性,但是還是沒有從根本上回答出為什麼TCP會慢以及怎麼減少資料傳送延遲。
首先要肯定一點,在區域網內部,底層網絡卡基於CSMA接收網路包,不再有中心節點瓶頸問題,而且隨著底層物理層技術的發展,現在區域網的丟包錯包機率已經非常之低,在這個層面,UDP和TCP有著相同的網絡卡丟包機率。
IP層分包這種情況也是基本不會出現在TCP上,通常在區域網上,網絡卡MTU預設值在1500左右,而大部分的系統核心網路協議棧會把TCP的MSS預設值設定的遠小於這個值,所有TCP應用層的資料會被核心自動切割成MSS大小發送,所以IP的分包在TCP來說基本不存在這樣的場景。反而對UDP來說,由於核心沒有任何機制保證資料的可靠性,應用層傳送的大包能直接到達IP層,在這裡,如果包超過了MTU,IP層會開啟分包傳送。可以看出,IP的分包大多發生在UDP上,而且是應用層有大資料包傳送的情況出現。
所以拋開丟包和IP分包,最後我們談談影響TCP區域網效能的本質原因。除了TCP連線建立過程中的幾個握手包帶來資料延遲外,TCP有兩個特性直接影響資料的傳送速度,慢啟動和視窗。
慢啟動發生在連線剛建立時,資料是慢慢傳送給對方的,並不能有多少資料就能立馬全部發送,而是要根據對方的確認個數來調整發送方的傳送速度,確認的個數能夠直接體現出對方的接收資料的能力。最終,如果鏈路穩定,TCP能夠達到雙方握手協商的最大視窗值,在這個視窗上傳送資料。
當TCP連線穩定後,雙方都能以最大的約定的視窗傳送資料,什麼意思呢?比如雙方約定視窗大小10K,傳送方一次性只能最多傳送10K大小就不能傳送了,因為視窗被填滿了,只有能對方的確認回來視窗有空餘,才能繼續傳送資料。所以我們能夠看出,穩定狀態能夠影響TCP速度的是視窗大小。而這個值是連線建立的時候在握手包裡面協商的,觀察下TCP握手包頭部可以看到,這個欄位只有16bit,意思是最大的視窗只能有65535位元組,意思是通訊雙方任何時刻處於通訊鏈路上資料最大隻能64K。這個限制從根本上影響了TCP速度,所以當底層物理層傳送速度越來越快比如用光纖等等物理通道時,也不能明顯改善TCP速度。之後,TCP擴充了協議,在握手過程中可以額外新增一個視窗擴大因子選項,可以使得雙方能夠協商出按指數因子增大的視窗,這樣才從根本上解決了TCP視窗對TCP速度的限制。
綜上區域網提高TCP傳送效率最本質的方法有兩個,一是使用大視窗,二是增大MSS值,但又不要太大避免IP分包。
回覆列表
TCP協議是面向連線的傳輸層協議,要求系統資源較多,另外TCP保證可靠的傳輸是透過三次握手來建立連線,加上TCP的重傳機制、滑動視窗等機制會影響資料的傳輸效率。
如題,區域網內通訊網路延遲一般都在1ms以內,正常情況下,TCP在區域網的環境下進行資料傳輸網路延遲會很小。
那麼什麼會真正影響到TCP的傳輸效率呢?
1、網路負載較重,錯誤報文較多,丟包嚴重的時候會造成TCP在傳輸中進行資料校驗,觸發重傳機制後就會嚴重影響TCP的傳輸效率。
2、資料報文的大小影響TCP傳輸效率。資料報文過大時系統需要對資料報文進行分片,這樣也會影響到TCP的傳輸效率。
3、網路不穩定影響TCP傳輸效率。因TCP需要透過三次握手建立連線,在網路不穩定時,系統會耗費大量的時間在建立連線上,影響到TCP的傳輸效率。
如何有效地減少TCP的傳輸延遲呢?
1、確保網路的穩定性。
2、確保合理的資料報文大小。
3、建立TCP連線池。
本人建議,若需確保傳輸效率,結合TCP和UDP的優點進行共用,必要的連線可以透過TCP來建立,安全需求沒有那麼高的話可以透過UDP的方式來進行傳輸。