MTU也听说了好多次了,这次还是头一回仔细想这个参数。

Overlay Network

  • overlay,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其它网络业务分离,并且以基于IP的基础网络技术为主。Overlay 技术是在现有的物理网络之上构建一个虚拟网络,上层应用只与虚拟网络相关。

Vxlan

  • Vxlan就是一种应用广泛,成熟度高的overlay技术。它通过MAC in UDP的形式包装报文。
    图片加载失败
  • VNI就是用来标示不同的Vxlan平面,24bits要比vlan的12bits更多。
  • 基于UDP,便于兼容一些现有的设备,如NAT。
  • 增加的报文头部共20+8+8+14=50字节。 (IP包应为20字节,图有问题)

Ethernet Frame

  • 在以太网链路上的数据包称作以太帧。以太帧起始部分由前导码和帧开始符组成。后面紧跟着一个以太网报头,以MAC地址说明目的地址和源地址。帧的中部是该帧负载的包含其他协议报头的数据包(例如IP协议)。以太帧由一个32位冗余校验码结尾。它用于检验数据传输是否出现损坏。
  • 以太帧的头尾大小加起来18字节,而标准的帧大小为1518字节。这个数值是一个折中的选择,因为网络是分时复用的,帧过大,latency增加,过小,则浪费资源。一个帧的传输是连续的。

MTU

  • Maximum Transmission Unit,最大传输单元。
  • MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。
  • 这个值会影响各个网络传输设备组织自己发出去包的形式,一般来说,超出大小的,会被切分成多个包。
  • 以太帧大小为1518字节,除去自己的头尾,就剩下1500字节。所以平时电脑上网卡显示的MTU都是1500字节。

Openstack VM (OVS)

  • 基于OVS的neutron网络,通常提供给VM的网络就是Vxlan实现。创建出来的VM,MTU默认为1450,源于标准的1500减去Vxlan增加的头部大小。这样设置对网络效率有利。
  • 如果不刻意去算MTU,一般也发现不了有什么问题,大多数网络设备都会将包分片,从而支持不同的MTU大小,只是网络速度上略微有些影响,平时感觉不出来。
  • 但是,OVS非常暴力,不会帮助切片,只是丢弃掉超出大小的包,所以如果VM发的包有问题,就会出现简单的ping可达,应用却经常timeout。(因为ping报文小,没有触及MTU)

Calico

  • 问题终于出现了,当在虚拟机上运行有关网络虚拟化的程序时,大多程序都不能正确设置自己的MTU大小,它们通常使用默认值1500,然后被OVS无情丢弃。

  • 虚拟化网络组件会创建自己的虚拟网卡,连接虚拟网关,这张虚拟卡,MTU需要仔细考量。

  • Calico如果开启了IP in IP功能,那么Calico自己也会在报文上增加20字节头,实现自己的Overlay,这时候MTU要设置成1430才能正常工作。

  • Calico Configure MTU Docs

Docker

  • Docker创建的网关,MTU会和host一致,而且此时linux bridge会帮助切片,不会引发断网现象,但有关性能。
  • 容器里感知到的MTU改成1450会更合适一些,这个在daemon.json中可以设置。