曲径通幽论坛

标题: MTU 概念及检测 [打印本页]

作者: beyes    时间: 2012-5-29 19:46
标题: MTU 概念及检测
MTU
Maximum Transmission Unit
最大传输单元


是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。下表是不同网络的 MTU 值:
协议MTU
超级通道(Hyperchannel)65535
令牌环(16 Mbps)
17914
令牌环(4 Mbps)
4464
FDDI4352
以太网1500
X.25576
PPP296
如上所见,MTU 这个值通常与通信接口有关(网络接口卡、串口等)。

当数据包封装成帧时,数据包的长度必须小于 MTU 所指出的最大长度,这是由网络所使用的硬件和软件给出的限制所定义的:
[attach]517[/attach]

下图是 ICMP 数据包结构图:
[attach]518[/attach]

为了使 IP 协议与物理网络无关,协议的设计者决定让 IP 数据包的最大长度等于 65535 字节。如果使用这个数值的 MTU 协议时,传输会更加有效。但是对于一些物理网络,我们需要把数据分割,以使他们能够通过这些网络,这就叫做分片。分片工作在传输层进行,把数据划分成 IP 和在使用的数据链都可以接纳的大小。如果已经分片的数据报遇到了具有更小 MTU 的网络,那么这些已经分片的数据报还可以再进行分片。总之,数据报在到达最后终点之前可以经过多次的分片。

数据报可以被源主机或在其路径上的任何路由器进行分片。然而数据报的重装却只能在目的主机上进行,因为每一个分片都是独立的数据报。由于被分片的数据报可以各走不通的路由,因此我们永远无法控制或保证被分片的数据报应当走哪一条路径,而属于同一个数据报的所有数据报片应当最终到达目的主机。所以从逻辑上来讲,应当在最后终点进行重装。

检测 MTU
下面分别用 ping 命令在 Windows 上和 Linux 上测试 MTU 。

网关的 IP 为 192.168.1.1 ,那么在 Windows 下用 ping 命令去测试 MTU :
C:\Users\Administrator>ping -f -l 1473 192.168.1.1

正在 Ping 192.168.1.1 具有 1473 字节的数据:
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。

192.168.1.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
在上面的命令中,-f 参数表示在数据包中设置”不分段“标志。这个不分段标志位于 IP 数据报的包头中。如果该标志被设立,那么数据包在超出 MTU 值时也不会被分片,因此会看到上面的提示,其意思是,“数据包要想通过,那么需要拆分数据包,但设置了 DF 标志造成数据包没法分片”。-l 参数表示发送缓冲区的大小,也就是上面“ICMP”数据包结构图中的“数据”部分。

现在,将上面的 1473 改为 1472 再继续测试:
C:\Users\Administrator>ping -f -l 1472 192.168.1.1

正在 Ping 192.168.1.1 具有 1472 字节的数据:
来自 192.168.1.1 的回复: 字节=1472 时间=1ms TTL=64
来自 192.168.1.1 的回复: 字节=1472 时间=1ms TTL=64
来自 192.168.1.1 的回复: 字节=1472 时间=1ms TTL=64
来自 192.168.1.1 的回复: 字节=1472 时间=1ms TTL=64

192.168.1.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 1ms,最长 = 1ms,平均 = 1ms
这下子可以通过了。那么问题是:为什么是 1472 这个值?它是如何计算得出?
由上面的表格知道,以太网的 MTU 值为 1500。一个 IP 数据包的包头占 20 个字节。在使用 ping 程序来模拟数据发送时,使用的是 ICMP 协议,而 ICMP 协议的包头是 8 个字节,因此有 1472 + 20 + 8 = 1500 。

在 Linux 下同样可以模拟上面的命令,使用方法是:
[beyes@beyes   ~]$ ping -c 4 -M do -s 1473 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 1473(1501) bytes of data.
From 192.168.1.104 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 192.168.1.104 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 192.168.1.104 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 192.168.1.104 icmp_seq=1 Frag needed and DF set (mtu = 1500)

--- 192.168.1.1 ping statistics ---
0 packets transmitted, 0 received, +4 errors
上面命令中,-c 选项表示要发送多少次数据; -M 选项后跟 do 的作用和 Windows 里的 -f 参数一样的意思; -s 指定数据缓冲区大小。

下面再看一个例子:
比如我目前使用的是 TP LINK 的路由器,在路由器的内置里的 MTU 值为 1480 :
[attach]519[/attach]
同样用上面的方法 ping 一个外网的网站:
C:\Users\Administrator>ping -f -l 1453 184.22.140.27

正在 Ping 184.22.140.27 具有 1453 字节的数据:
需要拆分数据包但是设置 DF。

184.22.140.27 的 Ping 统计信息:
    数据包: 已发送 = 1,已接收 = 0,丢失 = 1 (100% 丢失),
Control-C
^C
C:\Users\Administrator>ping -f -l 1452 184.22.140.27

正在 Ping 184.22.140.27 具有 1452 字节的数据:
来自 184.22.140.27 的回复: 字节=1452 时间=176ms TTL=52
来自 184.22.140.27 的回复: 字节=1452 时间=176ms TTL=52

184.22.140.27 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 176ms,最长 = 176ms,平均 = 176ms
Control-C
^C
从上面的 ping 结果同样可以计算到 1452 + 28 = 1480 ,该值符合路由器里的设置。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2