PMTU 黑洞路由器

来源:互联网 发布:java web编辑器 编辑:程序博客网 时间:2024/05/22 00:30

当路由器必须将 IP 包分段但又因 DF 标记设置为 1 而不能分段时,路由器可采用以下任一种方式:
发送符合 RFC 792 中最初定义的“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,然后丢弃该包。
原始消息格式中不包含有关转发失败的链路的 IP MTU 的信息。
发送符合 RFC 1191 中重新定义的“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,然后丢弃该包。此新消息格式包含一个 MTU 字段,可指出转发失败的链路的 IP MTU
RFC 1191 定义了路径 MTU (PMTU) 发现,它使得成对的 TCP 对等方能够动态地发现二者之间路径的IP MTU,从而发现该路径的 TCP MSS。一旦收到符合 RFC 1191 定义的“Destination Unreachable-Fragmentation Needed and DF Set”消息,TCP 就会将该连接的 MSS 调整为指定 IP MTU 减去 TCP  IP 报头的大小。这样,在该 TCP 连接上发送的后续包就不会超过最大大小,无需分段即可在该路径上传输。
直接丢弃包。
直接丢弃需分段但 DF 标记设置为 1 的包的路由器称为 PMTU 黑洞路由器。
 
PMTU 黑洞路由器会给 TCP 连接带来问题。例如Microsoft® Windows® XP  Windows Server™2003 中的 TCP/IP 协议默认情况下会使用 PMTU 发现。TCP 会发送 DF 标记设置为 1 的数据段,并且在需要时,会根据符合 RFC 1191 定义的“ICMP Destination Unreachable-Fragmentation Needed and DF SetICMP Type 3 Code 4消息的回执(其中包含 IP MTU),更改 TCP MSS值。
 
 TCP 三次握手期间交换的 TCP 数据段不会太大,因而不会被 PMTU 黑洞路由器丢弃。但是,一旦开始在连接上传输数据假定基于协商的 MSS 确定的 PMTU 比实际 PMTU —TCP 数据段的大于实际 PMTU IP 包就会被直接丢弃。
例如,您可以用 FTP 命令行工具成功地与 FTP 服务器建立连接并登录。但是,当您试图下载或者上载文件时,中间的 PMTU 黑洞路由器就会丢弃达到最大大小的 TCP 数据段,从而导致错误和文件传输失败。
您可以按照下面的语法使用 Ping 工具来检测 PMTU 黑洞路由器:
Ping destination –f –l ICMPEchoPayloadSize
此处的 destination 可以是一个 IP 地址,也可以是一个可解析为 IP 地址的名称。
-f 选项可将 DF 标记设置为 1
-l 选项指定 ICMP Echo 消息的有效负载的大小。
ICMPEchoPayloadSize  ICMP Echo 消息的有效负载的字节数。
要计算 ICMPEchoPayloadSize,可用您想发送的 IP 包的大小减去 28。这是因为,IP 报头的大小为 20字节,而 ICMP Echo 消息的 ICMP 报头的大小为 8 字节。下图显示了二者的关系。
例如,要发送长度为 1500 字节的 ICMP Echo 消息,您应使用以下命令:
ping destination –f –l 1472
如果有 IP MTU 更小的中间链路,且路由器发送了“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,则 Ping 工具会显示“Packet needs to be fragmented but DF set”消息。如果有 IP MTU 更小的中间链路,且 PMTU 黑洞路由器直接丢弃了包,则 Ping 工具会显示“Request timed out”消息。
要找出包含 PMTU 黑洞路由器的路径的有效 IP MTU,请使用 Ping 工具,同时不断增大 Echo 消息的有效负载的大小。因为典型子网的最小 IP MTU  576 字节,因此开始时可将 ICMP Echo 消息的有效负载设置为 548字节,然后每次递增 100 字节,直到找到有效 PMTU
例如,如果 ping 10.0.0.10 -f -l 972 命令显示“Reply from 10.0.0.10”,而命令 ping 10.0.0.10 -f -l 973 显示“Request timed out”,则 IP 地址为 10.0.0.10 的节点的有效 PMTU  1000 字节(972+28)

根据宽带连接方式的不同,MTU可能不尽相同:

1)PPPoE/ADSL: 1360-1492

2) PPTP VPN: 1400-1460

3) L2TP VPN: 1400-1460

4) Fixed IP: 1400-1500

5) DHCP: 1400-1492


 

PMTU 黑洞路由器的解决方案和工作方法

1. 配置中间路由器以支持路由器端 PMTU 发现

解决专用 Intranet 中的 PMTU 黑洞路由器问题的最简单的方法,是将您的所有路由器配置为支持路由器端RFC 1191,并支持发送 ICMP Destination Unreachable-Fragmentation Needed and DF Set 消息(其中带有转发失败的链路的 IP MTU)。这与将路由器配置为支持主机端 RFC 1191 是有区别的,后者的路由器会对自己的 TCP 连接使用 PMTU 发现。
 Internet 上进行通信时,通常不太可能将 Internet 路由器配置为支持路由器端 PMTU 发现。在这种情况下,您可以使用以下各节介绍的工作方法。
3. 确定最佳 IP MTU 并通过 MTU 注册表设置来设置该值
启用 PMTU 黑洞路由器检测的替代方法,是根据本文前面部分的介绍使用 Ping 工具确定所有相关路径的PMTU 值,然后使用注册表设置手动配置发送接口的 IP MTU
该方法通过不停发送 DF 标记设置为 1,大小又不会导致 PMTU 黑洞路由器将其直接丢弃的 IP 包来避开PMTU 黑洞路由器。手动指定 IP MTU 意味着所有通信量(包括本地子网通信量和不包含 PMTU 黑洞路由器的路径上的通信量)都将使用较小的 IP MTU
确定有效的 PMTU 后,您可以通过以下步骤手动指定 TCP/IP 接口的 IP MTU
1.
打开 Network Connections 文件夹,记下 LAN 连接的名称,如“Local Area Connection”
2.
单击开始,单击运行,键入“regedit.exe”,然后单击确定
3.
使用注册表编辑器工具的树图(左边窗格)打开如下键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Network\{4D36E972-E325-11CE-BFC1-08002BE10318}
4.
此键下面是与已安装的 LAN 连接相关联的全局唯一标识符 (GUID) 的一个或多个键。这些 GUID 键中的每一个都有一个 Connection 子键。打开每个 GUID\Connection 键,寻找值与第一步中记下的 LAN 连接的名称匹配的 Name 设置。
5.
如果找到包含与 LAN 连接匹配的 Name 设置的 GUID\Connection 键,请写下或记下该 GUID 值。
6.
使用注册表编辑器的树视图打开如下键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip \Parameters\Interfaces\GUID
7.
右键单击树视图中的“GUID”键,指向新建,然后单击双字节值
8.
在注册表编辑器工具的内容窗格(右窗格)中,为新注册表设置的值键入 MTU,然后按 ENTER
9.
在内容窗格中,双击新的 MTU 设置,并在编辑双字节值对话框中选择十进制,然后在数值数据中键入有效 MTU 值。
10.
单击确定。关闭注册表编辑器工具。
11.
重新启动计算机使 MTU 设置生效。
0 0
原创粉丝点击