TCP与UDP - 使用两者产生的问题

时间:2011-11-16 19:07:19

标签: tcp network-programming udp multiplayer

当我学习各种技术时,我经常会想到我经常使用的应用程序如何实现这些功能。我和一些FPS一起玩了几个MMO。我做了一些环顾四周并发生在这个帖子上:

http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp

我一直看到,当允许丢失一些数据包时UDP会闪耀。涉及的开销更少,更新更快。在环顾四周并阅读各种文章和主题之后,我发现通常会使用UDP完成字符定位。像FPS这样的游戏通常会通过UDP完成,因为发生了所有快速变化。

我已经多次看到有人指出同时使用UDP和TCP时可能出现的问题。这些问题可能是什么?新手程序员大多会遇到这些问题吗?在我看来,使用UDP和TCP的组合是理想的,获得每个的优点。但是,如果将两者结合使用会增加代码的大量复杂性以处理所引起的问题,那么在某些情况下可能不值得。

4 个答案:

答案 0 :(得分:5)

许多游戏一起使用UDP和TCP。由于每个游戏都必须将玩家的行为传递给每个人,因此必须以某种方式完成。它现在取决于你想要制作什么样的游戏。在RTS中,TCP肯定会更加明智,因为你不能丢失有关对手运动的信息。在RPG中,跟踪游戏的每一秒都不是非常重要。

底线是,如果数据必须到达客户端,无论如何,(位置更新,升级aso。),你必须通过TCP发送它,或者,你实现自己的可靠基于UDP的协议。我已经构建了很多用于游戏的网络堆栈,我不得不说,你使用的内容取决于用例以及你想要实现的目标。我主要通过UDP做了 heartbeat ,所以远程服务器/客户端知道我还在那里。 UDP的问题是,数据包丢失而不重新发送。如果数据包丢失,它将永远丢失。你必须考虑到这一点。如果您通过UDP发送一些信息,则必须是允许丢失的信息。其他一切都通过TCP进行。

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

答案 1 :(得分:1)

我能想到的第一个可能的问题是,由于UDP没有TCP所做的“传输控制”固有的开销,UDP具有更高的数据带宽和更低的延迟。因此,在TCP消息被完全接收之前,TCP消息之后发送的UDP数据报可能在远程计算机的输入缓冲区中可用。

如果使用TCP控制或监控UDP传输,这可能会导致问题;例如,您可以通过TCP告诉服务器您将通过端口X上的UDP发送一些数据报。如果远程计算机尚未侦听端口X,它可能无法接收这些数据报,因为它们之前到达它被告知听;如果它正在倾听,但不期待来自你的流量,它可能会丢弃它们,因为它们在被告知期望它们之前出现。这可能会对您的计划流程或用户体验产生负面影响。

答案 2 :(得分:1)

我认为如果你想传输游戏数据,TCP将是唯一的解决方案。想象一下,您在服务器上发送命令(例如获得x项:P),此数据包永远不会到达目的地。 (udp没有保证)。

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

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

答案 3 :(得分:1)

许多服务一起使用udp和tcp,但是在不对udp实现添加拥塞控制的情况下这样做可能会导致tcp出现重大问题。简而言之,udp可以并且经常会阻塞每个端点上的路由器,使得tcp的拥塞控制变得混乱并严重限制整个tcp连接。基于udp的拥塞还可能导致tcp的数据包丢失显着增加,从而限制了tcp的吞吐量,因为它需要重新传输这些数据包。将它们结合使用并不是一个坏主意,甚至变得有些普遍,但你要记住这一点。