跳转到内容
搜索文档

最大传输单元和最大分段大小

最后更新 查看 MarkdownAgent 设置

由于 Cloudflare WAN 会将您的流量包装在额外的标头中(封装),因此每个数据包中可用于原始数据的有效空间会减少。如果不考虑这种开销,数据包可能会对于网络路径而言过大,从而被丢弃或分片 —— 导致性能降低或连接失败。本页面解释了您需要配置的两个核心值:最大传输单元 (MTU) 和最大分段大小 (MSS)。

MTU 和 MSS

最大传输单元 (MTU) 是一个衡量指标,代表网络连接设备所能接受的最大数据包。MTU 几乎总是应用于网络中开放系统互连 (OSI) 模型的第 3 层,并包括整个数据包,包括所有标头(传输控制协议 (TCP)、网际协议 (IP) 等)以及数据(有效负载)本身。例如,数据包不得超过 1,500 字节才能在互联网中路由。

最大分段大小 (MSS) 是指您在单个 TCP 数据报数据包中可以发送的数据量。您可以通过从 MTU 中减去 IP 和 TCP 标头的大小来确定此值,这会指示路由器有效负载可以有多大。它适用于网络中 OSI 模型的第 4 层。

关于 MSS/MTU 的一个常见误区是,设置这些值会负面影响性能。虽然会有轻微的性能损失,但如果不配置这些值以适应您网络的特性,情况会更糟。

封装

由于 Cloudflare WAN 使用封装来提供服务,因此了解 MTU 和 MSS 在这种情况下为何重要也同样关键。

封装会增加数据包的字节数,因为 Cloudflare 为每个数据包添加了新的 IP 标头以及(通常)某种封装标头。例如,在网际协议第 4 版 (IPv4) 的通用路由封装 (GRE) 情况下,封装增加了 24 字节 —— 20 字节用于 IPv4 标头,4 字节用于 GRE 隧道标头。

执行 GRE 封装的网络接口需要通过减小其 MTU 来适应增加的开销。由于 MTU 最大大小为 1,500 字节,对于 IPv4 而言,这意味着 MTU 变为 1,476 字节(原始 1,500 字节减去 GRE 封装的 24 字节)。这个减小的 MTU 定义了 GRE 可以封装 the IP 数据包的最大大小。

分片

如果数据包大于网络接口所能接受的大小,网络必须将其丢弃或分片为更小的数据包。发生分片时,Cloudflare 仅接受它可以完全重新组装的数据包。如果缺少某些分片,Cloudflare 将丢弃所有收到的分片。Cloudflare 不会将不完整的数据包转发给客户。

将 TCP 标头中的不分片 (DF) 位设置为 1 表示如果数据包大于中间网络设备可以接受的 MTU,网络必须丢弃该数据包而不是对其进行分片。大多数 TCP 实现将 DF 位设置为 1 以避免分片引起的潜在问题。

如果您遇到分片问题且无法设置 MSS 钳制,Cloudflare 可以为您清除 DF 位。当您启用此选项时,Cloudflare 会对大于 1,500 字节的数据包进行分片,并且您的基础设施在解封装后重新组装这些数据包。请将此作为最后的手段。有关更多信息,请联系您的账户团队。

在 Cloudflare WAN 中的分片

考虑一个大小为 3,000 字节的 UDP 数据报(8 字节用于 UDP 标头 + 2,992 字节用于 UDP 数据)。为了适应标准 1,500 字节的 MTU,此 UDP 数据报将被分片在三个 IP 数据包中,如下所示:

显示 UDP 数据报及其各种组件的图表。

假设 UDP 数据报的源端口为 389 并且发往 Cloudflare WAN 客户 IP 地址。还假设 Cloudflare WAN 客户已设置防火墙规则,该规则会丢弃源端口为 389 的 UDP 流量(这是一种常见的无连接轻量级目录访问协议 (CLDAP)反射攻击向量)。

前面的三个数据包分片将到达 Cloudflare,但只有第一个分片包含带有源端口信息的 UDP 标头。第二个和第三个分片包含 UDP 数据,但不包含 UDP 标头信息。

那么问题来了:Cloudflare 丢弃了哪些分片,又将哪些分片递送给客户?如果 Cloudflare 仅丢弃分片数据包的第一部分,则在拒绝服务 (DoS) 攻击期间,剩余的部分仍可能产生大量流量。

Cloudflare 如何处理分片

下图显示了前述示例中的三个 UDP 分片如何流经 Cloudflare 和 Cloudflare WAN。核心要点是:

  • Cloudflare 绝不向客户发送不完整的数据包:如果 Cloudflare 没有看到完全重新组装该数据包所需的所有数据包部分,Cloudflare 将不会将部分数据分片发送给客户。
  • Cloudflare Network Firewall 作用于完全重新组装的数据包,而不是单个分片:这意味着,例如匹配 UDP/TCP 标头信息的过滤器会应用于完全重新组装的数据包,而不仅仅是初始分片。Cloudflare 不会向客户泄漏非初始分片。
  • 客户仍可以看到分片的数据包:在默认情况下(未设置 clear_dont_fragment_bit),Cloudflare 在将数据发送给客户之前,会对其进行分片以适应所配置的隧道 MTU。如果数据包大于 1,476 字节,Cloudflare 将对其进行分片,并将这些分片发送给客户进行重新组装。

在所有情况下,Cloudflare 都会将所有分片发送给客户。

显示 Cloudflare 如何处理分片的图表。

MSS 钳制

最大分段大小 (MSS) 是一种 TCP 设置,限制 TCP 段的大小。SYN 数据包在三次握手期间设置此选项。

默认情况下,TCP 终端节点根据其本地网络接口 MTU 设置其 MSS 值。例如,对于 IPv4,如果 MTU 为 1,500 字节,则 MSS 变为 1,460 字节(1,500 字节减去 IPv4 标头的 20 字节,减去 TCP 标头的 20 字节)。

MSS 是一个您可以用来配置 TCP 数据包大小行为的工具。如果 TCP 终端节点位于 MTU 减小的网络之后,则将 MSS 值更改为与实际路径 MTU 值相匹配,会强制远程终端节点发送符合指定 MTU 的数据包。因此,如果 IPv4 TCP 终端节点位于 MTU 为 1,476 字节的 GRE 隧道之后,则其 TCP SYN 数据包中的 MSS 值应为 1,436 字节 —— 即 1,476 字节减去 IPv4 标头的 20 字节,再减去 TCP 标头的 20 字节。

修改 MSS 设置的一种方法是通过更改路由器 WAN 接口中网络接口的 MTU,使其与路径 MTU 匹配。另一种修改 MSS 的方法是应用 MSS 钳制(MSS clamp),即在数据包通过中间网络设备(例如路由器)时,将其配置为实时修改 MSS TCP 选项。请注意,在中间网络设备的接口上更改 MTU 不等同于应用 MSS 钳制,它不会改变 TCP MSS 值。

有关根据隧道类型应将 MSS 钳制设置为什么值的信息,请参阅 MSS 钳制建议

MSS 钳制建议

作为 off-ramp 的 GRE 隧道

MSS 值取决于您的网络设置方式。

  • 在您的边界路由器上:将限制应用到 GRE 隧道内部接口(即出口流量将通过的接口)。将 MSS 限制(MSS clamp)设置为 1,436 字节。配置隧道后,您的设备可能会自动执行此操作,但这取决于您的设备。

IPsec 隧道

对于 IPsec 隧道,您需要指定的值取决于您的网络设置方式。MSS 限制(MSS clamping)值低于 GRE 隧道,因为物理接口看到的是 IPsec 加密的数据包,而不是 TCP 数据包,且 MSS 限制不适用于这些数据包。

  • 在您的边界路由器上:将此应用在您的 IPsec 隧道内部接口(即出口流量将通过的接口)。配置隧道后,您的设备可能会自动执行此操作,但这取决于您的设备。将 TCP MSS 限制设置为最大 1,360 字节。

这篇文档对您有帮助吗?