是否值得增加TCP MTU,以及Dont Fragment标志是如何工作的



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

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

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

  1. 数据包多久才能到达目的地。这意味着碎片数量最少通过TCP完成。如果一个数据包可以在一个段中到达,而不是在5个段中,那么服务器对它的响应就越快

  2. 服务器为该数据包所做的工作单位。目前,我还没有专注于这一点,尽管最终,我也会触及它。

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

  4. Nagle已禁用。

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

  6. 带宽为1Gb/s

我认为,如果我将MTU配置为最大消息大小(3KB+标头),这将影响我一秒钟内可以发送的消息数量。我的问题是,改变MTU是否会带来负面影响。此应用程序在管理环境中的局域网内运行。

或者,如果我设置了don't fragment标志,它是否等同于上面的更改?

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

TCP/IP是一个非常不幸的分层蛋糕,两者都支持碎片化,但不同,而且它们在这件事上不合作。

IP碎片是TCP不知道的。事实上,如果其中一个IP片段丢失,那么整个系列就被宣布丢失。TCP则不然:如果同一TCP流中的一个IP数据报丢失,并且它们被TCP分割,则只需要重新传输丢失的部分。

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

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

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

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

在一些应用程序中,例如Gigalinx实现og-GigE愿景,需要增加MTU。在快速网络上,1500字节MTU的开销是无法容忍的。

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

第二个问题:不要分割是一个IP设置。通常只在路由器中有用,路由器被期望匹配不同MTU的网络。它的意思是"丢弃数据包,除非我能将其中继到另一个网络"。如果有时是这种情况,TCP就不能在这一层上工作。它将尝试一次又一次地重新传输并失败,最终断开连接,进一步的行为将取决于应用程序正在做什么。这是互联网上的一种典型情况,公共无线网络和家庭网络配置错误。你有时可以浏览facebook,但实际上不能在youtube上观看任何内容。这就是为什么。网络管理员永远不会知道原因。

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

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

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

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

除非你知道自己在做什么,否则不要触摸MSS。它有其价值是有充分理由的。

最新更新