我有一个覆盖TCP的自定义协议,可以描述如下: -
客户端将数据包A发送到服务器。服务器确认数据包A. 客户端发送数据包B。
换句话说,在任何时间点,只有一个未确认的数据包。因此,尽可能快地发送消息所考虑的因素是: -
数据包到达目的地的时间。这意味着最少的碎片 由TCP完成。如果数据包可以到达单个段而不是5个段,则服务器可以更快地响应它。
服务器为该数据包完成的工作单元。目前,我并不专注于这一点,但最终,我也会触及它。
同样假设,损失率可以忽略不计。
Nagle已停用。
典型的数据包大小从1KB到3KB不等。
带宽为1Gb /秒
我在想,如果我将MTU配置为最大邮件大小(3KB +标头),这应该会影响我可以在一秒钟内发送的邮件数量。我的问题是,改变MTU是否有任何负面影响。此应用程序在受管环境中的LAN内部运行。
或者,如果我设置了不分段标志,它是否等同于上述变化?
答案 0 :(得分:4)
首先,让我们澄清MTU和MSS之间的区别。它们属于堆栈的不同层(2和3)。
TCP / IP是一个非常不幸的分层蛋糕,它们都支持碎片,但不同,他们在这个问题上没有合作。IP碎片是TCP不知道的事情。事实上,如果其中一个IP片段丢失,整个系列就会被宣告丢失。对于TCP不是这样:如果属于同一TCP流的IP数据报之一丢失,并且它们被TCP分段,则只需要重新传输丢失的部分。
这个混乱的核心原因是路由器必须能够在具有不同MTU 的两个物理网络之间进行阻抗匹配,而不了解更高(TCP)协议。
现在,所有现代网络都支持“巨型帧”(您必须配置NIC以便能够发送巨型帧;所有现代NIC始终能够接收最多90xx字节的帧)。
正如增加MTU一样,它是
在某些应用中,例如,Gigalinx实施和GigE愿景,增加MTU是一项要求。在快速网络上,1500字节MTU的开销是不可容忍的。
作为一名建筑师,要问自己的是你的应用实际上在做什么。如果存在“相关数据包大小”,从某种意义上说“直到收到的第一个3kB数据与其余部分无关”,并且您确实需要这个微小的性能优势,请增加MTU。在此之前,考虑完全放弃TCP以支持更多的以太网友好协议,当然不要自己实现它,而是选择ZeroMQ这样的工作正常。
第二个问题:片段不是IP设置。通常仅在路由器中有用,预期路由器匹配不同MTU的网络。这意味着“丢弃数据包,除非我可以将其转发到其他网络”。如果有时这种情况,TCP无法在此层上工作。它将尝试一次又一次地重新传输和失败,并最终断开连接,进一步的行为将取决于应用程序正在做什么。这是互联网上的典型情况,公共配置错误的无线网络和家庭网络。你有时可以浏览Facebook,但实际上并没有在youtube上观看任何内容。这就是为什么。网络管理员永远不会知道原因。
答案 1 :(得分:1)
MSS =最大段大小=在一个TCP数据包中发送的数据量。
降低MSS会降低性能,因为数据将被分段为更多的TCP数据包。
增加MSS超过其正确值将导致链路层(以太网)碎片化。
TCP已经尝试查找(每个连接)不会导致碎片的最大可能MSS。除非失败(它没有),否则不需要覆盖此值。应避免链路层碎片。它可以节省很少,也很容易损害性能。
除非您知道自己在做什么,否则请勿触摸MSS。它有其充分的价值。