2

我有一个覆盖 TCP 的自定义协议,可以描述如下:-

客户端向服务器发送数据包 A。服务器确认数据包 A。客户端发送数据包 B。

换句话说,在任何时间点,只有一个未确认的数据包。因此,尽可能快地发送消息的考虑因素是:-

  1. 数据包多久可以到达目的地。这意味着 TCP 完成的碎片最少。如果一个数据包可以在单个段而不是 5 个段中到达,则服务器可以更快地响应它。

  2. 服务器为该数据包完成的工作单元。目前,我并不专注于这一点,但最终我也会触及它。

  3. 还假设,损失率可以忽略不计。

  4. Nagle 被禁用。

  5. 典型的数据包大小从 1KB 到 3KB 不等。

  6. 带宽为 1Gb/秒

我在想,如果我将 MTU 配置为等于最大消息大小(3KB + 标头),这应该会影响我在一秒钟内可以发送的消息数量。我的问题是更改 MTU 是否有任何负面影响。此应用程序在受管环境中的 LAN 内运行。

或者,如果我设置了不分段标志,它是否等同于上述更改?

4

2 回答 2

4

首先,让我们澄清一下 MTU 和 MSS 之间的区别。这些属于堆栈的不同层(2 和 3)。

TCP/IP 是一个很不幸的分层蛋糕,两者都支持分片,但不同的是,他们在这件事上不合作。

IP 碎片是 TCP 不知道的。事实上,如果其中一个 IP 片段丢失,则整个系列都被宣布丢失。TCP 情况并非如此:如果作为同一 TCP 流的一部分的 IP 数据报之一丢失,并且它们被 TCP 分段,则只需要重新传输丢失的部分。

这种混乱的核心原因是路由器必须能够在具有不同 MTU 的两个物理网络之间进行阻抗匹配,而无需了解更高的 (TCP) 协议

现在,所有现代网络都支持“巨型帧”(您必须将 NIC 配置为能够发送巨型帧;所有现代 NIC 将始终能够接收高达 90xx 字节的帧)。

像往常一样,随着 MTU 的增加,它是

  • 除非你增加 MSS 否则没用
  • 提高性能(带宽),以及
  • 损害性能(第一个字节的零负载延迟)

在某些应用中,例如 Gigalinx 实现和 GigE 视觉,增加 MTU 是一项要求。在快速网络上,1500 字节 MTU 的开销是无法容忍的。

作为架构师,要问自己的是您的应用程序实际上在做什么。如果存在“相关数据包大小”,从某种意义上说,“直到收到的前 3kB 数据与其余数据无关”,并且您确实需要这个微小的性能优势,请增加 MTU。在此之前,请考虑完全放弃 TCP 以支持对以太网更友好的协议,当然不要自己实现它,而是选择像 ZeroMQ 这样效果很好的东西。

Second question: Do not fragment is an IP setting. Typically useful only in routers, which are expected to match networks of different MTU. It means "discard packet unless I can relay it to the other network". If this is sometimes the case, TCP cannot work over this layer. It will try to retransmit and fail again and again, and eventually disconnect and further behavior will depend on what application is doing. This is a typical situation on the internet, with public misconfigured wifi networks and home networks. You can sometimes browse facebook but not practically watch anything on youtube. This is why. Network administrators would never know the reason.

于 2012-11-10T22:27:15.420 回答
1

MSS = 最大段大小 = 一个 TCP 数据包中发送的数据量。

降低 MSS 会降低性能,因为数据将被分割成更多的 TCP 数据包。

将 MSS 增加到超过其正确值将导致链路层(以太网)上的碎片。

TCP 已经尝试找到(每个连接)不会导致碎片的最大可能 MSS。除非这失败(它没有),否则没有必要覆盖这个值。应避免链路层碎片。它可以节省很少,也很容易损害性能。

除非您知道自己在做什么,否则请勿触摸 MSS。它的价值是有充分理由的。

于 2012-11-10T21:35:25.067 回答