携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
TU 和 MSS 是您在进入网络世界时应该熟悉的两个重要术语,尤其是在使用 GRE 隧道和 IPSEC 时。
最大传输单位 (MTU)
MTU 是最大的数据包或帧大小,以八位字节(八位字节)为单位指定,可以在基于数据包或帧的网络中发送。互联网的传输控制协议(TCP)使用MTU来确定任何传输中每个数据包的最大大小。
MTU 通常与以太网协议相关联,其中 1500 字节的数据包是允许的最大数据包。
什么是碎片化?
与 MTU 相关的最常见问题之一是,有时更高级别的协议可能会创建大于特定链路支持的数据包。
为了解决这个问题,IPv4允许分段,它将数据报(在分组交换网络中传输的基本信息单元)分成几部分。每个部分都足够小,可以使用为该接口配置的 MTU 参数来传递其分段的链接。
分段过程发生在 IP 层(OSI 层 ),它将数据包标记为已分段。这可确保目标主机的 IP 层知道它应该将数据包重新组合到原始数据报中。
某些应用程序不支持碎片,因此应避免。避免碎片的最佳方法是调整 TCP 最大段大小 (MSS),如下所述。
MTU 示例:数据报剖析
下图说明了 MTU 在典型网络数据传输中的外观。MTU 在互联网上的常见值为 1500 字节。
MTU单位
MTU 由以下部分组成:
- 有效负载,1460 字节
- TCP 和 IP 标头,每个标头 20 个字节
请考虑要实现通用路由封装 (GRE) 协议,这是一种隧道协议,允许您在虚拟 IP 链路中封装网络层协议。
下图显示了具有 GRE 封装的相同数据报,它为 GRE 标头添加了 24 个字节。
此类数据包的总大小为 1524 字节,超过了 1500 字节 MTU 值。为了保持 MTU 为 1500,可以减小数据包的“数据”大小。使这成为可能的机制是MSS。
什么是 TCP MSS?
TCP MSS 是 TCP 标头的选项字段中的一个参数,它定义最大段大小。它指定计算机或通信设备可以在单个 TCP 段中接收的最大数据量(以字节为单位)。
MSS 不包括 TCP 标头或 IP 标头。相反,它规定了数据包的“数据”部分的最大大小。使用上一节中的 GRE 隧道示例,由于总标头的大小为 64,因此 TCP MSS 值应设置为 1436 或更低,以确保不需要分段。
什么是 MSS 公告?
在三方TCP握手期间,接收方发送“MSS公告”。此公告声明了接收方可以接受的 TCP 段的最大大小。MSS 可以在数据流的每个方向上独立使用。
由于终端设备并不总是知道在此过程中将添加到此数据包的高级协议,因此它通常不会调整TCP MSS值。为了弥补这一点,网络设备可以选择重写通过它们处理的 TCP MSS 数据包的值。
例如,在思科路由器中,接口级别的命令 ip tcp mss-adjust 1436 将重写通过此接口的任何 SYN 数据包的 TCP MSS 值。
Web 应用程序防火墙 (WAF) 中的 GRE 隧道和 TCP MSS
WAF 通常使用 GRE 隧道。要解决碎片的可能性,您需要调整 TCP MSS 值。
下图说明了使用 Imperva WAF 的 WAF 拓扑。
客户服务器发送 MSS 值为 1460 的数据包,但在路由器的接口中,MSS 调整为 1420。这允许 GRE 数据包在不进行分段的情况下通过。
Imperva WAF是不对称的 - 它拦截入站流量,但允许出站流量直接通过ISP。这意味着您只需在处理入站流量的路由器上设置 MSS 值。无需在组织的隧道接口上调整 MSS。
上图显示了 SYN 数据包在三向握手中的行进方式。完成三向握手并建立连接后,最终用户将发送数据不超过 1420 字节大小的数据包。此外,客户的服务器将发送数据不超过默认 1460 字节的数据包。