TCP或UDP用于大量连接?

时间:2016-02-20 18:01:07

标签: sockets networking tcp udp p2p

我想创建一个具有以下特征的P2P网络:

  • 低延迟并不重要
  • 放好包裹没关系
  • 节点只会发送少量数据
  • 没有NAT /防火墙问题,每个节点在其公共IP上都有一个开放端口
  • 每个节点都连接到每个其他节点

通常我会将TCP用于任何非时间关键的事情,但最后的要求会导致节点长时间拥有大量的开放连接。如果我没记错的话,使用TCP连接到1000台服务器意味着我必须使用1000个端口来处理这些连接。另一方面,UDP只需要为每个节点提供一个端口。

所以我的问题是:TCP是否能够在网络中处理上述要求,例如:没有调整系统的1000个节点? UDP会更适合这种情况吗?对于这两种协议,还有什么其他方法可以解决问题吗?

3 个答案:

答案 0 :(得分:2)

  

如果我没记错的话,使用TCP连接到1000台服务器意味着我必须使用1000个端口来处理这些连接。

你记得错了。
使用正在侦听端口80的Web服务器,可以在此单个端口上同时处理1000个连接。这是因为连接是由{client-ip,client-port,server-ip,server-port}的元组定义的。虽然server-ip和server-port对于该服务器的所有连接都是相同的,但client-ip和client-port却没有。即使client-ip是相同的(即相同的客户端),客户端也会选择不同的源端口。

  

......例如没有调整系统的1000个节点?

这取决于系统,因为每个开放连接都需要保留状态,因此需要内存。对于只有很少内存的嵌入式系统来说,这可能是一个问题。

在任何情况下:如果你的协议只是发送小消息,如果数据包丢失,重新排序或复制是可接受的,UDP可能是更好的选择,因为开销(连接设置,ACK ..)更小,占用更少的内存。您还可以使用单个套接字与所有1000个节点交换数据,而使用TCP时,每个连接需要一个单独的套接字(套接字与端口不同!)。仅使用单个套接字可以实现更简单的应用程序设计。

答案 1 :(得分:2)

使用UDP可以控制"连接状态"它几乎是做对等相关的最佳方式 IF 你有大量节点或关心带宽,内存和CPU开销。通过将所有控件移动到您的应用程序中,关于"连接状态"每个节点通过使其完全符合您的需求来最小化浪费的资源量。

您将绕过许多操作系统特定的怪异,这限制了TCP与大量连接的有效性。有TIME_WAIT膨胀和数十到数百个特定于操作系统的设置,如果需要那些高数字,则需要为P2P应用的每个用户进行调整。我制作的测试应用程序允许您使用带有ack或TCP的UDP,但无论使用UDP的操作系统如何,性能只有10%的差异。 TCP性能始终低于最佳UDP,其性能差异超过600%,具体取决于操作系统。通过调整,您可以使大多数操作系统使用TCP执行大致相同的操作,但默认情况下大多数操作系统都没有经过适当的调整。

所以在我看来,与TCP相比,建立一个可靠的UDP P2P网络比较困难,但通常需要它。但是,如果你对网络很有经验,我只会建议你去路线,因为有很多"陷阱"处理。像Raknet或Enet这样的图书馆有助于此。它们提供了可靠的UDP的方法,但它仍然需要更多的网络知识才能知道这一切是如何联系在一起的,而使用TCP则主要是隐藏在你身上。

在点对点网络中,您经常会收到NODE PING这样的消息,如果每个人都收到这些消息,您可能并不在意,您只关心最近是否收到过消息。即,您可以每10秒发送一次ping,并在60秒无ping后断开节点。这意味着你需要连续6个ping数据包才能失败,除非节点真的失效,否则这种情况极不可能发生。如果在60秒的时间内甚至收到一次ping,则该节点仍处于活动状态。这样做的TCP实现将涉及更多的延迟和带宽,因为它确保EACH ping消息通过并且将阻止任何其他数据发送直到它发生。而且由于你不能依靠TCP来可靠地告诉你连接是否已经死亡,你必须为TCP添加类似的PING功能,除了TCP已经对你的数据包做了额外的其他事情。

游戏也经常有数据,如果它没有被客户端接收,这没什么大不了的,因为有更多的数据包在几毫秒内到来,这将使任何丢失的数据包无效。即玩家在1秒的时间跨度内从A移动到Z,他的客户端发出每个数据包,大约相隔40毫秒ABCDEFG__I__KLMNOPQRSTUVWXYZ如果我们错过" H和J"我们每40ms收到一次更新?不是真的,这是预测可以进入的地方,但这通常与大多数P2P项目无关。如果那是TCP而不是UDP那么它将增加带宽需求并增加接收到的其余数据包的延迟,因为数据将在它到达之前重新发送,除了通过调整所有内容而已经添加的额外延迟之外。 / p>

基本上,您可以使用UDP降低对等网络中许多消息的延迟和网络开销。但是总会有一些消息 NEED 可靠地发送,这要求你基本上实现一些可靠的方法来获取到该节点的数据包,类似于TCP。如果您需要可靠的对等网络,那么您需要一定程度的专业知识。需要注意的一些事项包括使用数字,消息ACK等对数据包进行排序。

如果你非常关心效率或真的需要成千上万的连接,那么在UDP中实现你的特定协议总是比TCP好。但是有一些情况需要用于TCP,例如,如果项目的时间很重要,或者你是网络编程的新手。

答案 2 :(得分:1)

我想修改Steffen的答案,但有几点:

  1. 1000个连接对于任何普通计算机和操作系统都没有。
  2. UDP符合您的要求。编程可能更容易,因为它是面向消息的。 TCP提供字节流。您需要将消息传递协议层叠在一起并不容易。此外,您需要通过重新连接来处理损坏的TCP连接。
  3. 港口并不稀缺。消耗1000个端口没问题。