如何设置 MTU 来提高网络的转发效率

通过调整 MTU 可以改善网络转发效率

MTU简介

通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

探测 MTU 最佳值

  • 在 Windows 下 探测 MTU 值

    • 执行 ping –l 1452 –f www.baidu.com 查看结果
    • 其中 -l 指定了包的大小 -f 通知操作系统 不修改包大小
    • 正常情况下是下列返回结果

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      C:\Users\Administrator>ping -l 1452 -f www.baidu.com
      正在 Ping www.a.shifen.com [61.135.169.125] 具有 1452 字节的数据:
      来自 61.135.169.125 的回复: 字节=1452 时间=43ms TTL=54
      来自 61.135.169.125 的回复: 字节=1452 时间=38ms TTL=54
      来自 61.135.169.125 的回复: 字节=1452 时间=41ms TTL=54
      来自 61.135.169.125 的回复: 字节=1452 时间=38ms TTL=54

      61.135.169.125 的 Ping 统计信息:
      数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
      往返行程的估计时间(以毫秒为单位):
      最短 = 38ms,最长 = 43ms,平均 = 40ms
    • 你可以逐步增加包的大小 直到显示 需要拆分数据包但是设置 DF。

    • 取上一次正常的值
  • 在 Linux 下 探测 MTU 值

    • 执行 ping -c 2 -s 1452 www.baidu.com 查看结果
      1
      2
      3
      4
      5
      6
      7
      8
      root@LEDE:/mnt/pi/ssd/ipk/Installed# ping -c 2 -s 1452 www.baidu.com
      PING www.baidu.com (115.239.211.112): 1452 data bytes
      1460 bytes from 115.239.211.112: seq=1 ttl=57 time=7.140 ms
      1460 bytes from 115.239.211.112: seq=2 ttl=57 time=7.740 ms

      --- www.baidu.com ping statistics ---
      2 packets transmitted, 2 packets received, 0% packet loss
      round-trip min/avg/max = 7.140/7.645/8.040 ms
  • 最后计算 MTU 的值 把测量的结果 加上8(ICMP回显示请求和回显应答报文格式长度) 加上20(IP首部) 就是最终的 MTU

  • 我测出来的是 1452 所以最终的结果是 1452+8+20 等于 1480

设置 MTU 值

  • Windows 下设置 MTU 值

    • netsh interface ipv4 show subinterface 查看当前网卡的 MTU

      1
      2
      3
      4
      5
      6
      7
      PS C:\WINDOWS\system32> netsh interface ipv4 show subinterface

      MTU MediaSenseState 传入字节 传出字节 接口
      ------ --------------- --------- --------- -------------
      1500 1 1748040736 355087634 以太网
      1200 1 15402 144109 以太网 2
      4294967295 1 0 210812 Loopback Pseudo-Interface 1
    • 执行 netsh interface ipv4 set subinterface "以太网" mtu=1480 store=persistent 设置 MTU

      • "以太网" 是就是上一个命令看到的接口名称
  • Linux 下设置 MTU 值

    • ifconfig 查看网卡信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      [root@localhost ~]# ifconfig
      enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
      inet 192.168.2.200 netmask 255.255.252.0 broadcast 192.168.3.255
      inet6 fe80::1e1b:dff:fe02:201b prefixlen 64 scopeid 0x20<link>
      ether 1c:1b:0d:02:20:1b txqueuelen 1000 (Ethernet)
      RX packets 4047615 bytes 2282357446 (2.1 GiB)
      RX errors 0 dropped 385083 overruns 0 frame 0
      TX packets 4003783 bytes 2450580381 (2.2 GiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
      inet 127.0.0.1 netmask 255.0.0.0
      inet6 ::1 prefixlen 128 scopeid 0x10<host>
      loop txqueuelen 0 (Local Loopback)
      RX packets 1503762 bytes 1305871099 (1.2 GiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 1503762 bytes 1305871099 (1.2 GiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    • 这里以 enp2s0 接口为例

    • 执行 ifconfig enp2s0 mtu 1480 up 即可修改 MTU 值 重启后失效
    • 永修修改 MTU值
      • CentOs 修改 /etc/sysconfig/network-scripts/ifcfg-enp2s0
        • 添加一行 MTU=1480
      • Debian 修改 /etc/network/interfaces
        • 添加一行 mtu 9000
    • 重启网络生效