当前主流的 Overlay 技术主要有VXLAN, GRE/NVGRE和 STT。这三种二层 Overlay 技术,大体思路均是将以太网报文承载到某种隧道层面,差异性在于选择和构造隧道的不同,而底层均是 IP 转发。如下表所示为这三种技术关键特性的比较。其中VXLAN利用了现有通用的UDP传输,其成熟性高。总体比较,VLXAN技术相对具有优势。
1. VLAN
1.1. VLAN介绍
-
定义
VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从而将广播报文限制在一个VLAN内。
局域网LAN(多个机器连接一个Hub或者Switch),是一个广播域,一台Switch划分出多个虚拟机的LAN,每个vlan中的主机连接交换机的端口是access口,从而保证了交换机只在同一个vlan中转发包 -
目的
以太网是一种基于CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享通讯介质的数据网络通讯技术。当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。通过交换机实现LAN互连虽然可以解决冲突严重的问题,但仍然不能隔离广播报文和提升网络质量。在这种情况下出现了VLAN技术,这种技术可以把一个LAN划分成多个逻辑的VLAN,每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,这样,广播报文就被限制在一个VLAN内。
-
作用
限制广播域:广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。
增强局域网的安全性:不同VLAN内的报文在传输时是相互隔离的,即一个VLAN内的用户不能和其它VLAN内的用户直接通信。
提高了网络的健壮性:故障被限制在一个VLAN内,本VLAN内的故障不会影响其他VLAN的正常工作。
灵活构建虚拟工作组:用VLAN可以划分不同的用户到不同的工作组,同一工作组的用户也不必局限于某一固定的物理范围,网络构建和维护更方便灵活。
1.2. 报文格式
IEEE802.1Q标准定义了VLAN Header的格式。他在普通以太网帧结构的SA(src addr)之后键入了4bytes的VLAN tag/Header数据,其中12-bits的VLAN ID。VLAN ID最大值为4096,但是有效值范围是1-4094
- 字段解释:
字段 | 长度 | 含义 | 取值 | |
---|---|---|---|---|
TPID | 2Byte | Tag Protocol Identifier(标签协议标识符),表示数据帧类型。 | 表示帧类型,取值为0x8100时表示 | IEEE 802.1Q的VLAN数据帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。 各设备厂商可以自定义该字段的值。当邻居设备将TPID值配置为非0x8100时, 为了能够识别这样的报文,实现互通,必须在本设备上修改TPID值,确保和邻居设备的TPID值配置一致。 |
PRI | 3bit | Priority,表示数据帧的802.1Q优先级。 | 取值范围为0~7,值越大优先级越高。当网络阻塞时,设备优先发送优先级高的数据帧。 | |
CFI | 1bit | Canonical Format Indicator(标准格式指示位),表示MAC地址在不同的传输介质中是否以标准格式进行封装,用于兼容以太网和令牌环网。 | CFI取值为0表示MAC地址以标准格式进行封装,为1表示以非标准格式封装。在以太网中,CFI的值为0。 | |
VID | 12bit | VLAN ID,表示该数据帧所属VLAN的编号。 | VLAN ID取值范围是0~4095。由于0和4095为协议保留取值,所以VLAN ID的有效取值范围是1~4094。 |
设备利用VLAN标签中的VID来识别数据帧所属的VLAN,广播帧只在同一VLAN内转发,这就将广播域限制在一个VLAN内。
- 示例报文
1.3. 常用设备收发数据帧的VLAN标签情况
常用设备收发数据帧的VLAN标签情况,在一个VLAN交换网络中,以太网帧主要有以下两种格式:
- 有标记帧(Tagged帧):加入了4字节VLAN标签的帧。
- 无标记帧(Untagged帧):原始的、未加入4字节VLAN标签的帧。
常用设备中,为了提高处理效率,设备内部处理的数据帧一律都是Tagged帧。
- 用户主机、服务器、Hub只能收发Untagged帧。
- 交换机、路由器和AC既能收发Tagged帧,也能收发Untagged帧。
- 语音终端、AP等设备可以同时收发一个Tagged帧和一个Untagged帧。
1.4. 链路类型和接口类型
设备内部处理的数据帧一律都带有VLAN标签,而现网中的设备有些只会收发Untagged帧,要与这些设备交互,就需要接口能够识别Untagged帧并在收发时给帧添加、剥除VLAN标签。同时,现网中属于同一个VLAN的用户可能会被连接在不同的设备上,且跨越设备的VLAN可能不止一个,如果需要用户间的互通,就需要设备间的接口能够同时识别和发送多个VLAN的数据帧。
为了适应不同的连接和组网,设备定义了Access接口、Trunk接口和Hybrid接口3种接口类型,以及接入链路(Access Link)和干道链路(Trunk Link)两种链路类型。
1.4.1. 链路类型
根据链路中需要承载的VLAN数目的不同,以太网链路分为:
- 接入链路
接入链路只可以承载1个VLAN的数据帧,用于连接设备和用户终端(如用户主机、服务器等)。通常情况下,用户终端并不需要知道自己属于哪个VLAN,也不能识别带有Tag的帧,所以在接入链路上传输的帧都是Untagged帧。
- 干道链路
干道链路可以承载多个不同VLAN的数据帧,用于设备间互连。为了保证其它网络设备能够正确识别数据帧中的VLAN信息,在干道链路上传输的数据帧必须都打上Tag。
1.4.2. 接口类型
根据接口连接对象以及对收发数据帧处理的不同,以太网接口分为:
- Access接口
Access接口一般用于和不能识别Tag的用户终端(如用户主机、服务器等)相连,或者不需要区分不同VLAN成员时使用。它只能收发Untagged帧,且只能为Untagged帧添加唯一VLAN的Tag。
- Trunk接口
Trunk接口一般用于连接交换机、路由器、AP以及可同时收发Tagged帧和Untagged帧的语音终端。它可以允许多个VLAN的帧带Tag通过,但只允许一个VLAN的帧从该类接口上发出时不带Tag(即剥除Tag)。
- Hybrid接口
Hybrid接口既可以用于连接不能识别Tag的用户终端(如用户主机、服务器等)和网络设备(如Hub),也可以用于连接交换机、路由器以及可同时收发Tagged帧和Untagged帧的语音终端、AP。它可以允许多个VLAN的帧带Tag通过,且允许从该类接口发出的帧根据需要配置某些VLAN的帧带Tag(即不剥除Tag)、某些VLAN的帧不带Tag(即剥除Tag)。
Hybrid接口和Trunk接口在很多应用场景下可以通用,但在某些应用场景下,必须使用Hybrid接口。比如一个接口连接不同VLAN网段的场景中,因为一个接口需要给多个Untagged报文添加Tag,所以必须使用Hybrid接口。
1.4.3. 缺省VLAN
缺省VLAN又称PVID(Port Default VLAN ID)。前面提到,设备处理的数据帧都带Tag,当设备收到Untagged帧时,就需要给该帧添加Tag,添加什么Tag,就由接口上的缺省VLAN决定。
接口收发数据帧时,对Tag的添加或剥除过程。
对于Access接口,缺省VLAN就是它允许通过的VLAN,修改缺省VLAN即可更改接口允许通过的VLAN。
对于Trunk接口和Hybrid接口,一个接口可以允许多个VLAN通过,但是只能有一个缺省VLAN。接口的缺省VLAN和允许通过的VLAN需要分别配置,互不影响。
同类型接口添加或剥除VLAN标签的比较:
接口类型 | 对接收不带Tag的报文处理 | 对接收带Tag的报文处理 | 发送帧处理过程 |
---|---|---|---|
Access接口 | 接收该报文,并打上缺省的VLAN ID。 | 当VLAN ID与缺省VLAN ID相同时,接收该报文。当VLAN ID与缺省VLAN ID不同时,丢弃该报文。 | 先剥离帧的PVID Tag,然后再发送。 |
Trunk接口 | 打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文。打上缺省的VLAN ID,当缺省VLAN ID不在允许通过的VLAN ID列表里时,丢弃该报文。 | 当VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文。当VLAN ID不在接口允许通过的VLAN ID列表里时,丢弃该报文。 | 当VLAN ID与缺省VLAN ID相同,且是该接口允许通过的VLAN ID时,去掉Tag,发送该报文。当VLAN ID与缺省VLAN ID不同,且是该接口允许通过的VLAN ID时,保持原有Tag,发送该报文。 |
Hybrid接口 | 打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文。打上缺省的VLAN ID,当缺省VLAN ID不在允许通过的VLAN ID列表里时,丢弃该报文。 | 当VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文。当VLAN ID不在接口允许通过的VLAN ID列表里时,丢弃该报文。 | 当VLAN ID是该接口允许通过的VLAN ID时,发送该报文。可以通过命令设置发送时是否携带Tag。 |
-
当接收到不带VLAN标签的数据帧时,Access接口、Trunk接口、Hybrid接口都会给数据帧打上VLAN标签,但Trunk接口、Hybrid接口会根据数据帧的VID是否为其允许通过的VLAN来判断是否接收,而Access接口则无条件接收。
-
当接收到带VLAN标签的数据帧时,Access接口、Trunk接口、Hybrid接口都会根据数据帧的VID是否为其允许通过的VLAN(Access接口允许通过的VLAN就是缺省VLAN)来判断是否接收。
-
当发送数据帧时:
- Access接口直接剥离数据帧中的VLAN标签。
- Trunk接口只有在数据帧中的VID与接口的PVID相等时才会剥离数据帧中的VLAN标签。
- Hybrid接口会根据接口上的配置判断是否剥离数据帧中的VLAN标签。
因此,Access接口发出的数据帧肯定不带Tag,Trunk接口发出的数据帧只有一个VLAN的数据帧不带Tag,其他都带VLAN标签,Hybrid接口发出的数据帧可根据需要设置某些VLAN的数据帧带Tag,某些VLAN的数据帧不带Tag。
1.5. VLAN不足
- 4k个vlan上限:才12个bits的vlan id,代表最多也只能有4096个隔离的网络,只有4096个网络是远不够用的
- vlan是基于l2的,很难跨越二层的局限(很难跨地域),限制了网络的灵活性,
- vlan的操作需要人工介入太多
上述三条在小公司,云平台规模不大的情况下,反而 会是一种优势,但是在大规模的云平台下这三点则是缺点
1.6. VLAN应用----vlan+openvswitch组网
1.6.1. 网络应用类型及VLAN
- 管理网络:用于openstack节点之间通信,假设VLAN ID 范围为50-100.
- 数据网络:用于虚拟机之间通信,由于valn模式下,租户建立的网络都是具有独立的vlan id,故需要将连接虚拟机的服务器的交互机端口设置为Trunk模式,并且设置所允许的VLAN ID 范围,比如100-300
- 外部网络:用于连接外部网络。加上VLAN ID 范围为1000-3000
1.6.2. OVS+neutron操作
neutron在该计算节点上执行操作如下:
- 创建了OVS Integration bridge br-int。它的四个Access口中,两个打上了内部vlan Tag1,连接接入network1的两个网卡;另外两个端口打上的是vlan tag 2;
- 创建一对patch port连接br-int和br-eth1
- 设置br-int中的flow rules。对从access ports进入的数据帧,加上相应的vlan tag,转发到patch port;从patch port进入的数据帧,将vlan id 101修改为1,102修改为2,再转发到相应的access ports
- 设置br-eth1中的flow rules。从patch port进入的数据帧,将内部vlan id 1修改为101,内部vlan id 2修改为102,再从eth1端口发出。对从eht1进入的数据帧做相反的处理
1.6.3. 基础网络隔离
-
不同的tenant是隔离的
-
同一tenant下不同的子网也是隔离的
-
东西向流量,不同HOST下同VLAN TAG的VM通信如下, 二层互通:
- 东西向流量,三层互通:
- 隔离的网络可以直接通过路由通信,南北向网络释义如下:
2. GRE
GRE(Generic Routing Encapsulation,通用路由协议封装)协议,由 Cisco 和 Net-smiths 等公司于1994年提交给IETF,它对部分网络层协议(IP)的数据报进行封装,使这些被封装的数据报能够在 IPv4/IPv6 网络中传输。数据报在 tunnel 的两端封装,并在这个通路上传输,到另外一端的时候解封装。其协议格式见RFC2784(https://tools.ietf.org/html/rfc2784)。
- 经GRE模块处理后,原IP头部已经被封装在新IP头部和GRE头部之后
- 新IP数据包的IP头部的协议号为47。
- 新IP头部的长度为20字节
- GRE头部的长度为4~20字节(根据实际配置而定)。
2.1. 报文格式
系统收到需要进行封装和路由的某网络层协议(如IPX)数据时,将首先对其加上GRE报文头,使之成为GRE报文,再将其封装在另一协议(如IP)中。这样,此报文的转发就可以完全由IP协议负责。封装后的报文的格式如下图所示:
其中:
- 净荷(Payload):系统收到的需要封装和路由的数据报称为净荷。
- 乘客协议(Passenger Protocol):封装前的报文协议称为乘客协议。
- 封装协议(Encapsulation Protocol):上述的GRE协议称为封装协议,也称为运载协议(Carrier Protocol)。
- 传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。
GRE首部各字段解释如下:
字段 | 长度 | 描述 | |
---|---|---|---|
C | 1 bit | 校验和验证位。如果该位置1,表示GRE头插入了校验和(Checksum)字段;该位为0表示GRE头不包含校验和字段。 | |
K | 1 bit | 关键字位。如果该位置1,表示GRE头插入了关键字(Key)字段;该位为0表示GRE头不包含关键字字段。 | |
Recursion | 3 bits | 用来表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1。如果封装层数大于3,则丢弃该 | 报文。该字段的作用是防止报文被无限次的封装。 |
Flags | 5 bits | 预留字段。当前必须设为0。 | |
Version | 3 bits | 版本字段,必须置为0。Version为1是使用在RFC2637的PPTP中。 | |
Protocol Type | 16 bits | 乘客协议的协议类型。 | |
Checksum | 16 bits | 对GRE头及其负载的校验和字段。 | |
Key | 31 bits | 关键字字段,隧道接收端用于对收到的报文进行验证。 |
因为VRP中的GRE头不包含源路由字段,因此Bit 1、Bit 3和Bit 4都置为0。
- 示例报文
2.2. GRE相对于VLAN的优点
- 突破了二层网络的限制,gre内部可以封装多种类型协议数据报文,常用的IP over IP;
- 数据中心网络在物理级别上支持不了云计算的规模(大量的mac地址表,arp表..)但是使用GRE就可以突破这个问题,基于IP协议,不基于以太网协议
2.3. GRE不足
- 点对点,所有的计算机节点和网络节点都会建立GRE Tunnel,规模扩大,效率极其的低下
- 扩大的广播域,GRE不支持组播,一个网络(GRE Tunnel ID一样)中的一个vm发出广播帧后,GRE会将其广播到所有与该节点有隧道连接的节点。
- GRE封装的IP包的过滤和负载均衡问题
目前还是有很多防火墙和三层网络设备无法解析GRE Header,因此他们无法对GRE封装包做合适的过滤和负载均衡

当A(192.168.1.1) ping B(192.168.2.1)时,报文是如下形式的:
-
从A到RA
-
从RA到RB
2.4. GRE参考标准
标准 | 描述 |
---|---|
RFC 1701 | Generic Routing Encapsulation (GRE) |
RFC 2784 | Generic Routing Encapsulation (GRE) |
3. VXLAN
vxlan主要用于封装,转发2层报文。vxlan全称Virtual eXtensible Local Area Network,简单的说就是扩充了LVAN,其使得多个通过三层连接的网络可以表现的和直接通过一台一台物理交换机连接配置而成的网络一样处在一个LAN种
3.1. VXLAN数据包格式
- 主要的内容重点在vxlan的封装形式,多了50字节的tunnel长度;(14帧头+20ip头+8udp头+8vxlan头),其中vxlan头(00000100+24bit保留+24bit vxlanID+8bit保留)
- 正常来说一个64-1518帧长的数据包,去掉vxlan的tunnel头部+FCS(帧校验序列-CRC)之后,只有10-1464长度可以使用,但是vxlan的封装是为了传输内层的来自vm的数据包,所以实际的传输过程需要调大整个网络环境的MTU,才能正常传输;
3.2. VXLAN实现机制
它的实现机制是,将二层报文中加上个Vxlan Header,封装在一个UDP包中进行传输。VxLAN header会包括一个24位的ID(称为VNI),含义类似于VLAN id 或者GRE的tunnel id。GRE一般是通过路由器进行GRE协议的封装和解封的,在VXLAN中这类封装和解封的组件有个专有的名字叫做VTEP。相比起VLAN来说,好处在于其突破了VLAN自由4000+子网的限制,同时架设在UDP协议上后其扩展行提高了不少(因为UDP是高层协议,屏蔽了底层的差异,换句话说屏蔽了二层的差异)
报文走向:
选自:http://www.cnblogs.com/xingyun/p/4620727.html
3.3. GRE和VXLAN比较
VXLAN是UDP中封装了VXLAN+虚拟的二层物理Payload,即arp广播也可以通过物理的三层取转发。
GRE头的协议类型可以有很多种,IP in IP只是常用的一种。
选自:http://www.cnblogs.com/linhaifeng/p/6619142.html#_label2
3.4. 关于gre和vxlan二次封装数据包的MTU问题
MTU(最大传输单元)是一个节点在一帧(一次通信)中可以传输到相邻网络的最大数据大小。MTU 取决于数据链路层协议:以太网为 1500 字节,FDDi 为 4324 字节,ATM 为 9180 字节。在TCP中,当开始通信时,计算MSS(最大段大小),即MTU减去TCP头和IP头的大小,并确定主机之间可以传输的最大数据大小。当要发送的数据超过这个最大大小时,发送主机将数据适当分成多个IP包,使其适合最大大小,然后发送数据。这种分裂过程称为分片。在接收主机上,拆分的数据包重新组合并传递给上层。
以太网帧有如下结构,以太网中的MTU对应IP包体的大小(分片后)。
因此,MTU的范围是“IP头+TCP头+数据”
- VXLAN及GRE模式下MTU计算
VXLAN 模式下虚拟机中的 mtu 最大值为1450,也就是只能小于1450,大于这个值会导致 openvswitch 传输分片,进而导致虚拟机中数据包数据重传,从而导致网络性能下降。GRE 模式下虚拟机 mtu 最大为1462。不过这个可以调节;
计算方法如下:
Ethernet MinSize = 512bit = 64 Byte
Ethernet MaxSize = 1518 Byte
so Ethernet IP MTU = 1518 - 18 ( 6 SRCMAC+ 6 DSTMAC+ 2 TYPE+ 4 CRC) = 1500 B
so Ethernet IP TCP MSS = 1500 - 40 ( 20 IP_HEADER + 20 TCP_HEADER) = 1460 B
so Ethernet IP UDP MTU/MRU = 1500 - 28 ( 20 IP_HEADER + 8 UDP_HEADER ) = 1472 B
vxlan mtu = 1500 – 20(ip头) – 8(udp头) – 8(vxlan头) – 14(以太网头) = 1450 B
gre mtu = 1500 – 20(ip头) – 4(gre头) = 1476 B
可以配置 Neutron DHCP 组件,让虚拟机自动配置 mtu。
#/etc/neutron/dhcp_agent.ini [DEFAULT] dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf#/etc/neutron/dnsmasq-neutron.conf dhcp-option-force=26,1450或1462
重启 DHCP Agent,让虚拟机重新获取 IP,然后使用 ifconfig 查看是否正确配置 mtu。
4. 参考文章
赞赏微信赞赏
支付宝赞赏