当我们进行技术研讨会时,参与者的一个常见问题与路由器接口上的最大传输单元 (MTU) 大小操作及其与 TCP 最大段大小 (MSS) 的关系有关。我将尝试从网络工程师的角度详细讨论这个问题。
最大传输单元 (MTU) 是一种协议在一个实例中可以传输的最大数据长度。以以太网接口为例,以太网接口的MTU大小默认为1500字节,不包括以太网帧头和帧尾。这意味着接口不能携带任何大于 1500 字节的帧。如果我们查看帧内部,我们有一个 20 字节的 IP 标头 + 20 字节的 TCP 标头,剩下 1460 字节的有效载荷可以在一帧中传输。这就是我们所说的 TCP MSS。下图形象化了这个概念:
在正常传输情况下,如果没有在传输路由器上进行额外的封装(即 IPsec、MPLS 等),源设备可以使用 1460 字节的最大有效载荷长度,而没有任何潜在的数据包分片风险/降低。这是在源主机和目标主机之间的 TCP 三向握手阶段协商的。
现在在一个可能的情况下,传输中的路由器正在执行额外的封装,即 MPLS 标签交换,这将添加一个额外的标签头,如下所示:
这最终会增加退出中转路由器的帧的大小(在上述情况下为 1508 字节。)它还会为 IPv4 隧道中的 IPSec 和 IPv6 等创建类似的问题。
接口的最大 MTU 将取决于硬件平台,但 IEEE 802.3 标准要求最小 MTU 为 1500 字节。此外,如果您注意到路由器上的以下 CLI,则最大 IP MTU 的上限为 1500 字节的以太网 MTU。
问题是我们不能增加路由器以太网接口上的 IP MTU 大小,因为 MPLS 标签封装帧大小可能会超过最大 MTU。如果源设备创建一个完整大小的数据包,其 TCP MSS 为 1460 字节,则此传输路由器很可能会丢弃/分段数据包。这对我们的网络性能不利。
解决这个问题的最佳方法是什么?
将接口上的 IP MTU 缩小到 1448 字节将为 MPLS 标签标头上的 12 个额外字节创造空间 [如果您考虑最多 3 个 MPLS 标签 LDP + VPN + TE] 加上一个 20 字节 TCP + 20 字节 IP 标头内的1500 字节以太网 MTU。
请记住,当我们缩小传输路由器上的 IP MTU 时,也会将最大可能的 TCP MSS 大小从源设备缩小到 1448 字节。如果路由器在 TCP 握手期间没有向源和目标发出信号,则最佳 TCP MSS 可能会产生丢弃/分段问题。
以下是解决此问题的步骤:
传输流量(通过此路由器的流量):
Router1(config)#int ethernet 1/0
Router1(config-if)#ip mtu 1448
上述命令将接口上的 IP MTU 缩小到 1448 字节,为 MPLS 标签头创建一个 12 字节的空间。
Router1(config-if)#ip tcp adjust-mss ?
<500-1460>
Router1(config-if)#ip tcp adjust-mss 1448
上述命令将在三向握手期间向源设备和目标设备发送信号以使用 1448 字节的 TCP MSS 大小,以便如果它们创建完整大小的数据包,则路由器上仍然不会有任何丢弃/分段。
终止流量(执行 SSH,telnet 到此路由器):
Router1(config)# ip tcp mss 1448?
<68-10000> MSS
我希望这篇博文能帮助您了解如何处理路由器接口上的 IP MTU 和 TCP MSS 大小。
一般额外扩展有一个 options 扩展字段占12 字节,因此通过数据包我们看到经常是1448 字节