曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4489|回复: 0
打印 上一主题 下一主题

MTU 概念及检测

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-5-29 19:46:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MTU
Maximum Transmission Unit
最大传输单元


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

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


下图是 ICMP 数据包结构图:


为了使 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 :

同样用上面的方法 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 ,该值符合路由器里的设置。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 19:48 , Processed in 0.083596 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表