看有人列舉了很多TCP和UDP的特性,但是還是沒有從根本上回答出為什么TCP會慢以及怎么減少數(shù)據(jù)發(fā)送延遲。
首先要肯定一點(diǎn),在局域網(wǎng)內(nèi)部,底層網(wǎng)卡基于CSMA接收網(wǎng)絡(luò)包,不再有中心節(jié)點(diǎn)瓶頸問題,而且隨著底層物理層技術(shù)的發(fā)展,現(xiàn)在局域網(wǎng)的丟包錯包概率已經(jīng)非常之低,在這個層面,UDP和TCP有著相同的網(wǎng)卡丟包概率。
IP層分包這種情況也是基本不會出現(xiàn)在TCP上,通常在局域網(wǎng)上,網(wǎng)卡MTU默認(rèn)值在1500左右,而大部分的系統(tǒng)內(nèi)核網(wǎng)絡(luò)協(xié)議棧會把TCP的MSS默認(rèn)值設(shè)置的遠(yuǎn)小于這個值,所有TCP應(yīng)用層的數(shù)據(jù)會被內(nèi)核自動切割成MSS大小發(fā)送,所以IP的分包在TCP來說基本不存在這樣的場景。反而對UDP來說,由于內(nèi)核沒有任何機(jī)制保證數(shù)據(jù)的可靠性,應(yīng)用層發(fā)送的大包能直接到達(dá)IP層,在這里,如果包超過了MTU,IP層會開啟分包發(fā)送。可以看出,IP的分包大多發(fā)生在UDP上,而且是應(yīng)用層有大數(shù)據(jù)包發(fā)送的情況出現(xiàn)。
所以拋開丟包和IP分包,最后我們談?wù)動绊慣CP局域網(wǎng)性能的本質(zhì)原因。除了TCP連接建立過程中的幾個握手包帶來數(shù)據(jù)延遲外,TCP有兩個特性直接影響數(shù)據(jù)的發(fā)送速度,慢啟動和窗口。
慢啟動發(fā)生在連接剛建立時,數(shù)據(jù)是慢慢發(fā)送給對方的,并不能有多少數(shù)據(jù)就能立馬全部發(fā)送,而是要根據(jù)對方的確認(rèn)個數(shù)來調(diào)整發(fā)送方的發(fā)送速度,確認(rèn)的個數(shù)能夠直接體現(xiàn)出對方的接收數(shù)據(jù)的能力。最終,如果鏈路穩(wěn)定,TCP能夠達(dá)到雙方握手協(xié)商的最大窗口值,在這個窗口上發(fā)送數(shù)據(jù)。
當(dāng)TCP連接穩(wěn)定后,雙方都能以最大的約定的窗口發(fā)送數(shù)據(jù),什么意思呢?比如雙方約定窗口大小10K,發(fā)送方一次性只能最多發(fā)送10K大小就不能發(fā)送了,因?yàn)榇翱诒惶顫M了,只有能對方的確認(rèn)回來窗口有空余,才能繼續(xù)發(fā)送數(shù)據(jù)。所以我們能夠看出,穩(wěn)定狀態(tài)能夠影響TCP速度的是窗口大小。而這個值是連接建立的時候在握手包里面協(xié)商的,觀察下TCP握手包頭部可以看到,這個字段只有16bit,意思是最大的窗口只能有65535字節(jié),意思是通信雙方任何時刻處于通信鏈路上數(shù)據(jù)最大只能64K。這個限制從根本上影響了TCP速度,所以當(dāng)?shù)讓游锢韺影l(fā)送速度越來越快比如用光纖等等物理通道時,也不能明顯改善TCP速度。之后,TCP擴(kuò)充了協(xié)議,在握手過程中可以額外添加一個窗口擴(kuò)大因子選項(xiàng),可以使得雙方能夠協(xié)商出按指數(shù)因子增大的窗口,這樣才從根本上解決了TCP窗口對TCP速度的限制。
綜上局域網(wǎng)提高TCP發(fā)送效率最本質(zhì)的方法有兩個,一是使用大窗口,二是增大MSS值,但又不要太大避免IP分包。