为什么UDP +软件可靠的订购系统比TCP更快?

时间:2009-07-29 14:58:28

标签: networking tcp udp

今天的一些游戏使用通过UDP传输消息的网络系统,并确保消息可靠且有序。

例如,RakNet是一种流行的游戏网络引擎。它仅使用UDP进行连接,并且有一个完整的系统,以确保数据包可靠,并在您选择时进行排序。

我的基本问题是,这是怎么回事? TCP是否与有序,可靠的UDP相同?是什么让它变得如此慢以至于人们不得不基本上重新发明轮子?

6 个答案:

答案 0 :(得分:15)

普通/专业化

  1. TCP是通用可靠系统
  2. UDP +无论什么是特殊用途的可靠系统。
  3. 专业化的东西通常比专业的东西更好。

    流/消息

    1. TCP是基于流的
    2. UDP是基于消息的
    3. 通常更好地发送离散游戏信息地图到基于消息的范例。通过流发送它是可能的,但非常无效。如果要可靠地发送大量数据(文件传输),TCP非常有效。这就是Bit-torrent使用UDP控制消息和TCP用于数据发送的原因。

答案 1 :(得分:14)

大约一年前,我们在“传说联盟”中从可靠转为不可靠,因为有几个优点已被证明是真的:

1)旧信息变得无关紧要。如果我发送一个健康数据包但它没有到达......我不想等到同一个健康数据包重新发送,当我知道它已经改变时。

2)订单有时不是必需的。如果我向不同的系统发送不同的消息,则可能没有必要按顺序获取这些消息。我不强迫客户端等待有序消息。

3)不可靠不会备份消息...即等待确认,这意味着您可以更快地解决损失峰值。

4)您可以在必要时更有效地控制重新发送。比如重新打包没有发送到另一个数据包的东西。 (TCP会重新打包,但您可以通过了解程序的工作方式,更有效地进行重新打包。)

5)消息的流量控制,例如丢弃在网络突然出现时不太相关的消息。当您遇到损失峰值时,网络系统可以选择不重新发送不太相关的消息。使用TCP,您仍然有一个尝试重新发送的消息队列,这可能是较低的优先级。

6)较小的标头包......实际上并不需要多说这些。

答案 2 :(得分:4)

UDP和TCP之间的差异远远大于可靠性和排序:

问题的核心是UDP是无连接而TCP是连接。这种简单的差异导致了许多其他差异,我无法在这里合理地总结。您可以阅读以下分析以获取更多详细信息。

TCP - UDP Comparative Analysis

答案 3 :(得分:3)

我认为这两个词的答案是:“拥塞控制”。

TCP竭尽全力管理路径的带宽 - 充分利用它,但确保其他应用程序有空间。这是一项非常艰巨的任务,本质上不可能在100%的时间内使用100%的带宽。

另一方面,使用UDP,可以使用自己的协议将数据包尽快发送到线路上 - 这使得协议对其他应用程序非常不友好,但短期内可以获得更多的“性能” 。另一方面,如果条件合适,这种协议很可能会导致congestion collapse

答案 4 :(得分:1)

TCP是面向流的协议,而UDP是面向消息的协议。因此TCP不仅仅是可靠性和排序。有关详细信息,请参阅this post。基本上,RakNet开发人员增加了可靠性和排序,同时仍然将其保持为面向消息的协议,因此结果比TCP更加轻量级(必须做更多)。

答案 5 :(得分:0)

这篇小文章虽然陈旧,但在游戏方面仍然如此。它解释了这两个协议,以及这些人试图开发多人互联网游戏的破坏。 “X-Wing vs Tie Fighter”

Lessons Learned (The Internet Sucks)

虽然有一点需要注意,我运行/开发了一个多人游戏,我已经使用过它们。我的应用程序的UDP要好得多,但很多人无法使用UDP。路由器等阻止了连接。所以我改为“可靠的”TCP。嗯......可靠吗?我不这么认为。你发送一个数据包,没有错误,你发送另一个数据包,它在数据包中间崩溃(异常)。现在哪个包发了?因此,您最终编写了一个可靠的协议ON TOP OF tcp,以模拟UDP - 但在崩溃时不断建立新连接。低效率。

UDP +停止并等待ARW =好

UDP +滑动窗口协议=更好

TCP +滑动窗口协议重新连接? =不值钱的批量软件。 (IMHO)

另一个副作用是多线程应用程序。 TCP适用于聊天室类型的东西,因为每个房间都可以是它自己的线程。一个房间可以容纳60-100人并且运行正常,因为Room线程包含每个参与者的套接字。

另一方面,UDP由一个线程提供最佳服务(IMO),但是当你收到数据包时,你必须解析它以找出它来自哪里(通过信息发送或RemoteEndPoint),然后将数据传递给聊天线程以线程安全的方式。

实际上,您必须对TCP执行相同操作,但仅限于连接。

最后一点。请记住,TCP只会在任何时候出错并终止连接,但您可以在大约0.5秒内重新连接并发送相同的信息。我曾与之合作过的大多数古怪的东西。