理解 VXLAN

VXLAN (Virtual eXtensible LAN) 是一种通过三层网络来传输二层网络数据的一种隧道技术,可以解决很多问题,我们主要用它来解决不同宿主机的 docker 实例通信问题。

不同的 VXLAN 有一个 ID,叫做 VXLAN Network Identifier 或者 VNI,有 24 位( VLAN 只有 12 位),能提供 16 million 个 ID。

使用 VXLAN 可以隔离每个 VNI 之间的网络,但是我们目前只使用一个 VNI,也就是所有 docker 宿主机都有相同的 VNI。

VXLAN 还有个名词叫做 VXLAN Tunnel End Point (VTEP),在我们的环境中 VTEP 在每台宿主机上,它有两个接口,一个是普通的对外的接口,一个是面向 docker 的接口,后者通过虚拟交换机和里面的 docker 相连,docker 的 IP 是私有网段。

 

当一台宿主机的 docker 访问另一台宿主机的 docker 时,原始的二层报文包括:

Inner Ethernet header  + Inner IP header + Payload

然后,VTEP 会对其进行封装,在原始的二层报文前面封装如下:

Outer UDP header + VXLAN header  —>  Outer IP header  —>  Outer Ethernet header

D4B1FE0D-F1A2-4C1F-8BF6-9C916F4DDFF8

解释:

| VXLAN 头封装
– Flags:8 比特,取值为 00001000。
– VNI:VXLAN 网络标识,24 比特,用于区分 VXLAN 段。
– Reserved:24 比特和 8 比特,必须设置为 0。

l 外层 UDP 头封装
目的 UDP 端口号是 4789 。源端口号是内层以太报文头通过哈希算法计算后的值。

l 外层 IP 头封装
源IP地址为发送报文的虚拟机所属VTEP的IP地址;目的 IP 地址是目的虚拟机所属
VTEP的 IP 地址。

l 外层 Ethernet 头封装
– SA:发送报文的虚拟机所属 VTEP 的 MAC 地址。
– DA:目的虚拟机所属 VTEP 上路由表中直连的下一跳 MAC 地址。
– VLAN Type:可选字段,当报文中携带 VLAN Tag 时,该字段取值为 0x8100。
– Ethernet Type:以太报文类型,IP协议报文该字段取值为 0x0800。

 

在 VTEP 进行封装之前,事实上源 docker ( 起名 docker1 )需要知道目的 docker ( 起名 docker2 ) 的 MAC 和 IP,而且源 VTEP ( 起名 VTEP1 ) 需要知道目的 VTEP ( 起名 VTEP2 ) 的 IP。

如何知道呢,过程如下(假设 VNI = 864):

1、docker1 发送 ARP 请求包,请求 192.168.0.101 [docker2 IP] 的 MAC 地址;
2、ARP 请求包被 VTEP1 封装成多播包,发给 VNI = 864 的多播组;
3、所有的 VTEP 接收此多播包,并添加 ( VNI – VTEP1– docker1_MAC Address) 映射关系到自己的 VXLAN 表中;
4、目的主机上的 VTEP2 接收到多播包后将其解开,并向本主机上 VNI = 864 的所有虚拟机发送广播包;
5、docker2 看到了 ARP 包后,回应了自己的 MAC 地址;
6、VTEP2 再次封装回应的单播包,通过路由发给 VTEP1;
7、VTEP1 解包,并将包传给 docker1,则最终获取了 docker2 的 MAC 地址;
8、VTEP1 将 ( VNI – VTEP2 – docker2_MAC Address)映射关系添加到自己的 VXLAN 表中。

下面看 docker1 到 docer2 的过程 ( 偷的图,把docker1 换成了 VM1,docker2 换成了 VM2 ):

5B172701-B5A7-46F8-8FDA-35E26D6FA085

1、 发送 IP 数据包到 VM2,即 192.168.0.100 到 192.168.0.101;
2、 VTEP1 查找自己的 VXLAN 表知道要发给 VTEP2,然后依次封装以下数据包头;
a) VXLAN 包头,VNI = 864;
b) 标准 UDP 包头,校验和 checksum 为 0x0000,目标端口号 4789;
c) 标准 IP 包头,目标地址为VTEP2的IP地址,协议号设为 0x11 表面为 UDP 包。
d) 标准 MAC 数据包,目标地址为下一跳设备的MAC地址 00:10:11:FE:D8:D2,可路由到目标隧道端 VTEP2。
3、 VTEP2 接收数据包,根据 UDP 的 destination 端口找到 VXLAN 数据包。接着查找所有所在 VXLAN 的 VNI 为 864 的端口组,找到 VM2;
4、 VM2 接收并处理数据包,拿到 Payload 数据。

 

 

https://sites.google.com/site/amitsciscozone/home/data-center/vxlan

http://blog.sina.com.cn/s/blog_6de3aa8a0101oisp.html

http://e.huawei.com/cn/marketing-material/cn/products/enterprise_network/ce_switches/hw_376141

 

VLAN 与 端口模式 Access、Hybrid、Trunk

VLAN(Virtual Local Area Network)的中文名叫”虚拟局域网”,是一种将局域网设备从逻辑上划分成一个个网段的技术。

 

1 交换机端口工作模式

交换机端口有三种工作模式,分别是 Access,Hybrid,Trunk。

Access 类型的端口只能属于 1 个 VLAN,一般用于连接计算机的端口;

Trunk 类型的端口可以允许多个VLAN通过,可以接收和发送多个 VLAN 的报文,一般用于交换机之间连接的端口;

Hybrid 类型的端口可以允许多个 VLAN 通过,可以接收和发送多个 VLAN 的报文,可以用于交换机之间连接,也可以用于连接用户的计算机。

Hybrid 端口和 Trunk 端口在接收数据时,处理方法是一样的,唯一不同之处在于发送数据时:Hybrid 端口可以允许多个 VLAN 的报文发送时不打标签,而 Trunk 端口只允许缺省 VLAN 的报文发送时不打标签。

 

2 基本概念(tag、untag、802.1Q)

untag 就是普通的 ethernet 报文,普通 PC 机的网卡是可以识别这样的报文进行通讯;
tag 报文结构的变化是在「源 mac」地址和「目的mac」地址之后,加上了 4bytes 的 vlan 信息,也就是 vlan tag头;一般来说这样的报文普通 PC 机的网卡是不能识别的

下图说明了802.1Q封装tag报文帧结构:

20141014102020507

带 802.1Q 的帧是在标准以太网帧上插入了 4 个字节的标识。其中包含:

1). 2 个字节的协议标识符(TPID),当前置 0x8100 的固定值,表明该帧带有 802.1Q 的标记信息;

2). 2个字节的标记控制信息(TCI)。

标记控制信息(TCI)又包含了三个域:

1). Priority域,占3bits,表示报文的优先级,取值0到7,7为最高优先级,0为最低优先级。该域被 802.1p 采用;

2). 规范格式指示符(CFI)域,占 1bit,0 表示规范格式,应用于以太网;1表示非规范格式,应用于 Token Ring;

3). VLAN ID域,占12bit,用于标示 VLAN 的归属。

 

3 交换机接口出入数据处理过程

Acess 端口收报文:

收到一个报文,判断是否有 VLAN 信息:如果没有则打上端口的 PVID,并进行交换转发,如果有则直接丢弃(缺省)。

trunk 端口收报文:

收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该trunk端口是否允许该 VLAN的数据进入:如果允许则报文携带原有VLAN标记进行转发,否则丢弃该报文。

hybrid 端口收报文:

收到一个报文,判断是否有VLAN信息:如果没有则打上端口的 PVID,并进行交换转发,如果有则判断该 hybrid 端口是否允许该 VLAN 的数据进入:如果可以则转发,否则丢弃。

 
4. 端口发送报文时的处理

Acess 端口发报文:

将报文的 VLAN 信息剥离,直接发送出去。

trunk 端口发报文:

比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,否则报文将携带原有的VLAN标记进行转发。

hybrid 端口发报文:

1). 判断该 VLAN 在本端口的属性;

2). 如果是 untag 则剥离 VLAN信息,再发送,如果是 tag 则比较端口的 PVID 和将要发送报文的 VLAN 信息,如果两者相等则剥离 VLAN 信息,再发送,否则报文将携带原有的  VLAN 标记进行转发。

 

参考:

http://blog.csdn.net/jesseyoung/article/details/40047749