本文档将介绍 L2TP 链路中的分段与重组,并解释最大传输单元 (MTU) 调整如何帮助减少一些相关问题。
本文读者应该有以下知识:
常规虚拟专用拨号网络 (VPDN) 配置命令
常规 IP 主题,例如分段、重组、MTU、封装、报头等。
本文档中讨论的大多数配置和功能增强都会在 Cisco IOS® 软件版本 12.1T 或 12.2T 及更高版本中提供。但是,请参阅下面的各部分内容以了解详细信息。
本文档中的信息都是基于特定实验室环境中的设备创建的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您是在真实网络上操作,请确保您在使用任何命令前已经了解其潜在影响。
有关文件规则的更多信息请参见“ Cisco技术提示规则”。
有时您需要对隧道封装的数据包进行分段以便在线路中进行传输。下面是一个相关示例。
在使用 L2TP over UDP 的情况下,所有协议的开销都包含一组额外的 IP、UDP 和 L2TP 报头。IP 报头是 20 字节,UDP 报头是 8 字节,L2TP 报头通常是 12 字节。12 字节的 L2TP 报头包含:
版本和标志字段(2 字节)
隧道 ID 和会话 ID 字段(各 2 字节)
2 字节的填充偏移量
4 字节的点对点协议 (PPP) 封装
下图显示了更多详细信息:
如果您启用数据序列化(默认情况下在 Cisco 设备中被禁用),您必须为 Ns 和 Nr 字段另外添加 4 字节。将 IP、UDP 和 L2TP 报头相加,可发现 L2TP over UDP 向数据包中添加了 40 字节的协议封装。
将 1500 字节的 IP 数据包封装到 L2TP 中时,封装的数据包变为 1540 字节(1500 + 40 字节的 IP、UDP 和 L2TP 报头)。 您必须对数据包分段以便通过标准以太网类型接口(包含 1500 字节的 MTU)进行传输。 封装的数据包分为两部分。第一个分段包含 1500 字节(1460 字节的原始 IP 数据包 + 40 字节的 L2TP 封装)。 第二个分段包含 60 字节(最后 40 字节的原始 IP 数据包 + 20 字节的 IP 开销)。
注意:仅第一个片段包含L2TP报头;第二个分段仅包含 IP 报头。这允许 L2TP 对等体(LAC 或 LNS)将两个分段重组为 1540 字节的隧道封装的原始数据包。
基于 User Datagram Protocol (UDP) 的第 2 层隧道协议 (L2TP) 以及其他第 2 层和第 3 层基于 IP 的隧道协议面临的问题之一是:隧道协议的开销增加了隧道封装的数据包大小。如果原始数据包已是最大尺寸,您必须将隧道封装的数据包分段以便在线路中进行传输。
分段与重组 L2TP 接入集中器 (LAC) 和 L2TP 网络服务器 (LNS) 中的 L2TP 数据包引起的问题之一是:分段与重组是在 Cisco IOS 软件中的进程级别完成的。当在 LNS 中聚集大量的 L2TP 会话和数据流时,进程交换可能会大大降低性能。出于该原因,减少或排除在 L2TP 交换路径中分段和重组的需求是非常必要的。
使用本文档中所述的方法之一调整最大传输单元 (MTU) 以解决该问题。
Cisco IOS 软件中的多个配置和功能旨在通过调整 MTU 来避免在 L2TP 交换路径中分段和重组。
使用 ip mtu 命令在虚拟模板接口上配置较低的 IP MTU。配置较低的 IP MTU 以迫使路由器丢弃任何超过 IP MTU 并且已在 IP 报头中设置 DF(不分段)位的 IP 数据包。然后,路由器生成面向数据包源(原始主机)的“Internet Control Message Protocol (ICMP) type 3 Host Unreachable, code 4 fragmentation needed”消息。 该消息指示接口的 IP MTU,以便源可以缩小数据包大小来适合接口。该进程还称为路径 MTU 检测 (PMTUD)。 有关详细信息,请参阅 RFC 1191 。 添加完整的 L2TP 报头时,将 IP MTU 配置为不超过 LAC 与 LNS 之间的 PMTU 的最大 IP 数据包大小。对于 1500 字节的 PMTU 和 40 字节的标准 L2TP 报头,请将 IP MTU 设置为 1460(1500-40 字节的报头)。
如果 LAC 与 LNS 之间的 PMTU 未知(或发生更改),您可以在 vpdn-group 下配置命令 ip pmtu 。Cisco IOS 软件版本 12.2(4)T 中已使用 Bug ID CSCds72714(外部用户不能查看)添加了 ip pmtu 命令。 ip pmtu 功能将 DF 位从内部数据包复制到外部 L2TP 报头,并在路由器与其 L2TP 隧道终点之间启用 PMTUD。
Microsoft Windows 包含允许您为 PMTU 发现启用补偿功能的注册表设置。有关 Windows NT 的信息,请参阅 Microsoft 网站上的下列文章:Windows NT 3.51 的 PMTU 黑洞检测算法更改 (Q136970)。
对于Windows 2000/XP,Microsoft文章“How to Troubleshoot Black Hole Router Issues(Q314825)(如何排除黑洞路由器问题(Q)) ”介绍了Windows中避免此问题的各种方法。该文章对“黑洞”路由器进行了定义,介绍了定位黑洞路由器的方法,并给出了三种避免黑洞路由器可能会导致的数据丢失的建议方法。
您还可以启用 IP MTU 的自动调整。该功能允许路由器自动调整虚拟访问接口上的 IP MTU 以补充 L2TP 报头和输出接口的 MTU 的大小。Cisco IOS 软件版本 12.1(5)T 中已使用 Bug ID CSCdr01713(仅限注册用户)添加了该功能。
注意:仅当虚拟模板接口上没有手动配置IP MTU时(使用上一节中的选项),IP MTU才会自动调整。
最初,该功能在默认情况下处于启用状态,并且无法将其禁用。Cisco IOS 软件版本 12.2(3) 和 12.2(4)T 中的 Bug ID CSCdt67753(仅限注册用户)后来将命令 [no] ip mtu adjust 添加到 vpdn-group 下以启用和禁用该功能。默认情况下会启用该功能。该功能没有命令行界面 (CLI) 来更改仅面向 L2X 连接的默认值,这些连接不绑定到 vpdn-group(例如 SGBP 启动的 L2F 或 L2TP 隧道)。 由于无法为多机箱多链路 PPP (MMPPP) 拓扑禁用该功能,再加上如下所述的 PMTUD 问题,引起许多用户投诉。出于这个原因,在 Cisco IOS 软件版本 12.2(6)、12.2(8)T 及更高版本中,开始使用 Bug ID CSCdu69834(仅限注册用户)将默认值更改为禁用 IP MTU 自动调整功能。
MTU 的手动和自动调整取决于终端主机之间的 PMTUD。虽然理论上行得通,但 PMTUD 不能在 Internet 中正常使用。有关 PMTUD 如何在 Internet 上中断的详细说明,请参阅 RFC 2923 。 最大的问题是,“黑洞”的存在会导致网页下载在传输数据流的过程中显示为挂起。这些黑洞通常是由配置为滤掉 ICMP 消息的防火墙或路由器导致的。当大数据包的源不能从路由器接收“ICMP Host Unreachable”消息时,表示已超过 MTU,它不能减少数据包的大小。但是,它可以通过设置的 DF 位反复尝试并重新传输相同的数据包。由于这些数据包超过 PMTU 并且连接停止响应,因此会被 LNS 丢弃。
由于依赖 PMTUD 来检测 L2TP 隧道上的 IP MTU 较小存在问题,Cisco 已在 Cisco IOS 软件版本 12.2(4)T 中添加了 TCP 最大数据段大小 (MSS) 调整功能。
在 Cisco IOS 软件版本 12.2(4)T 及更高版本中,通过 Bug ID CSCds69577(仅限注册用户)添加的 TCP 最大数据段大小调整功能允许路由器修改终端主机发送的传入和传出同步 (SYN) 数据包中所通告的 TCP MSS。通过将 TCP MSS 的值修改为低于通常的默认值 1460,可以避免将 TCP 作为最大尺寸的数据包的来源。应将 TCP MSS 调整为此类值,即包含 TCP/IP 报头并封装在 L2TP over UDP 中的 TCP 分段不超过输出接口的 IP MTU。TCP/IP 报头通常为 40 字节,L2TP over UDP 报头为另外的 40 字节。因此,通常 TCP MSS 应调整为 1420(1500 - 40 字节的 TCP/IP 报头 - 40 字节的 L2TP over UDP 报头)。
用于该任务的命令是 ip tcp adjust-mss <mss>,它是一个接口级别命令。
用于减少 L2TP 网络中的分段的最后一个选项要求为点对点协议客户端中的最大接收单元 (MRU) 协商提供支持。PPP 中的 MRU 选项允许对等体通告它的最大接收单元。例如,如果对等体通告 MRU 为 1460,则该对等体将不能处理有效负载超过 1460 字节的 PPP 帧。Cisco PPP 实施将接口的 MTU 用作它在 PPP 协商期间通告的 MRU 值。如果将 MTU 设置为默认的 1500 字节,则不会通告 MRU,因为这是 PPP 的标准默认值。但是,如果将 MTU 设置为 1460,则会通告 PPP MRU 为 1460 字节。如果 PPP 对等体侦听到在 PPP 协商期间通告的 MRU 并为该 PPP 链路调整其 MTU(并间接调整其 IP MTU),我们可以避免分段。通告 PPP MRU 为 1460 字节后,对等体应将 IP MTU 设置为 1460。这反过来会修改对等体在打开 TCP 连接时通告的 TCP MSS,并避免通过 L2TP 网络分段。
使用 mtu <bytes> 命令在虚拟模板接口中配置较低的 MTU。同样,这也需要支持 PPP 客户端以侦听在 PPP 协商期间通告的 MRU。已知的一个用于侦听 MRU 选项的客户端是 Windows XP PPP 客户端。但遗憾的是,其他通常部署的 PPP 客户端并不遵守它们应遵守的所通告的 PPP MRU。请参阅 PPP 客户端文档以确定是否将正确使用所通告的 PPP MRU。通过代理 LCP 运行 L2TP 时,由于在 LCP 阶段对 MRU 选项进行了协商,因此必须执行 LCP 重新协商。要启用 LCP 重新协商,请在 vpdn-group 下配置 lcp renegotiation on-mismatch 或 lcp renegotiation always。
降低 MTU 时,也会自动降低 IP MTU。当前,配置的 IP MTU 不能高于虚拟模板接口中的 MTU。可以通过 Bug ID CSCdx39828 将其作为一个功能/增强请求来跟踪(外部用户不能查看)。
该方法要求客户端在 LCP 协商期间侦听 MRU 选项。通常结合使用多个客户端:一些客户端侦听 MRU,而另一些不侦听。忽略 MRU 的客户端会导致如自动调整 IP MTU 部分中介绍的 PMTUD 问题。对于这些客户端,您可以通过清除 IP 数据包内部的 DF 位有效禁用 PMTUD,从而可以利用不同的解决方法。您可以通过下列配置达到上述目的:
interface virtual-template1 ip policy route-map clear-df ! route-map clear-df permit 10 match ip address 101 set ip df 0 ! access-list 101 permit tcp any any
Cisco IOS 软件提供了多种最大化 L2TP 交换性能的方法。PMTUD 是理想的解决方案。但是,由于 Internet 中的问题,有时它并不可靠。Cisco IOS 软件提供了一些备用机制以保持较高的 L2TP 交换性能并最大化用户连接。