TCP/IP详解–TCP网络传输数据包1460MSS和1448负载

  当我们进行技术研讨会时,参与者的一个常见问题与路由器接口上的最大传输单元 (MTU) 大小操作及其与 TCP 最大段大小 (MSS) 的关系有关。我将尝试从网络工程师的角度详细讨论这个问题。

最大传输单元 (MTU) 是一种协议在一个实例中可以传输的最大数据长度。以以太网接口为例,以太网接口的MTU大小默认为1500字节,不包括以太网帧头和帧尾。这意味着接口不能携带任何大于 1500 字节的帧。如果我们查看帧内部,我们有一个 20 字节的 IP 标头 + 20 字节的 TCP 标头,剩下 1460 字节的有效载荷可以在一帧中传输。这就是我们所说的 TCP MSS。下图形象化了这个概念:

 

在正常传输情况下,如果没有在传输路由器上进行额外的封装(即 IPsec、MPLS 等),源设备可以使用 1460 字节的最大有效载荷长度,而没有任何潜在的数据包分片风险/降低。这是在源主机和目标主机之间的 TCP 三向握手阶段协商的。

现在在一个可能的情况下,传输中的路由器正在执行额外的封装,即 MPLS 标签交换,这将添加一个额外的标签头,如下所示:

tcp-mss-mpls

这最终会增加退出中转路由器的帧的大小(在上述情况下为 1508 字节。)它还会为 IPv4 隧道中的 IPSec 和 IPv6 等创建类似的问题。

接口的最大 MTU 将取决于硬件平台,但 IEEE 802.3 标准要求最小 MTU 为 1500 字节。此外,如果您注意到路由器上的以下 CLI,则最大 IP MTU 的上限为 1500 字节的以太网 MTU。

接口-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 字节

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注