TCP與UDP+噴泉編碼吞吐量的簡單比較

TCP採用重傳來保證傳輸的完整性,式(1)是TCP的吞吐量公式(經過三次握手、慢啟動後達到穩態吞吐量)[1]。

[Throughput = frac{L}{{RTTleft( {sqrt {2bp/3}  + left( {6sqrt {3bp/2} } 
ight)pleft( {1 + 32{p^2}} 
ight)} 
ight)}}] (1)

其中,RTT是往返時間,L是數據包大小(單位可以取Byte或bit),b是ACK確認個數,p是丟包率。從式(1)可以看出,吞吐量與信道的長度(往返時間)成反比,與丟包率成反比。做個實驗,從廣東電信ping一個北京聯通的ip:

將平均RTT=138ms, 丟包率p=3%代入式(1)(假設b=1,L=1500),可得吞吐量為60.15KB/s。看高清視頻很有壓力。

另一方面,UDP+噴泉編碼(Raptor)採取預先增加冗餘編碼包的策略對抗丟包。若要傳輸k個包,需要接收n個噴泉編碼包。定義碼率為n/k=1+delta,一般來說解碼開銷delta小於0.05。吞吐量近似為式(2)(不考慮解碼開銷)。

MaxThroughput cdot (1-p ) (2)

假設家裡的帶寬是100Mb/s,則吞吐量可以高達100Mb/s * 0.97=97Mb/s=12.125MB/s。看高清視頻,無壓力。

實際上,一些實時應用,例如VoIP就是over UDP的。這些應用不需要100%正確的數據,寧可忍受1%~2%左右的丟包來使用UDP,這樣就免除了TCP重傳帶來的延時抖動。另外一個辦法是使用CDN,這樣在同省RTT<10ms:

此時RTT=8ms,沒有丟包就假設丟包率p=10^{-4}b=1,L=1500,代入式(1),可得吞吐量=22.9433MB/s=183.547Mb/s>100Mb/s,撐爆100Mb的寬頻了。此時採用UDP+Raptor碼就沒有意義了,再加上Raptor還需要編碼和解碼,更麻煩。

注意:

1) 一般包長L增加,丟包率p也隨之上升。

  1. Handley M, Floyd S, Padhye J, et al. TCP friendly rate control (TFRC): Protocol

    specification, RFC 3448[M]. IETF, 2003.

推薦閱讀:

「茴」字的五種寫法
新年培訓計劃
前端最容易理解的網路知識匯總
計算機網路基礎
IP Tools:到底該用哪一個?

TAG:計算機網路 | 通信 |