如何計算TCP吞吐量?
快速計算一下從一個主機經(jīng)過長距離的鏈路到另一個主機之間實際上你可以獲得的 TCP 吞吐量是多少。
使用 TCP 傳輸數(shù)據(jù)時,兩個最重要的因素是 TCP 窗口大小 和 往返延遲。如果你知道這兩個參數(shù),你就可以計算出兩個主機間的最大吞吐量,不管帶寬是多少。
計算 TCP吞吐量的公式
TCP窗口大小(bits) / 延遲(秒) = 每秒吞吐量(bits)
舉一個簡單的例子。從芝加哥到紐約有 1G 的以太網(wǎng)鏈路,往返延遲 30ms。如果使用 FTP 在芝加哥的一臺服務(wù)器和紐約的一臺服務(wù)器之間傳輸一個大文件,所能期望的最大吞吐量是多少?
首先把 TCP窗口大小 從字節(jié)變成位。這個例子中我們使用 Windows 標準的 64K 窗口大小。
64KB = 65536 Bytes. 65536 * 8 = 524288 bits
接著,把用位表示的窗口大小除以用秒表示的往返延遲。延遲 30ms 的話,在計算中使用 0.03秒。
524288 bits / 0.030 seconds = 17476266 bits per second throughput = 17.4 Mbps maximum possible throughput
這樣的話,盡管在數(shù)據(jù)中心之間我有 1G 的鏈路帶寬,但是基于 給定的窗口大小 和 往返延遲,在傳輸文件時我所能期望的最大的吞吐量是 17.4 Mbps。
做什么才能變快? 增加窗口大小 或 縮減延遲。
為了增加 TCP窗口大小,可以在每個服務(wù)器上做出手動調(diào)整,傳遞更大的窗口大小。這產(chǎn)生了一個問題:你將使用多大的窗口大???可以使用上面公式的反向計算來確定最優(yōu)的窗口大小。
計算最優(yōu) TCP窗口大小 的公式
帶寬(bits每秒) * 往返延遲(秒) = TCP窗口大小(bits) / 8 = TCP窗口大小(字節(jié))
因此在芝加哥和紐約之間 1G 的帶寬和 30ms 的延遲的例子中,可以計算如下:
1,000,000,000 bps * 0.030 seconds = 30,000,000 bits / 8 = 3,750,000 Bytes
因此為 FTP連接 配置 3750KB 的 TCP窗口大小,將會填充管道,獲得 1Gbps 的吞吐量。
服務(wù)器增加 TCP窗口大小,其中一個缺點是需要更多的緩沖內(nèi)存,因為未應(yīng)答的數(shù)據(jù)必須存儲在內(nèi)存中為了應(yīng)對可能的重傳。另一個潛在的缺陷是性能(是不是很諷刺),發(fā)生在包丟失時,因為窗口內(nèi)任何的包丟失都會導(dǎo)致整個窗口重傳 - 除非你的 TCP協(xié)議棧使用一種 TCP增強技術(shù),叫做選擇性應(yīng)答(selective acknowledgements),但是大部分服務(wù)器沒有使用此種技術(shù)。
另一個選擇就是在需要更大窗口的一端放置廣域網(wǎng)加速器(WAN accelerator) 和 在加速器之間使用其他TCP優(yōu)化,比如選擇性應(yīng)答,對服務(wù)器不需要特殊的調(diào)優(yōu)或額外的內(nèi)存。加速器可能也使用第7層應(yīng)用具體的優(yōu)化來減少往返次數(shù)。
減少延遲?這怎么可能? 除非你能克服光速的限制,否則對于縮減延遲你什么都做不了。再一次,你有一個選擇,就是設(shè)置加速器,加速器應(yīng)答本地服務(wù)器的報文段,愚弄服務(wù)器讓它認為看到非常低的局域網(wǎng)延遲。因為服務(wù)器看到非常快速的局域網(wǎng)應(yīng)答,而不是等待遠處的服務(wù)器應(yīng)答,這就是為什么我們不需要調(diào)整服務(wù)器的窗口大小的原因。