对于Windows 7、Windows Vista和Windows XP,各种接口的MTU可以从Windows本身使用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.
Tested with Windows 7 Service Pack 1
Windows XP
Windows XP的netsh
语法略有不同:
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不提供在netsh
内更改MTU设置的方法。为此,您可以 TCP ](http://support.microsoft.com/kb/283165) ( 注: 仅限 Windows 2000/XP)
用 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
那么产生的ethernet数据包就会满满当当。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.
-f标志的意思是do not fragment。
0x1&
数据包需要被分割,但是Do not Fragment标志被设置了。
如果沿线任何地方的数据包需要被碎片化,网络实际上会发送一个ICMP数据包告诉你发生了碎片化。你的机器收到了这个ICMP包,被告知最大的大小是多少,并且应该停止发送太大的数据包。不幸的是,大多数防火墙会阻止这些 "路径MTU发现 "的ICMP数据包,所以你的机器永远不会意识到数据包被碎片化了(或者更糟糕的是:因为它们不能被碎片化而被丢弃)。
这就是导致web-server无法工作的原因。你可以得到最初的小的(<1280字节)响应,但是更大的数据包却无法通过。而且web服务器的防火墙配置错误,屏蔽了ICMP数据包。所以web服务器并不知道你从来没有收到过数据包。
在IPv6中不允许数据包的碎片化,大家都是_必须(正确)允许ICMP mtu发现数据包。