【问题标题】:Discovering maximum packet size发现最大数据包大小
【发布时间】:2024-01-12 06:53:01
【问题描述】:

我正在从事一个与网络相关的项目,我正在使用 DTLS (TLS/UDP) 来保护通信。

阅读 DTLS 的规范后,我注意到 DTLS 需要设置 DF 标志(不分段)。

在我的本地网络上,如果我尝试发送大于 1500 字节的消息,则不会发送任何内容。这很有意义。在 Windows 上,sendto() 报告成功,但没有发送任何内容。

我显然不能手动取消设置 DF 标志,因为它对于 DTLS 是强制性的,而且我不确定 1500 字节限制(MTU?)在某些情况下是否会改变。我想应该可以。

所以,我的问题是:“有没有办法发现这个限制?”使用 API 吗?

如果不是,那么可能的最低值是多少?

我的软件在 UNIX(Linux/MAC OSX)和 Windows 操作系统下运行,因此欢迎为每个操作系统提供不同的解决方案;)

非常感谢。

【问题讨论】:

  • 您是在推出自己的 DTLS 实现还是什么? RFC 建议他们应该检查“需要的碎片和 DF 集”错误并相应地修改估计的 MTU。 rfc-editor.org/rfc/rfc4347.txt
  • 不,我没有推出自己的 DTLS 实现。我正在使用 OpenSSL。我需要在发送数据包之前让 MTU 对数据包进行分段。所以,我需要一种方法来确保我的数据包足够小而不会被丢弃。

标签: windows unix networking udp mtu


【解决方案1】:

必须支持最小 MTU - 576 字节,包括 IP 标头。因此,如果您将数据包保持在该值以下,则不必担心 PMTU-D(这就是 DNS 所做的)。

【讨论】:

  • 我不知道最小帧大小。我想我别无选择,只能将我的帧分成 576 字节的部分。谢谢你!
  • @ereOn:请记住,它是 576 字节的 IP 数据包 - 因此包括 IP 和 UDP 标头,以及每个数据包的 DTLS 开销。
【解决方案2】:

您可能需要通过向目标发送一定范围的数据包大小来“自动调整”它,然后查看哪个到达。想想 binary_search ...

【讨论】:

  • 谢谢,但我希望有一些“标准”的方式来做到这一点。我真的不想重新发明 MTU 路径发现。