【问题标题】:General overhead of creating a TCP connection创建 TCP 连接的一般开销
【发布时间】:2011-01-29 23:24:48
【问题描述】:

我想知道与 UDP 相比,创建新连接的一般成本。我知道 TCP 需要数据包的初始交换(3 次握手)。其他费用是多少?例如,内核中是否存在设置缓冲区等所需的某种魔法?

我问的原因是我可以保持现有连接打开并根据需要重用它。但是,如果重新连接的开销很小,它将降低复杂性。

【问题讨论】:

  • 我认为握手的延迟是最重要的成本。
  • 啊,好点。在整个握手完成之前,连接不会被认为是打开的。但是,一旦打开,您就可以流式传输数据而无需等待每个段的确认(因为滑动窗口)
  • 没有 'ack on each segment'。

标签: sockets networking tcp


【解决方案1】:

一旦 UDP 数据包被转储到网络上,UDP 协议栈就可以完全忘记它。使用 TCP,至少有连接详细信息(源/目标端口和源/目标 IP)、序列号、连接的窗口大小等......这不是大量数据,但在一个有很多连接的繁忙服务器。

还有 3 次握手。一些脑残(和/或恶意系统)可能会滥用进程(查找“syn flood”),或者只是断开连接,让您的系统等待永远不会出现的响应或关闭通知。好的一面是,使用 TCP,系统将尽最大努力确保数据包到达它必须到达的地方。使用 UDP,根本没有任何保证。

【讨论】:

    【解决方案2】:

    与数据包交换的延迟相比,内核设置时间等所有其他成本都是微不足道的。

    【讨论】:

      【解决方案3】:

      选项 1:创建 TCP 连接的一般成本是:

      1. 创建套接字连接
      2. 发送数据
      3. 拆除套接字连接

      第 1 步:需要交换数据包,因此会因往返网络延迟加上目标服务器的服务时间而延迟。这两个盒子上的 CPU 使用率都不高。

      第 2 步:取决于消息的大小。

      第 3 步:IIRC,只发送一个“立即关闭”数据包,不等待目标确认,因此不涉及延迟。

      选项 2:UDP 成本:*

      1. 创建 UDP 对象
      2. 发送数据
      3. 关闭 UDP 对象

      第 1 步:需要最少的设置,无需担心延迟,速度非常快。

      第 2 步:注意大小,在 UDP 中没有重新传输,因为它不关心数据包是否被任何人接收。我听说消息越大,接收到的数据损坏的可能性就越大,而且经验法则是您将丢失一定比例的超过 20 MB 的消息。

      第 3 步:最少的工作,最少的时间。

      选项 3:改用 ZeroMQ

      您将 TCP 与 UDP 进行比较,目的是减少重新连接时间。有一个很好的妥协:ZeroMQ 套接字。

      ZMQ 允许您设置一个发布套接字,您不关心是否有人在监听(如 UDP),并在该套接字上有多个监听器。这不是 UDP 套接字 - 它是这两种协议的替代方案。

      详情请见:ZeroMQ.org

      它具有非常高的速度和容错能力,并且由于这些原因在金融行业的使用越来越多。

      【讨论】:

      • 我不确定你从哪里得到 20MB 的 UDP 号码。根据 Wikipedia,在 IPV4 中,最大消息大小为 65,507 字节(65,535 - 8 字节 UDP 标头 - 20 字节 IP 标头)。也许你假设 IPV6?
      • 我指的不是数据包大小,而是消息大小。另外,这个数字是道听途说的启发式。情况:在通过 UDP 的相当高速的内部数据中心网络上,在任何 N 条大小为 20 MB 的消息中,有 5% 的 N (N*0.05) 被损坏。这是一个带有大量数据的消防软管,一个-> 几个,不同的盒子组监听发给他们的消息。对困惑感到抱歉。他(我的同事)给我的信息是,如果他使用更大的块,更高的百分比会出现错误并且什么都不会发送。他有一个请求重新发送的反向渠道。
      • UDP 没有大于单个 64k 数据报的消息的概念,因为 UDP 标头中的大小字段是 16 位 (tools.ietf.org/html/rfc768)。这通常大于底层传输层的 MTU,因此 IP 可能会分段并重新组合 64k 数据包。如果任何分片丢失,则整个数据包都会丢失,因此不建议超过 MTU。 20MB 的消息需要通过 UDP 或其他类似 TCP 的更高级别的协议。如果您有较大消息的参考,我有兴趣阅读它。
      • ZeroMQ 不是“这两种协议的替代方案”。它“通过inproc、IPC、TCP、TIPC、多播传送消息”。多播当然是UDP。您似乎认为它是另一种 IP 传输协议。不是。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2012-06-06
      相关资源
      最近更新 更多