2014-08-30 100 views
0

我正在製作一個實時應用程序。我不能多說,但它是一個在線實時應用程序,需要儘可能少的延遲。我正在使用套接字,沒有圖書館。我也需要完整的bandwitdh。我應該使用TCP還是UDP?我不介意編程多一點讓UDP工作。提前致謝。C++遊戲應用程序UDP vs TCP

+1

實際上在這裏回答 - 既使用udp,也不使用重要更新的tcp,重要的使用tcp – 2014-08-30 23:48:40

回答

1

取決於客戶端連接的性質。

TCP是有狀態會話。如果您同時連接了很多客戶端,則可能會造成端口耗盡。如果客戶端頻繁地連接和斷開連接,建立和拆除TCP會話會增加延遲,CPU負載和帶寬。如果您的客戶端連接或多或少是永久性的,並且沒有太多客戶端同時連接,則TCP只比UDP稍差。

UDP更適合低延遲通信。但是,請注意NAT防火牆 - 並非所有的功能都可以或爲UDP地址映射而設置。

也請注意,TCP是一個流,因此不提供消息打包。您的應用程序必須從TCP流組裝數據包,並帶來額外開銷。

UDP根據定義是一個完整的消息,即作爲發送的分組到達。請注意交付不能得到保證,應用程序可能需要提供確認和重新發送層。

0

TCP/IP實現一個流;也就是說,它希望通過另一端發送收件人發送的所有內容。爲此,它增加了許多協議,用於處理部分流缺失的情況 - 例如,它將重試發送,跟蹤它仍然需要發送多少字節(使用窗口)等。 TCP/IP連接用於添加流的保證;如果TCP/IP無法傳送數據包並且無法恢復,則連接將斷開。

UDP/IP實現了一個數據報 - 也就是說,它希望從A到B發送一個特定的數據包(大小有限)。如果一個數據報丟失,就沒有內建的方法來重發它。如果沒有丟失,UDP數據包將被丟棄。

UDP缺乏保證實際上是一種好處。假設你正在建模類似「健康」的東西 - 一個怪物在服務器上攻擊你兩次。您的健康從90下降到78,然後下降到60.使用TCP/IP,您必須首先收到78 - 所以如果該數據包被丟棄,它必須重新發送,並按順序 - 因爲這裏有一個數據流。但你真的不在乎 - 你的健康現在是60歲;你想嘗試獲得60分。如果78歲的時候你的健康已經下降到60歲,誰會在乎--78歲的歷史並且不再重要。你需要健康說60.

TCP也是一個好處 - 你不想在遊戲聊天中使用UDP。你希望所有對你說的話都是爲了你。

TCP還增加了擁塞控制;有了UDP,你必須實現它,或者不知怎麼的注意你扼殺了UDP,這樣它就不會使服務器和播放器之間的未知網絡特性飽和。

所以是的,你想使用「兩個」;但「重要性」並不完全是您需要瞄準的標準。使用TCP/IP傳送數據流,輕鬆實現擁塞控制等。使用UDP實時狀態以及其他情況下,流抽象會干擾目的而不是與其對齊。

0

UDP和TCP在延遲方面都有好處。如果所有以下爲真:

  • 你有單一數據源在客戶端
  • 發送小消息,但擔心自己的潛伏期
  • 您的應用程序可以處理從時間失去消息時間
  • 您的應用程序可以處理接收消息亂序

UDP可能是一個更好的選擇。 UDP也適用於將數據發送到多個recipiemts。

在另一方面,如果任一

  • 如果上述任何不屬實
  • 如果您的應用程序發送儘可能多的數據儘可能快地
  • 您有多個連接,以維持

你應該使用TCP。

This post會告訴你爲什麼UDP不一定是最快的。

如果您打算通過TCP傳輸大量數據,您應該考慮bandwidth delay product的影響。儘管您似乎更關心延遲而不是吞吐量,但您可能會對此感興趣。