|
MTU
Maximum Transmission Unit
最大传输单元
是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。下表是不同网络的 MTU 值:
协议 | MTU
| 超级通道(Hyperchannel) | 65535
| 令牌环(16 Mbps)
| 17914
| 令牌环(4 Mbps)
| 4464
| FDDI | 4352
| 以太网 | 1500
| X.25 | 576
| PPP | 296
| 如上所见,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
|