From: http://blog.chinaunix.net/u3/106587/showart_2112287.html
MTU即最大传输单元,在联网时有着关键的作用,如果发现有的网站上不去了,或者传不了大的文件,有可能是MTU 的值设置有问题。比如客户端 PC 设置的 MTU 是 1500 ,而网关允许的 MTU 是 1400 ,那对于包长在 1400 到 1500 之间的包, PC 不会主动去分段( IP fragment ),网关收到这样的包就传丢弃了。而如果把客户端 PC 的 MTU 值改为 1400 ,对于大于 1400 的包, PC 会主动作分段处理,保证每个包长都是小于等于 1400 的,网关就可以正常转发了。
MTU 的设置通常有两种方法,一是静态手工配置。比如在 linux 上,可以用一句简单的命令 ifconfig eth0 mtu 1400 来搞定。在 windows 上,可以修改注册表,通常是在 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces/{adapter}/ 下面新建一个 , 名为 MTU 的 DWORD 值。
还一种方法就是在通过 dhcp 请求地址的时候,顺便请求 MTU 的值。下面这个实验就是针对这种情况。
Topology:
PC1(DHCP client)----------------PC2(DHCP server)
这两台 client 和 server 都是运行在虚拟机里的, client 是 CentOS 5.3, server 是 windows2000 server 。
PC1(CentOS) 默认会安装 dhclient ,这是一个 dhcp 客户端程序。常见命令:
dhclient –r # 释放 IP 地址
dhclient 获得 IP 地址。
配置文件: /etc/dhclient.conf ( 默认可能没有,可以新建这个文件 )
interface "eth0" {
send dhcp-lease-time 86400;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name, interface-mtu;
}
PC2(win2k server) 就使用自带的 DHCP 服务器。在服务器选项里,可以找到很多的 dhcp option ,其中 option 26 是给 MTU 用的,勾上这一项,并把值配为 0x4B0 ,即 1200.
实验步骤:
1. server 和 client 都正常配置了 mtu 选项的情况:
Client 运行 dhclient 后,抓包发现 , 在 dhcp discover 和 dhcp request 中, option 55(parameter request list) 中,会有一项 26 ,表明请求 interface MTU. 相应的,在 server 回的 dhcp offer 和 dhcp ack 中,也有一项 Option 26, (1a 02 04 b0) , 1a 是 option 类型 ( 即 26), 02 是长度, 04b0 是 MTU 大小。
在 linux 上,用 ifconfig 查看, MTU 果然是 1200.
2. 如果在 linux 上把 dhclient.conf 中的 request interface-mtu 去掉,先释放 IP ,再获取 IP, 发现 client 和 server 发的包中都不会含与 MTU 相关的 option. 表明在 dhcp server 上配置的 MTU 是不会强推给 client 的,只有当你去请求时,才会下发 MTU 值。
3. 如果 linux 客户端包含了 request interface-mtu ,而 server 端并未配置 option 26, 则在客户端发出的 discover 和 request 的 option55 中会包含 request mtu ,但在 server 回的包中不会包含 mtu 。在这种情况下, linux 端口会保留上次得到的 MTU 值,除非手工去更改。
上述实验表明,要想通过 DHCP 配置 MTU ,必须要在 client 和 server 上都有 option26 的相关配置才行。
另外 1 , Linux 上的 dhcp 服务器也可以配置 MTU 选项。如在 CentOS 中,编辑 /etc/dhcpd.conf , 加入一行:
option interface-mtu 1200;
然后重启 dhcpd 服务, service dhcpd restart 。
另外 2, 配置了 MTU 后如何验证是否生效呢,可以用 ping IP –l 1300 –f 来验证,要么 ping 通,或者提示需要分段。
另外3, dhcp client和dhcp server的配置文件例子:
/usr/share/doc/dhclient-3.0.5/dhclient.conf.sample
/usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample
发表于: 2009-12-06,修改于: 2009-12-06 18:08