以太网二层网络数据包格式
扁平网络
整个网络没有二层隔离的概念,所有二层网络包没有vlan tag,交换机也不会配置vlan转发规则,二层数据包自由转发,广播域是不被隔离的,但是现在已经很少用这种网络模型了
vlan网络
二层网络以vlan tag进行隔离,ip为10.0.0.1/24的主机与ip为10.0.0.2/24的主机,虽然ip看起来是一个子网的,但是因为主机网卡的vlan tag不一致而造成二层数据包不可达(Fa0/1只转发vlan tag == 10的数据包,fa0/2只转发vlan tag ==20的数据包)。
每一个vlan都可以理解为隔离开一个单独的ip地址名称空间,vlan=1的二层网络中可以有一个主机的ip是192.168.1.1,vlan=2的二层网络中同样可以有一个主机的ip是192.168.1.1,这两台主机的网线插到同一个交换机上不会发生ip地址冲突(ARP广播被vlan tag隔离)。所以上图可以被理解为是完全2个隔离的网络,甚至可以是2个公司的网络,vlan=10的网络中10.0.0.0的网络段内可以出现和vlan==20的网络中重复的ip而整个承载网络的机房不受影响。
不过因为vlan的号段有限且很难跨机房,因此只有小型的云会采用vlan网络模型。
vxlan网络
vxlan是封装转发,它将二层网络帧封装在udp数据包中,由vxlan的程序进行转发(当然,vxlan的程序需要知道被封装的数据包要发往哪台目标主机,即自己能够清晰地进行路由)。vxlan程序的意思是,两台虚拟机的宿主机上都需要安装支持vxlan的程序,比如k8s中的flanneld。
虚拟机或容器的数据包(上图的绿色线路)通过多个虚拟网卡/网桥发出后,最终被flanneld截获,将真正的二层数据包当做载荷放到udp报文内,并且在数据中标明发送端的vni号, 转发给目标节点,目标节点的flanneld收到数据后检查相关的vni是否在自己的负责范围内,如果不在则数据包被丢弃,否则解出二层数据包后,将其发送给对应vni号的虚拟机或容器的虚拟网卡
到此,相当于flanneld的程序承担了类似硬件交换机的角色,在转发二层网络数据前检查数据的vni(取代vlan tag)是否归自己管理。归自己管理就将二层数据交给虚拟机/容器,不归自己管理就丢弃
其它隧道封装模型
vxlan并不是数据包隧道封装的唯一解,还有很多公司有商用级或性能更高/更可靠(毕竟vxlan基于udp)的封装技术