目录

简介

有时当时数据流经过通用路由封装(GRE)隧道时,您可以成功地使用ping命令和Telnet,但您不能使用文件传输协议(FTP) 下载互联网页或传输文件。 本文档将说明此问题的常见原因,并提供几种解决方法。

先决条件

要求

本文档需要对 GRE 拥有基本的了解。要了解有关 GRE 的详细信息,请参阅以下文档:

使用的组件

本文档不限于特定的软件和硬件版本。

有关本文档所用命令的详细信息,请使用命令查找工具(仅限注册用户)。

规则

有关文档规则的详细信息,请参阅 Cisco 技术提示规则。

数据包分段与 ICMP 消息

本文档使用以下网络图作为示例:

56a.gif

在以上图表中,当客户端想要访问互联网上的页面时,它将使用网络服务器建立 TCP 会话。在此进程期间,客户端和网络服务器宣布它们的最大分段尺寸(MSS),彼此指示各自能接受最大这个尺寸的TCP分段。在接收 MSS 选项时,每个设备计算可以发送的分段大小。这称为发送最大分段大小(SMSS),它等于两个MSS中较小的MSS。有关 TCP 最大数据段大小的详细信息,请参阅 RFC 879 。 leavingcisco.com

为了函数,假设网络服务器在上面的例子中确定它能发送 1500 个字节长的数据包。因此它向客户端发送 1500 字节数据包,并且,在 IP 头,设置“don't fragment”(DF)位。当数据包到达 R2 时,路由器会尝试将其封装成隧道数据包。在GRE隧道接口中,IP最大传输单位(MTU)是24个字节,低于实际流出接口的IP最大传输单位。对于以太网流出接口,这意味着隧道接口上的 IP MTU 可能是 1500 减 24 或者 1476 个字节。

R2 在尝试将 1500 字节的 IP 数据包发送到 IP MTU 为 1476 字节的接口。由于这不可能实现,因此 R2 需要分段数据包,创建一个 1476 个字节的数据包(数据和 IP 头)和一个 44 个字节的数据包(24 个字节的数据和一个 20 个字节的新 IP 头)。然后,R2 将这两个数据包以 GRE 方式封装,分别获得大小为 1500 字节和 68 字节的数据包。这些数据包现在可能被发送到实际出局接口外,共有 1500 字节 IP MTU。

但是,请记住,R2 接收的数据包设置了 DF 位。所以,R2 不能对数据包分段,相反地,它需要指示网络服务器发送更小的数据包。它通过发送互联网控制消息协议(ICMP)第3类代码4数据包(目的地不可达;需要分段但设置了 DF)。 此 ICMP 数据包含网络服务器将要使用的正确 MTU,网络服务器应该收到此消息,并相应调整数据包大小。

注意:  使用 debug 命令之前,请参阅有关 Debug 命令的重要信息。

可以通过启用 debug ip icmp 命令查看 R2 发送的 ICMP 消息:

ICMP: dst (10.10.10.10) frag. needed and DF set unreachable sent to 10.1.3.4

被阻挡的 ICMP 消息

在指向 Web 服务器的路径上阻止了 ICMP 消息时,就会发生常见问题。发生这一问题后,ICMP 数据包将始终无法到达 Web 服务器,从而使数据无法在客户端和服务器之间传输。

解决方案

这四个解决方案之一应能解决此问题:

进一步的解决方法

如果上述方案不可行,那么以下方案可能会有用:

总之,不能通过 GRE 隧道浏览互联网的最常见原因是上述分段问题。解决方案将允许 ICMP 数据包通过,或者使用任何上述解决方案作为解决 ICMP 相关故障的 workaround。

相关信息