如何判断Windows XP中使用了什么MTU


21

我遇到了一个非常奇怪的问题,在尝试访问网页时,我会随机出现“与服务器的连接已重置”错误(根据Windows网络诊断工具,HTTP错误12031)-无论网页是否出现,这种情况都会发生我试图访问的是外部互联网,甚至是从本地主机上运行的本地Apache实例访问的。它会影响我们本地网络上的所有计算机(以太网,不是无线网络),所有这些计算机都在运行Windows XP。

已经向我建议,这可能与网络流量上使用的MTU有关。如果我执行Ping测试以找出可以无碎片通过的最大数据包,则可以使用1492字节的数据包对localhost进行ping操作(对于报头,则为+28字节?),并且可以使用1462字节的数据包对路由器进行ping操作(当您包含28字节的标头时为1490字节)。如果我尝试在外部(例如Google)上执行ping操作,则无法获得大于1430(带标头的1458)的任何内容。

我已经尝试按照各种说明使用此MTU设置更新Windows XP注册表update HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU。我尝试了无尽的替代值:最明显的正确值似乎是1490,但是我也尝试了1462、1458、1430等,等等。当我重新启动计算机以使更改生效时,它似乎可以工作几分钟(很难确定,因为它总是随机的而不是一致的),但是它不会持续很长时间。

最初,当我尝试使用1430作为值时,经过几分钟的正常工作,Ping测试的结果将减少28个字节-突然我发现我只能将1402个字节的数据包传递给Google。如果我将MTU注册表设置更新为1402,则当我重新启动并等待几分钟后,它将是1374,然后是1346,依此类推。等等。网络上的其他计算机仍然不受影响(仍为1430)并删除了MTU设置从注册表中恢复到正常状态(并且仍然损坏)。

对于诊断所有问题,我发现最困难的事情是很难分辨我是否正在使用正确的注册表设置。因此,最简单的问题是:我如何确定Windows尝试使用的MTU设置?

此外,如果有人有任何想法如何分辨MTU为何持续下降28,这也将很有用(例如,是否有Windows日志文件会在值更改时记录某些内容?)

最后,如果任何人都可以明确地告诉我如何告诉我应该尝试使用的MTU设置,那就太好了!


FWIW,最后是问题所在,这是一条不可靠的电话线。当我插入电话时,没有拨号音。
andygeers 2014年

Answers:


58

对于Windows 7,Windows Vista和Windows XP,Windows本身可以使用来获得各种接口的MTU netsh

Windows 7,Windows Vista

要在Windows 7或Windows Vista上显示当前的MTU,请从命令提示符下:

C:\Users\Ian>netsh interface ipv6 show subinterfaces

       MTU  MediaSenseState   Bytes In  Bytes Out  Interface
----------  ---------------  ---------  ---------  -------------
      1280                1   24321220    6455865  Local Area Connection
4294967295                1          0    1060111  Loopback Pseudo-Interface 1
      1280                5          0          0  isatap.newland.com
      1280                5          0          0  6TO4 Adapter

对于IPv4接口:

C:\Users\Ian>netsh interface ipv4 show subinterfaces

       MTU  MediaSenseState   Bytes In  Bytes Out  Interface
----------  ---------------  ---------  ---------  -------------
      1500                1  146289608   29200474  Local Area Connection
4294967295                1          0      54933  Loopback Pseudo-Interface 1

注意:在此示例中,我的本地连接IPv6接口具有如此低的MTU(1280),因为我正在使用隧道服务来获取IPv6连接

您还可以更改 MTU(Windows 7,Windows Vista)。在提升的命令提示符下:

>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.

经过Windows 7 Service Pack 1测试

Windows XP

netshWindows XP 的语法略有不同:

C:\Users\Ian>netsh interface ip show interface

Index:                                  1
User-friendly Name:                     Loopback
Type:                                   Loopback
MTU:                                    32767
Physical Address:                       

Index:                                  2
User-friendly Name:                     Local Area Connection
Type:                                   Etherenet
MTU:                                    1500
Physical Address:                       00-03-FF-D9-28-B7

注意: Windows XP要求启动路由和远程访问服务,然后才能查看有关接口(包括MTU)的详细信息:

C:\Users\Ian>net start remoteaccesss

Windows XP没有提供从内部更改MTU设置的方法netsh。为此,您可以:

经过Windows XP Service Pack 3测试

也可以看看


简短讨论什么是MTU,28字节来自何处。

您的网卡(以太网)的最大数据包大小为1,500 bytes

+---------+
| 1500    |
| byte    |
| payload |
|         |
|         |
|         |
+---------+

TCP / IP的IP部分需要一个20字节的标头(12字节的标志,4字节的源IP地址,4字节的目标IP地址)。这将减少数据包中的可用空间:

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |- IP header: 20 bytes
| 4 byte to address      | /
|------------------------|
| 1480 byte payload      |
|                        |
|                        |
|                        |
+------------------------+

现在,ICMP(ping)数据包具有8字节的标头(1字节type,1字节code,2字节checksum,4字节附加数据):

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
| 1472 byte payload      |
|                        |
|                        |
|                        |
+------------------------+

那就是“丢失”的28个字节所在的位置-它是发送ping数据包所需的标头的大小。

发送ping数据包时,您可以指定要包含的额外有效负载数据量。在这种情况下,如果包括全部1472个字节:

>ping -l 1472 obsidian

然后,生成的以太网数据包将被装满。1500字节数据包的每个最后一个字节将被填充:

+------------------------+
| 12 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
|........................|
|........................|
|. 1472 bytes of junk....|
|........................|
|........................|
|........................|
|........................|
+------------------------+

如果您尝试再发送一个字节

>ping -l 1473 obsidian

网络将不得不将1501字节的数据包分成多个数据包:

Packet 1 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
|........................|
|........................|
|..1472 bytes of payload.|
|........................|
|........................|
|........................|
|........................|
+------------------------+

Packet 2 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address    | |
| 4 byte to address      | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header     | /
|------------------------|
|.                       |
| 1 byte of payload      |
|                        |
|                        |
|                        |
|                        |
|                        |
+------------------------+

这种碎片化将在幕后发生,理想情况下是您不知道的。

但是您可能会很卑鄙,并告诉网络不允许将数据包分段:

>ping -l 1473 -f obsidian

-f标记的装置不分段。现在,当您尝试发送不适合网络的数据包时,您将收到错误消息:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

数据包需要分段,但是设置了“不分段”标志。

如果沿线路的任何地方需要对数据包进行分段,则网络实际上会发送一个ICMP数据包,告诉您发生了分段。您的计算机收到此ICMP数据包,被告知最大大小,并应停止发送太大的数据包。不幸的是,大多数防火墙都阻止了这些“路径MTU发现” ICMP数据包,因此您的计算机永远不会意识到这些数据包是碎片化的(或更糟糕的是:由于无法碎片化而被丢弃)。

这就是导致Web服务器无法正常工作的原因。您可以得到初始的较小(<1280字节)响应,但较大的数据包无法通过。而且,Web服务器的防火墙配置错误,阻止了ICMP数据包。因此,Web服务器不会意识到您从未收到该数据包。

IPv6不允许对数据包进行分段,每个人都必须(正确)允许ICMP mtu发现数据包。


8

@ian我不确定netsh实际显示的是当前使用的MTU。在我的Windows XP Pro SP3计算机上,我执行netsh interface ip show interface了该命令,并将相关接口的MTU值报告为1500。然后,我添加了以下注册表项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnablePMTUDiscovery
    value: 0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{ID}\MTU 
    value: various (e.g. 1200)

微软表示,设置EnablePMTUDiscovery为0会将MTU设置为576。

设置MTU注册表项将手动设置MTU。我尝试了几个值的MTU条目(每次重新启动)。

在这两种情况下(先添加第一个条目,然后添加第二个条目),netsh仍然报告MTU为1500。使用ping进行的测试确认(或至少建议这样做)但实际上使用了注册表中配置的MTU值。

另外,当我第一次在计算机上尝试此操作时,“路由和远程访问”服务被禁用,因此我无法按照您的说明启动它。我通过转到控制面板>管理工具>计算机管理>服务和应用程序>服务来启用它。我将“启动类型”从“禁用”更改为“手动”。然后,我也从该对话框启动了服务。

我也不确定KB283165是否一定是更改MTU的正确说明。这些说明仅在运行Windows PPPoE客户端时才有意义吗?如果通过路由器作为PPPoE客户端的路由器连接到Internet(如我的案例),那么这些说明将不相关,对吗?

我遵循的指示使我对注册表进行了上述更改,位于KB900926:MTU大小小于576(方法2和3)的WAN链接的建议TCP / IP设置


由@ian编辑

看起来你是对的。配置为1,200,但netsh报告1500

在此处输入图片说明

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

因此,我想原始问题的答案是,在Windows XP上,您必须使用带有“ 请勿分段”标志的反复试验才能找到可以发送的最大数据包。然后,您便拥有了MTU。


2

您可以使用ping和反复试验方法找到MTU:

ping <address> -f -l nnnn

-f:指定发送的Echo Request消息的IP头中的Do n't Fragment标志为1。在到达目标路径的路由器无法对Echo Request消息进行分段。此参数对于排除路径最大传输单位(PMTU)问题很有用。

-l Size:指定发送的Echo Request消息中Data字段的长度(以字节为单位)。默认值为32。最大大小为65,527。

当长度太大时,您将收到“数据包需要分片,但DF已设置”消息。


这就是我上面提到“ Ping测试”时所做的事情
andygeers 2009年

1

请参阅AdapterWatch

AdapterWatch显示有关您的网络适配器的有用信息:IP地址,硬件地址,WINS服务器,DNS服务器,MTU值,已接收或已发送的字节数,当前传输速度等。此外,它还显示本地计算机的常规TCP / IP / UDP / ICMP统计信息。


1

Microsoft KB314496:不同网络拓扑的默认MTU大小
在正常的网络设置中,您不应尝试使用MTU配置。

这里有一个VB代码参考
还有一个名为DrTCP的工具:

替代文字


在注册表中

  • HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • 打开您感兴趣的适配器
  • 复制ServiceName字符串
  • 搜索该字符串HKLM\System;你会匹配一把NetCfgInstanceId钥匙
  • 略高于此为MaxFrameSize关键(我的节目显示1514)

还有一种方法可以通过netsh命令进行更改。

另外,检查您的Path MTU Discovery配置


谢谢,但是理想情况下,如果我可以让Windows真正告诉我实际使用的是什么MTU ,而不仅仅是您期望的默认MTU,我将更加放心。也许这也许是不可能的:-(
andygeers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.