对于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
netsh
Windows 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发现数据包。