TCP vs UDP - 使用两者所引发的问题

5
当我了解各种技术时,我经常尝试思考我经常使用的应用程序如何实现这些技术。我玩过一些MMO和FPS游戏。我查找了一些信息,然后发现了这个帖子:http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp 我已经看到UDP在允许一些数据包丢失时表现出色。涉及的开销较少,更新速度更快。在查找了一些信息并阅读了各种文章和帖子之后,我发现角色定位通常会使用UDP。像FPS这样的游戏通常会使用UDP,因为所有快速变化都会发生。
我已经多次看到有人指出同时使用UDP和TCP可能会出现问题。这些问题可能是什么?这些问题主要是由初学者程序员遇到的吗?在我的看来,最好使用UDP和TCP的组合,获得每个协议的优势。然而,如果同时使用两者会增加代码复杂性以处理引起的问题,则在某些情况下可能不值得。

如果你特别关心游戏相关的问题,建议你在gamedev stackexchange上提问,那里会有更多的答案。 - Ben Jackson
我会去看一下。我最初是以游戏设计为重点开始的,但那更多是为了阐明情况。我问题中的最后一段文字适用于任何TCP或UDP应用程序,无论给出的答案是否与游戏相关,都可以完全满足我的需求。 - Cheese
4个回答

5
许多游戏同时使用UDP和TCP。由于每个游戏都必须向所有玩家传递玩家的操作,因此必须以某种方式完成。现在取决于您想制作什么类型的游戏。在即时战略游戏中,肯定会更明智地使用TCP,因为您不能丢失有关对手移动的信息。在角色扮演游戏中,没有必要每秒跟踪游戏的每个细节。

底线是,如果数据必须到达客户端(位置更新,升级等),则必须通过TCP发送,或者您可以基于UDP实现自己的可靠协议。我已经构建了相当多的游戏网络堆栈,并且不得不说,您使用的取决于用例和您要实现的目标。我大多数情况下使用UDP进行心跳检测,这样远程服务器/客户端就知道我还在。 UDP的问题在于,数据包可能会丢失且不会重发。如果数据包丢失,则永久丢失。您必须考虑到这一点。如果您通过UDP发送某些信息,则该信息必须允许丢失。其他所有内容都通过TCP发送。

所以疯狂开始了。如果你想充分利用两者,你必须适应它们。TCP有时可能会很慢,如果数据包被分段或未按顺序到达,则必须等待,直到操作系统重新组装它们。在某些情况下,建议在UDP之上构建自己的可靠协议。这将使您完全控制流量。大多数防火墙不会丢弃UDP或其他任何内容,但与TCP一样,任何未声明为安全的流量(开放端口、数据包重定向等)都将被丢弃。我建议您阅读维基百科上的TCPUDP以及UDP-Lite文章,然后决定要使用哪些协议。据我所知,Battle.net使用两种协议的组合。

2
许多服务同时使用udp和tcp,但如果没有在udp实现中添加拥塞控制,则可能会对tcp造成严重问题。简而言之,udp可以并经常会堵塞每个端点的路由器,导致tcp的拥塞控制失控并显著限制tcp连接的吞吐量。基于udp的拥塞还可能导致tcp的数据包丢失显著增加,进一步限制tcp的吞吐量,因为它需要重新传输这些数据包。将它们一起使用不是一个坏主意,甚至正在变得有些普遍,但您需要记住这一点。

1
我能想到的第一个可能的问题是,因为UDP没有TCP中固有的“传输控制”所带来的开销,UDP具有更高的数据带宽和更低的延迟。因此,在完全接收TCP消息之前,发送在TCP消息之后的UDP数据报可能会在远程计算机的输入缓冲区中可用。
如果您使用TCP来控制或监视UDP传输,这可能会导致问题;例如,您可以通过TCP告诉服务器,您将通过端口X使用UDP发送一些数据报。如果远程计算机尚未侦听端口X,则可能不会接收某些数据报,因为它们在被告知侦听之前到达;如果它正在侦听但不期望从您那里接收流量,则可能会丢弃它们,因为它们在被告知期望它们之前出现。这可能会对您的程序流程或用户体验产生负面影响。

谢谢你指出这点。现在我读到这个,我想起了一本书里提到的另一件事情。书中指出TCP拥塞控制是“为了更大的利益”。另一方面,UDP可能会占用大量带宽,并且会对同一网络中的TCP用户造成问题。我认为,与此相关的某些事情就是为什么许多防火墙会阻止UDP的原因。 - Cheese

1

我认为如果你想传输游戏数据,TCP 将是唯一的解决方案。想象一下,你在服务器发送一个命令(例如获得 x 物品 :P),但这个数据包从未到达目的地(UDP 没有保证)。

还要想象一下,两个或更多的 UDP 数据包以错误的顺序到达其目的地的情况。

但是,如果你的游戏集成了任何 VoIP 或视频通话功能,你可以使用这些 UDP。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接