首先,让我们澄清一下 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.