TCP與UDP+噴泉編碼吞吐量的簡單比較
04-30
TCP採用重傳來保證傳輸的完整性,式(1)是TCP的吞吐量公式(經過三次握手、慢啟動後達到穩態吞吐量)[1]。
(1)其中,是往返時間,是數據包大小(單位可以取Byte或bit),是ACK確認個數,是丟包率。從式(1)可以看出,吞吐量與信道的長度(往返時間)成反比,與丟包率成反比。做個實驗,從廣東電信ping一個北京聯通的ip:
將平均138ms, 丟包率3%代入式(1)(假設,),可得吞吐量為60.15KB/s。看高清視頻很有壓力。
另一方面,UDP+噴泉編碼(Raptor)採取預先增加冗餘編碼包的策略對抗丟包。若要傳輸個包,需要接收個噴泉編碼包。定義碼率為,一般來說解碼開銷小於0.05。吞吐量近似為式(2)(不考慮解碼開銷)。
(2)
假設家裡的帶寬是100Mb/s,則吞吐量可以高達100Mb/s * 0.97=97Mb/s=12.125MB/s。看高清視頻,無壓力。
實際上,一些實時應用,例如VoIP就是over UDP的。這些應用不需要100%正確的數據,寧可忍受1%~2%左右的丟包來使用UDP,這樣就免除了TCP重傳帶來的延時抖動。另外一個辦法是使用CDN,這樣在同省RTT<10ms:
此時ms,沒有丟包就假設丟包率,,,代入式(1),可得吞吐量=MB/sMb/s>100Mb/s,撐爆100Mb的寬頻了。此時採用UDP+Raptor碼就沒有意義了,再加上Raptor還需要編碼和解碼,更麻煩。注意:
1) 一般包長增加,丟包率也隨之上升。
- Handley M, Floyd S, Padhye J, et al. TCP friendly rate control (TFRC): Protocol
specification, RFC 3448[M]. IETF, 2003.
推薦閱讀: