代码之家  ›  专栏  ›  技术社区  ›  IAbstract

严重、高性能服务器的Tcp可靠性与Udp负担

  •  8
  • IAbstract  · 技术社区  · 16 年前

    速度、优化和可伸缩性是Udp和Tcp协议之间的典型比较。Tcp宣扬可靠性的缺点是有一点额外的开销,但速度从好到好。Tcp套接字实例化后,保持套接字打开需要 开销但与经常描述的Udp负担相比,哪种协议的开销更大?。我还听说Tcp存在可伸缩性问题……然而互联网(网页/服务器)是在Tcp上运行的——那么Tcp有什么阻碍可伸缩性呢?

    好的…所以Udp不需要保持连接打开的开销。但是,它要求您编写额外的方法来确保所有数据包都到达那里,希望是按照您希望它接收的顺序。如果一个数据包没有被完全接收,那么你必须告诉客户端或服务器重新发送。您还必须为部分数据包保留某种类型的消息收集,重新生成部分消息,并在最终处理消息之前检查完整消息。更不用说如果一条消息的第二部分没有成功,你要么说重新发送整个消息,要么说重新发送我们丢失的部分,或者别的什么。

    基本上,我的问题是:

    1. 为什么我会选择Udp而不是Tcp作为一个严肃的、高性能的服务器,并增加消息的“开销” 检查和手动确认与连续流的“开销”对比?
    2. 如果Tcp对于魔兽世界这样的游戏来说已经足够好了,为什么Tcp不能被广泛接受呢 这个 用于游戏服务器的协议?

    注意:我不反对为服务器实现Udp选项。在Net上,我们使用的是C.3。因此,我也对处理Udp的最佳实践感兴趣 负担 . 我也在使用异步方法 级别,而不是使用TcpListener、TcpClient等。

    5 回复  |  直到 16 年前
        1
  •  12
  •   Kyle Rosendo    16 年前

    但是,此链接可能会让您最感兴趣,因为它直接与网络游戏编程有关:

    如果我引用一些小的话:

    当时的决定似乎很清楚,, 超级容易使用,而UDP是一个巨大的 痛苦的屁股,我们必须编码 一切从头开始。所以 显然我们只是使用TCP,对吗?

    使用TCP是最糟糕的 在开发一个应用程序时可能犯的错误 需要了解TCP实际上在做什么 以上IP,使一切看起来如此 简单!

    不过,我还是建议你自己研究一下这个问题,并确定哪些协议适合你 你的

        2
  •  7
  •   Robert S. Barnes Antoni    16 年前

    首先,我将转述史蒂文斯的 Unix Network Programming

    他基本上是这样说的:

    1. UDP是广播/多播的唯一选项-因此您必须在那里使用它。
    2. UDP 可以 可用于简单的请求/回复应用程序。但您必须添加自己的错误检测,这至少意味着确认、超时和重新传输。
    3. UDP 用于批量数据传输(文件传输),因为您必须在TCP中预先构建所有功能才能正常工作。
    4. 应该 用于传输速度最重要且某些数据丢失不是问题的实时数据,如实时传感器数据、实时多媒体流、实时股票报价等。

    head-of-line blocking

    假设您发送了两个独立的数据包/请求。先是A然后是B。由于TCP是基于流的,如果一个get在网络中丢失并且需要重新传输,那么即使B已经成功到达,它也无法通过堆栈传递到应用程序,直到A到达,从而引入不必要的延迟。不仅如此,在A到达之前,B无法被堆栈确认,这可能导致B也被重新传输,从而导致不必要的网络拥塞。

    解决此问题的一种方法是为每个请求使用单独的连接,但这也会引入延迟 hogs系统资源。UDP绕过了所有这些问题。

    高性能(低延迟)服务器中的另一个问题是 Nagle Algorithm 这会增加TCP通信的延迟。

    第二个问题的答案是WoW可能发送数据流,而不是独立的请求/应答对。另外,可以通过禁用 Nagle algorithm . 如果他们确实使用了一些请求/应答通信,他们可能只是做出了一个设计决策,即可靠性对他们来说比延迟更重要。

        3
  •  4
  •   Community Mohan Dere    9 年前

    定义“严重的高性能”-您在谈论多少并发连接以及有多少数据在流动?

    看看这个问题的答案 What do you use when you need reliable UDP?

    这里有效使用UDP的关键是要有一定程度的可靠性和不可靠性,并且每个数据报能够独立于其他数据报进行处理的程度越高,您就越有优势。与TCP相比的优势在于,您可以对每个数据报进行操作,并决定是否可以在数据报到达时使用它。这就是为什么它适用于动作游戏。

    因此,IMHO,如果您需要100%的可靠性和订单交付,那么使用TCP;不要尝试在UDP中重新实现TCP。

        4
  •  2
  •   SF.    16 年前

    这是可靠性与性能之比。

    FPS游戏不需要所有的数据包到达目的地、按顺序到达目的地、非常大或确保大吞吐量。它们只需要数据包尽快到达服务器。这是最终的优先级,TCP的开销只是一个不必要的负担。

    哇,在其“不太实时”的通信中,通常需要传输大量数据(在拥挤的区域),可能需要处理超过MTU的数据包(需要分段),并且需要可靠性(越少越大的数据包=丢失的数据包越多)。因此,选择TCP是合乎逻辑的。大多数回合制战略游戏和类似游戏也是如此。在游戏中,ping为30毫秒的玩家击败ping为50毫秒的玩家,UDP为国王。

        5
  •  1
  •   Kevin Nisbet    16 年前

    如果要实现重传,则需要执行相同的操作,因此将有相同的开销。但是,如果您知道端到端链路速度,或者某些消息可能无法正常传递,或者某些消息不需要重新传输,UDP确实会给您带来优势。保持游戏场景:

    包2=射击

    大多数游戏设计者,如果数据包1丢失,但收到数据包3,数据包1就不再重要,因为它包含过时的信息。然而,您可以选择说数据包2很重要,所以如果它没有得到确认,就发送一个重新传输。

    如果您需要高吞吐量,并使用1000Mbps以太网直接连接两台服务器,TCP/IP将需要一段时间才能扩展,并且会增加额外的开销,而且由于拥塞避免机制,可能永远无法实现真正的千兆连接。但是,您知道它是1 Gbps,所以您可以将自己的UDP设置为以高达1 Gbps(减去开销)的速率传输。

    Udp不太适用于游戏服务器,主要是在上述场景之外,以及实时作战系统,如第一人称射击游戏,其中可以丢弃消息,并且即将出现的新消息将使丢弃的消息无效。魔兽世界可以不使用TCP,因为它们不需要精确的计时,而且可能有一些很好的逻辑,让你很难分辨出它们之间的区别。战斗系统根本不需要速度。

    我还认为,一些理由是多年前的遗留问题,当时每个人的互联网连接都不那么可靠,速度也较慢。TCP对于共享网络也更为宽松,因此如果有很多事情发生,它会减慢速度,以便每个人都能共享连接(避免拥塞)。

    TCP/IP是经过多年研究,由比我聪明得多的人设计的协议。在过去几年中进行的调整使它能够以我们看到的越来越快的平均网络速度表现得更好,并且不需要对使用有太多的了解。

    然而,用UDP来代替它确实需要对网络有深刻的理解。我见过写得不好的UDP程序使1Gbps的链路饱和,并杀死链路上的所有通信量,因为它们实现了一个相当幼稚的重传算法。

    下面列出了TCP/IP现在可以做的一些事情,这些事情您可能会因为使用UDP而失去: -为了到达你的计划 -最大段大小 -路径MTU发现

    因此,如果TCP/IP适合您的需要,我强烈建议您坚持使用它。

    也不是吹毛求疵,但你对运行在TCP/IP上的Internet的评论是错误的,事实上有几十种Internet可路由协议 check them out here . 我想你指的是网页和网络服务器都运行在TCP/IP之上。这对于网络来说也是一件好事,只要页面显示正确,我们人类就不会注意到延迟。即使对于TCP/IP,他们也面临一些挑战,即TCP/IP对web的攻击性不够: Google thinks tcp/ip should be more aggressive by default