MTU最大传输单位
最大传输单元(Maximum Transmission Unit,MTU)_51CTO博客_最大传输单元MTU
数据链路层之以太网、MAC、MTU详解_mac mtu-CSDN博客
各封包之间的相关性
链路层:如果使用以太网络时,此时IP会根据CSMA/CD的标准,包裹到MAC讯框中,并给予MAC表头。
网络层:将TCP包裹包进IP封包内,再给予一个IP表头,向链结结层丢去。
图 1
TCP/IP的链结层相关协议
以太网络的传输协议:CSMA/CD. "IEEE 802.3 的标准 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) "
图 2
- MAC是CSMA/CD 传送出去的讯框。又简称网卡卡号为 MAC
- 以太网络上面的传输使用网络卡卡号为基准的 MAC 讯框,配合 CSMA/CD 的标准来传送讯框,这就是硬件部分。
- 把 MAC 想成是一个在网络线上面传递的包裹,而这个包裹是整个网络硬件上面传送数据的最小单位了。 也就是说,网络线可想成是一条『一次仅可通过一个人』 的独木桥, 而 MAC 就是在这个独木桥上面动的人。
TCP/IP的网络层---IP封包
图 3
图 4
ICMP
ICMP协议:网际控制报文协议
ICMP协议的数据位于IP字段的数据部分,它是在IP报文的内部被传送的。
图 5
图 6
- 标准的讯框(指的是以太网络标准讯框)数据在网络卡与其他以太网络媒体一次只能传输 1500bytes。
- 讯框内的数据内容(指的是不包括表头的实际数据)最大可达 1500bytes 这我们现在知道了,那为何要规范最小数据为 46bytes 呢?这是由于 CSMA/CD 机制所算出来的! 在这个机制上面可算出若要侦测碰撞,则讯框总数据量最小得要有 64bytes ,那再扣除目的地址、来源地址、资料栏位通讯(原文没有这一项,系疏忽忘记写了)、检查码 (前导码不算) 后【见图2,目的地址--6bytes,来源地址--6bytes,资料栏位通讯--2bytes,检查码--4bytes,一共18bytes】, 就可得到数据量【见图2,主要资料】最小得要有 46bytes 【64bytes-18bytes=46bytes】了!也就是说,如果妳要传输的数据小于 46byes ,那我们的系统会主动的填上一些填充码, 以补齐至少 46bytes 的容量才行!
- 总数据量=表头+实际的资料(实际的数据)
MTU 最大传输单位
通过上面 MAC 封装的定义,现在我们知道标准以太网络讯框所能传送的数据量最大可以到达 1500 bytes , 这个数值就被我们称为 MTU (Maximum Transmission Unit,最大传输单位)。 你得要注意的是,每种网络接口的 MTU 都不相同,因此有的时候在
某些网络文章上面你会看到 1492 bytes 的 MTU 等等。不过,在以太网络上,标准的定义就是 1500 bytes。在待会儿会介绍到的 IP 封包中,这个 IP 封包最大可以到 65535 bytes,比 MTU还要大呢!既然礼物 (IP) 都比盒子 (MAC) 大,那怎么可能放的进去啊?所以啰, IP封包是可以进行拆解的,然后才能放到 MAC 当中啊!等到数据都传到目的地, 再由目的地的主机将他组装回来就是了。所以啰,如果 MTU 能够大一些的话,那么 IP 封包的拆解情况就会降低, 封包与封包传送之间的等待时间 (前一小节提到的 96 bit time)也会减少,就能够增加网络带宽的使用啰!
追踪整个网络传输最大的MTU时,又该如何查询?
ping命令
#ping [选项与参数] IP
选项与参数:
-c 数值:后面接的是执行 ping 的次数,例如 -c 5 ;
-n:在输出数据时不进行 IP 与主机名的反查,直接使用 IP 输出(速度较快);
-s 数值:发送出去的 ICMP 封包大小,预设为 56bytes,不过你可以放大此一数值;
-t 数值:TTL 的数值,预设是 255,每经过一个节点就会少一;
-W 数值:等待响应对方主机的秒数。
-M [do|dont] :主要在侦测网络的 MTU 数值大小,两个常见的项目是:--do :代表传送一个 DF (Don't Fragment) 旗标,让封包不能重新拆包与打包;--dont:代表不要传送 DF 旗标,表示封包可以在其他主机上拆包与打包
关于加大讯框
谈到加大讯框 (frame) 时, 对于网络效能是有帮助的,因为封包打包的次数会减少,加上如果整个传输的媒体都能够接受这个frame 而不需要重新进行封包的拆解与重组的话,那么效能当然会更好,那个修改 frame 大小的参数就是 MTU 啦!
好了,现在我们知道网络卡的 MTU 修改可以透过 ifconfig 或者是 ip 等指令来达成,那么追踪整个网络传输的最大 MTU 时,又该如何查询?呵呵!最简单的方法当然是透过 ping 传送一个大封包, 并且不许中继的路由器或 switch
将该封包重组,那就能够处理啦!
找出最大的的MTU数值
[root@www ~]# ping -c 2 -s 1000 -M do 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 1000(1028) bytes of data.
1008 bytes from 192.168.1.254: icmp_seq=1 ttl=64 time=0.311 ms
# 如果有响应,那就是可以接受这个封包,如果无响应,那就表示这个 MTU 太大了。
[root@www ~]# ping -c 2 -s 8000 -M do 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 8000(8028) bytes of data.
From 192.168.1.100 icmp_seq=1 Frag needed and DF set (mtu = 1500)
# 这个错误讯息是说,本地端的 MTU 才到 1500 而已,你要侦测 8000 的 MTU
# 根本就是无法达成的!那要如何是好?用前一小节介绍的 ip link 来进行MTU 设定吧!
不过,你需要知道的是,由于 IP 封包表头 (不含 options) 就已经占用了 20bytes ,再加上 ICMP 的表头有 8 bytes ,所以当然你在使用 -s size 的时候,那个封包的大小就得要先扣除 (20+8=28) 的大小了。 因此如果要使用 MTU 为1500 时(指的是MAC讯框内,除去MAC表头后的实际数据值),就得要下达『 ping -s 1472 -M do xx.yy.zz.ip 』才行啊!
###比如调整为1472就可以
root@www:~/vbirdbook# ping -c 2 -s 1472 -M do 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 1472(1500) 字节的数据。
1480 字节,来自 192.168.0.1: icmp_seq=1 ttl=64 时间=0.593 毫秒
1480 字节,来自 192.168.0.1: icmp_seq=2 ttl=64 时间=0.625 毫秒--- 192.168.0.1 ping 统计 ---
已发送 2 个包, 已接收 2 个包, 0% packet loss, time 1054ms
rtt min/avg/max/mdev = 0.593/0.609/0.625/0.016 ms###调整为1473就卡住了
root@www:~/vbirdbook# ping -c 2 -s 1473 -M do 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 1473(1501) 字节的数据。
ping: sendmsg: 消息过长
ping: sendmsg: 消息过长
^C
--- 192.168.0.1 ping 统计 ---
已发送 2 个包, 已接收 0 个包, +2 错误, 100% packet loss, time 1006msroot@www:~/vbirdbook#
另外,由于本地端的网络卡 MTU 也会影响到侦测,所以如果想要侦测整个传输媒体的 MTU 数值, 那么每个可以调整的主机就得要先使用 ifcofig 或 ip 先将 MTU 调大,然后再去进行侦测, 否则就会出现像上面提供的案例一样,可能会出现错误讯息的!