2011-08-22 50 views
4

我正在處理UDP服務器/客戶端配置。客戶端向服務器發送單個數據包,該數據包的大小不同,但通常爲< 500個字節。服務器基本上立即用單個傳出數據包進行響應,通常小於傳入請求數據包。完成的交易總是由單個數據包交換組成。什麼是良好的UDP超時和重試值?

如果客戶端沒有看到內的時間T數量的響應時,它重試R乘,每次重試之前通過X增加T,最後才放棄並返回一個錯誤。目前,R從未改變。

是否有任何特殊的邏輯來選擇最佳初始T(等待時間),R(重試)和X(等待增加)?應該如何執行重試(即,使用什麼樣的最小R)才能達到「可靠」協議的一些近似值?

+1

這是爲局域網應用程序或通過互聯網工作,使用各種未知速度的連接? – DaveRandom

+0

@DaveRandom:後者:通過互聯網(但在美國任何地方的所有客戶),連接類型/速度不可預測。 –

+0

如果你想要一些可靠的東西,爲什麼不使用TCP。它是爲此而構建的;) –

回答

4

這與問題5227520類似。谷歌搜索「tcp重試」和「tcp轉播」導致了很多建議,多年來一直在嘗試。不幸的是,沒有一種解決方案顯得最佳

我會選擇牛逼在2或3秒開始。我的增加X將是T的一半(加倍T似乎很受歡迎,但你很快就會得到很長的超時)。如果需要,我會調整R至少5個或更多,因此我的總超時時間至少爲一兩分鐘。

如果後續交易通常更快,我會小心不要讓R和T太高;您可能希望降低R和T,因爲您的統計數據允許,因此您可以重試並獲得快速響應,而不是將R和T保留在最大值(特別是如果您的客戶是人類並且想要響應)。

請記住:如果這些重試成功,您永遠不會像重試次數更多的算法那樣可靠。另一方面,如果你的服務器總是可用的並且總是「立即響應」,那麼如果客戶端看不到響應,那麼這是服務器控制之外的失敗,唯一可以做的事情是客戶端重試(儘管重試可能不僅僅是重新發送,例如關閉/重新打開連接,嘗試使用不同IP的備份服務器等)。

2

最小超時應該是路徑延遲,或者往返行程時間(RTT)的一半。

http://www.faqs.org/rfcs/rfc908.html

最大的問題是決定一個超時後會發生什麼,你重新設置爲相同的超時或你翻倍?這是一個複雜的決定,根據溝通頻率的大小以及您希望與其他人一起玩的公平程度。

如果您發現包丟失頻繁和延遲是一個問題,那麼你想看看要麼保持相同的超時或有緩慢上升到指數超時,例如1x,1x,1x,1x,2x,4x,8x,16x,32x。

如果帶寬不是太大的問題,但延遲真的存在,那麼請遵循UDT並強制數據通過,同時實現低延時和冗餘傳輸。這對廣域網環境尤其有用,尤其是洲際距離以及在廣域網加速器中經常發現UDT的原因。

更可能的延遲是不是太大的關注和公平性等協議是首選,然後用標準的回退模式,1X,2X,4X,8X,16X,32X。

理想情況下,應提前執行協議處理,以自動推導出最佳超時和重試周期。在沒有數據丟失的情況下,您不需要重複交付,當數據丟失時,您需要增加交付。對於超時,您可能希望考慮減少最佳條件下的超時,然後在發生擁塞時放慢速度以防止同義廣播風暴。

相關問題