MTU 大小是否存在“典型”或“事实上”的默认值?

MTU 大小是否存在“典型”或“事实上”的默认值?
  1. 编写网络软件时,是否存在一个默认、典型或事实上的 MTU 大小标准,我应该注意吗?如果有,它是什么?

  2. MTU 大小为 1500(如此处建议:DSL 标准支持的最大 MTU 是多少) 一个好的经验法则?

  3. 另外,我是不是想太多了?这是人们经常会遇到的问题之一吗?思考在编写网络软件时很重要,但在实际的现实世界中,由于 TCP 会为您处理细节,所以它并不重要?

我在这里询问,而不是在 StackOverflow 上询问,因为当涉及到与 MTU 大小相关的实际支持问题时,我想从系统管理员的角度了解情况。

更新:根据一些反馈和初步答复,我稍微缩小了重点:

  • 我正在编写的应用程序将通过 WAN 连接在桌面/服务器之间进行通信
  • 这是典型的桌面/服务器(即非移动)软件,虽然连接的笔记本电脑可能会通过移动网络使用该软件,但我对此并不担心
  • 它甚至不会尝试处理除应用层之外的 TCP 堆栈的任何层来进行优化
  • VPN 开销可以排除在本问题的范围之外

答案1

您不必关心 MTU,因为网络堆栈会负责必要的优化。如果您使用的是 TCP,堆栈可能会使用方法来计算最大段大小 (MSS),理想情况下,这将导致数据包小于路径中的最低 MTU。其中之一是PMTU 发现

一般来说,您不应该试图超越堆栈 - TCP/IP 的分层架构采用抽象是有充分理由的。除非您有更好的抽象,否则您应该将分段和碎片功能保留在设计的位置。

正如其他人所写,除了 IP 数据包的最小定义 MTU 之外,没有“安全 MTU”可以假设 -即 68 字节由于开销巨大,实用价值较低。

由于 MTU 限制而导致的典型支持问题主要有以下两个方面:

  • 不必要的碎片,从而导致更高的协议开销和乒乓协议更高的延迟
  • 由于无知的防火墙管理员过滤了 ICMP,从而破坏了路径上的 PMTU 发现,导致传输中断

在申请中您不需要处理这两个因素。

答案2

这是一个相当广泛的问题。

1500 常见吗?是的,对于 LAN 上的传统以太网来说,绝对是这样。

假设 1500 或预期任何连接都是 1500 是否安全?不安全。从任何地方连接的移动用户在不同时间可能具有不同的 MTU。

我们有时会降低可能通过 VPN 连接向远程办公室提供服务的数据中心服务器的 MTU。

VPN 连接通常很可能具有较低的 MTU,而且这些 MTU 随处可见。它可能是 1410、1390、1362 或其他一些奇怪的数字。

如果您对给定 TCP 连接的最大有效负载大小感兴趣,您可能会发现协商的最大段大小更有意义。对于标准的 1500 MTU LAN 连接,该值通常为 1460,但结果是它应该反映两个主机都可以接受的大小。

对于跨越多跳的连接,期望所有跳都具有“标准” MTU 或可以可靠地确定 MTU 可能不切实际。请参阅有关该主题的路径 MTU 发现讨论。

路径 MTU 发现
http://en.wikipedia.org/wiki/Path_MTU_discovery#Problems_with_PMTUD

使用 MSS 限制规避路径 MTU 发现问题
http://lartc.org/howto/lartc.cookbook.mtu-mss.html

答案3

回答:

  1. 这个问题很难回答,因为当软件接触到网络时,总会有一些影响软件性能的因素。针对交换机端口到交换机端口通信进行优化的 MTU 对 WAN 链路或更糟的是 VPN 不会有太大帮助,因为 VPN 会增加开销并可能造成碎片化。
  2. 是的,但是你无法真正控制所有情况下的上游情况!
  3. 是的,你想得太多了,你真的在​​编写软件,以便深入到第 2 层进行优化吗?如果你正在编写 iSCSI 驱动程序,那么你可能需要考虑这样的事情。

答案4

遵守协议的要求,并假设您可以轻松传递数据。但是,请尽量避免使用刚好超过 MTU 或其小倍数的固定长度块。

  1. 默认 MTU 为 1500,这是 Internet 上可用的最大值。在隧道传输流量时可能需要较小的值。如果超过链路上可用的最大 MTU,大多数流量将被分段并重新组装。只有设置了 DNF(不分段)选项,数据包才必须小于或等于 MTU。本地 MTU 为可用 MTU 设置上限。
  2. 由于大多数主机的 MTU 为 1500。这是一个很好的默认值。一些 ISP 使用隧道协议(如 PPPOE)提供链接,这些协议提供较小的 MTU。同样,许多 IPv6 早期采用者可能正在使用隧道,并且可能具有较小的 MTU。
  3. 您很可能想多了。在现实世界中,您不能依赖本地 MTU 来确定链路的 MTU。您也不能指望它是一个静态值。如果需要,数据包将被分段并重新组装。例如,NFS 的块大小通常为 4096,并且通常以分段形式发送。

相关内容