最大传输单元

最大传输单元 (MTU) 是指以太网帧内可容纳的包括 IP 报头、第 4 层协议报头和第 4 层数据在内的最大 IP 数据包的大小(以字节为单位)。

有效的 VPC 网络 MTU 大小

虚拟私有云 (VPC) 网络使用 1460 字节的默认 MTU。您可以将 VPC 网络的 MTU 设置为 1300 字节到 8896 字节之间(含边界值)的任何值。常见的自定义 MTU 大小为 1500 字节(标准以太网)或 8896 字节(可能的最大值)。我们建议您为每个虚拟机 (VM) 实例的网络接口 (NIC) 配置 MTU,使其与所连接的 VPC 网络的 MTU 相匹配。如需了解详情,请参阅虚拟机和 MTU 设置

VPC 网络内 Google Cloud 虚拟机之间的通信

当发送方虚拟机与接收方虚拟机使用同一 VPC 网络或使用具有相同 MTU 的对等互连的 VPC 网络时,如果两个虚拟机的接口都配置为使用上述 VPC 网络的 MTU,则最大为该 MTU 大小的 IP 数据包可在这两个虚拟机之间进行发送。

为避免 MTU 不匹配问题,Google 建议您对所有连接的 VPC 网络使用相同的 MTU。虽然这是推荐做法,但并不强制要求在连接的 VPC 网络之间具有相同的 MTU。如需详细了解协议如何处理 VPC 网络之间存在 MTU 不匹配问题的情况,请参阅不匹配的 MTU、MSS 钳制、路径 MTU 发现

从发送方虚拟机的角度来看,以下目标位置的路径表示 VPC 网络中路由的虚拟机间流量:

  • 子网的主要 IPv4 地址范围或子网的次要 IPv4 地址范围中的区域级内部 IPv4 地址,包括以下目标资源使用的专用 IPv4 地址范围和以非公开方式使用的公共 IPv4 地址范围:
    • 接收方虚拟机网络接口 (NIC) 的主要内部 IPv4 地址。
    • 接收方虚拟机 NIC 的别名 IP 范围内的内部 IPv4 地址。
    • 内部转发规则(用于协议转发或内部直通式网络负载均衡器)的内部 IPv4 地址。
  • 以下目标资源使用的内部 IPv6 子网地址范围
    • 分配给双栈接收方虚拟机 NIC 的 /96 IPv6 地址范围内的 IPv6 地址。
    • 内部转发规则(用于协议转发或内部直通式网络负载均衡器)的 /96 IPv6 地址范围内的 IPv6 地址。
  • 使用 VPC 网络中的子网路由或对等互连子网路由来传递数据包时,以下目标资源使用的外部 IPv6 子网地址范围
    • 分配给双栈接收方虚拟机 NIC 的 /96 IPv6 地址范围内的 IPv6 地址。
    • 外部转发规则(用于协议转发或外部直通式网络负载均衡器)的 /96 IPv6 地址范围内的 IPv6 地址。

以下虚拟机之间路径的处理方式和与 VPC 网络外部的目标位置的通信的处理方式相同:

  • 如果数据包目标位置是接收 Google Cloud 虚拟机的 NIC 的外部 IPv4 地址。
  • 如果数据包目标位置是外部直通式网络负载均衡器的外部 IPv4 地址。
  • 如果数据包目标位置是协议转发规则的外部 IPv4 地址
  • 如果数据包目标位置是 Google Cloud 虚拟机的 NIC 的外部 IPv6 地址、外部直通式网络负载均衡器的外部 IPv6 地址或外部协议转发规则的外部 IPv6 地址且 VPC 网络中的适用路由使用默认互联网网关的下一个跃点。在这种情况下,接收方虚拟机既不与发送方虚拟机位于同一 VPC 网络中,也不位于通过 VPC 网络对等互连方式连接到发送方虚拟机的 VPC 网络的某个 VPC 网络中。

与 VPC 网络外部的目标位置的通信

Google Cloud 会处理发送到发送方虚拟机的 VPC 网络外部的目标位置的数据包,如下表所示。发送方虚拟机的 VPC 网络外部的目标位置包括 Google Cloud 外部资源的可公开路由的 IP 地址以及 Google Cloud 中客户可用的外部 IP 地址

由于互联网一般使用 1500 字节的 MTU,因此将 IP 数据包大小保持在 1500 字节或更小字节通常可避免与 MTU 相关的丢包问题。

情况 行为
TCP SYN 和 SYN-ACK 数据包 Google Cloud 会在必要时执行 MSS 钳制,更改 MSS,以确保数据包大小在 MTU 范围内。
IP 数据包 MTU 介于 1300 字节到 1600 字节之间(含边界值) 除了第一行中讨论的 SYN 和 SYN-ACK 数据包之外,Google Cloud 不会更改其他数据包。
大于 1600 字节的 IP 数据包 当 DF 位开启以及 DF 位关闭时,Google Cloud 都会丢弃数据包,并发送“Fragmentation Needed”(需要进行分片)(ICMP over IPv4) 或“Packet Too Big”(数据包过大)(ICMPv6) 消息。

与 Google API 和服务的通信

使用任何有效 VPC 网络 MTU 大小的虚拟机都可以向 Google API 和服务发送数据包,包括使用专用 Google 访问通道适用于 Google API 的 Private Service Connect。此部分的详细信息也适用于使用本地主机的专用 Google 访问通道向 Google API 和服务发送数据包的本地资源。

此部分介绍的 Google API 和服务的流量路径由 Google Front End (GFE) 实现。这些 GFE 使用不可配置的固定 MTU。从 Google Cloud 到 Google API 和服务的流量始终使用 TCP 协议:如果虚拟机从 MTU 与 GFE 的 MTU 不匹配的 VPC 网络连接到 Google API 和服务,则报文段大小使用 TCP MSS 通告进行协商,如不匹配的 MTU、MSS 钳制、路径 MTU 发现中所述。

数据包源位置 数据包目标位置

任何内部 IPv4 地址:主要内部 IPv4 地址或虚拟机 NIC 的别名 IP 范围内的内部 IPv4 地址

使用 1-1 NAT 访问配置分配给虚拟机 NIC 的外部 IPv4 地址:在这种情况下,Google Cloud 会对出站流量执行 1-1 NAT,从而将原始源主要内部 IPv4 地址转换为访问配置中指定的源外部 IPv4 地址。

  • 默认网域中适用于 Google API 和服务的 IPv4 地址
  • 199.36.153.4/30 (restricted.googleapis.com)
  • 199.36.153.8/30 (private.googleapis.com)
  • 适用于 Google API 和服务的 Private Service Connect 端点
适用于双栈虚拟机的外部或内部 IPv6 地址
  • 默认网域中适用于 Google API 和服务的 IPv6 地址
  • 2600:2d00:0002:1000::/64 (restricted.googleapis.com)
  • 2600:2d00:0002:2000::/64 (private.googleapis.com)

通过 Cloud VPN 隧道进行通信

Cloud VPN 既有适用于封装数据包的“网关 MTU”,也有适用于封装前后数据包的“载荷 MTU”。

如需了解精确的载荷 MTU 值和其他 Cloud VPN MTU 信息,请参阅 Cloud VPN 文档中的 MTU 注意事项

通过 Cloud Interconnect (VLAN) 连接进行通信

Google 建议您对连接到同一 VPC 网络的所有 VLAN 连接使用相同的 MTU,并且将 VPC 网络的 MTU 设置为相同的值。如需详细了解 Cloud Interconnect VLAN 连接 MTU,请参阅 Cloud Interconnect MTU

巨型帧支持

下表总结了 Google Cloud 产品和功能中的巨型帧支持:

产品或功能 巨型帧支持
Compute Engine
Cloud Interconnect
Cloud VPN
Google API

虚拟机和 MTU 设置

最佳做法是,将虚拟机的 NIC MTU 与 NIC 所连接的 VPC 网络的 MTU 相匹配:

  • 基于公共操作系统映像的 Linux 虚拟机的每个 NIC MTU 都通过使用 DHCP 选项 26 自动设置为相应的 VPC 网络 MTU。

  • 基于公共操作系统映像的 Windows 虚拟机的每个 NIC MTU 都配置了 1,460 字节的固定 MTU。对于包含基于公共操作系统映像的 Windows 虚拟机的 VPC 网络,如果您更改其 MTU,则必须更改 Windows 虚拟机的 MTU

  • 如果您使用自定义客机操作系统映像,则必须配置 NIC MTU,或使用 DHCP 选项 26 验证客机操作系统是否接受 VPC 网络 MTU。

  • 如果虚拟机具有多个网络接口,请将每个 NIC MTU 设置为相应的 VPC 网络 MTU。

  • 如果 NIC MTU 必须与 VPC 网络 MTU 不同,请将 NIC MTU 设置为小于 VPC 网络 MTU。强制缩小 NIC MTU 对某些高级网络场景有利。

更改 VPC 网络的 MTU

如果您更改包含运行中虚拟机的 VPC 网络的 MTU,请记住以下注意事项:

  • 如果您缩小 VPC 网络 MTU,则必须停止并启动每个虚拟机从客机操作系统中重新启动虚拟机并不会更新其 MTU。

  • 如果您增大 VPC 网络 MTU,则在停止并启动使用 VPC 网络的运行中的虚拟机之前,这些虚拟机无法利用增大的 VPC 网络 MTU。每个虚拟机停止并重启之前,将继续使用先前(较小的)MTU 值。

如需了解相关说明,请参阅更改 VPC 网络的 MTU 设置

GKE 和 MTU 设置

为 Pod 接口选择的 MTU 取决于集群节点使用的容器网络接口 (CNI) 和底层 VPC MTU 设置。如需了解详情,请参阅 Pod

Pod 接口 MTU 值为 1460 或从节点的主要接口继承。

CNI MTU GKE Standard
kubenet 1460 默认
kubenet
(GKE 1.26.1 版及更高版本)
继承 默认
Calico 1460

使用 --enable-network-policy 启用。

如需了解详情,请参阅使用网络政策控制 Pod 与服务之间的通信

netd 继承 通过以下任一方式启用:
GKE Dataplane V2 继承

使用 --enable-dataplane-v2 启用。

如需了解详细信息,请参阅使用 GKE Dataplane V2

不匹配的 MTU、MSS 钳制、路径 MTU 发现

本部分介绍 TCP 和非 TCP 协议如何处理不匹配的 MTU。

TCP 协议

TCP 协议会自动处理 MTU 不匹配问题。每次打开 TCP 连接时,客户端和服务器都会分别计算自己的有效 TCP 最大报文段大小 (MSS) 值。客户端和服务器不必就相同的有效 MSS 值达成一致。

  • 客户端的有效 TCP 最大报文段大小 (MSS):从客户端发送到服务器的 TCP 报文段中的最大可传输数据量为以下两个值中的较小值

    • 在 TCP 连接建立期间,客户端从服务器接收的 SYN-ACK 数据包中 MSS 字段的值。

    • 客户端网络接口的 MTU 减去 40 字节。减去的 40 个字节包括用于 IP 标头的 20 个字节和用于基本 TCP 标头的 20 个字节。

  • 服务器的有效 TCP 最大报文段大小 (MSS):从服务器发送到客户端的 TCP 报文段中的最大可传输数据量为以下两个值中的较小值

    • 在 TCP 连接建立期间,服务器从客户端接收的 SYN 数据包中 MSS 字段的值。

    • 服务器网络接口的 MTU 减去 40 字节。减去的 40 个字节包括用于 IP 标头的 20 个字节和用于基本 TCP 标头的 20 个字节。

TCP MSS 钳制

TCP MSS 钳制是一个过程,其中客户端和服务器之间的网络设备在客户端和服务器之间路由数据包时,会更改 SYN 和 SYN-ACK 数据包中的 MSS 值。Google Cloud 每次将数据包发送到 VPC 网络外部的目标位置时,就会使用 MSS 钳制。

Cloud VPN 隧道和 Cloud Interconnect VLAN 连接也使用 MSS 钳制。如需了解详情,请参阅 Cloud VPN 文档中的数据包封装和处理以及 Cloud Interconnect MTU

VPC 网络不会对 VPC 网络中下一个跃点路由的数据包执行 MSS 钳制,因为 TCP 协议本身就足够了。

非 TCP 协议

当涉及两个不同的 VPC 网络 MTU 时,UDP 等其他协议需要特别注意。发送系统负责发出适合其网络接口 MTU、接收系统网络接口的 MTU 以及介于其间所有网络的 MTU 的数据包。Google Cloud 不会对 VPC 网络中下一个跃点路由的数据包执行 IP 分片。

如果 IP 数据包太大而无法传送(例如,数据包超过接收虚拟机 NIC 所在的 VPC 网络的 MTU),Google Cloud 会丢弃该数据包。如果数据包设置了 DF 位,Google Cloud 还会将“Fragmentation Needed (ICMP over IPv4)”(需要进行分片 [ICMP over IPv4])或“Packet Too Big (ICMPv6)”(数据包过大 [ICMPv6])消息发回给发送方。

在以下情况下,即使 DF 位关闭,Google Cloud 也会发送“Fragmentation Needed”(需要进行分片)或“Packet Too Big”(数据包过大)消息:

  • 如果 VPC 网络 MTU 小于 1600 字节,且发送的数据包超过 VPC 网络 MTU。
  • 如果 VPC 网络 MTU 为 1600 字节或更大字节,且发送的数据包超过 1600 字节。

对于发送数据包的虚拟机来说,要使用路径 MTU 发现 (PMTUD),“ICMP Fragmentation Needed”(ICMP 需要进行分片)或“Packet Too Big”(数据包过大)消息是必要的。为了说明 PMTUD 的工作原理,请查看以下示例,所用的两个虚拟机分别位于通过 VPC 网络对等互连进行连接的不同 VPC 网络中:

  • 发送方虚拟机在 MTU 为 8896 字节的 VPC 网络中具有 NIC。
  • 接收方虚拟机在 MTU 为 1460 字节的 VPC 网络中具有 NIC。
  • 发送方虚拟机发出其“不分片”(DF) 位已设置好的 8000 字节的 IP 数据包。由于数据包太大而无法传送到接收方虚拟机,因此 Google Cloud 向发送方虚拟机发送“Fragmentation Required”(需要进行分片)或“Packet Too Big”(数据包过大)消息。此消息指示了发送方在尝试为连接重新传输数据包时可使用的最大 IP 数据包大小。
  • 发送方虚拟机的操作系统在将后续数据包发送到接收方虚拟机时,会使用此信息来缩小 IP 数据包大小。

由于 PMTUD 生成的“Fragmentation Needed”(需要进行分片)或“Packet Too Big”(数据包过大)数据包使用 ICMP 协议,且其源位置与原始数据包目标位置相匹配,因此 PMTUD 有以下额外要求:

  • 您必须配置“允许入站流量”VPC 防火墙规则防火墙策略中的规则,以便允许使用来自与原始数据包目标位置相匹配的源位置的 ICMP(适用于 IPv4)或 ICMPv6(适用于 IPv6)。为了简化防火墙配置,请考虑允许使用来自所有源位置的 ICMP 和 ICMPv6。
  • 内部直通式网络负载均衡器和内部协议转发的转发规则必须使用 L3_DEFAULT 协议,以便它们处理适用于 PMTUD 的 ICMP 以及原始数据包所使用的协议。

后续步骤

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估 VPC 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费试用 VPC