话说VLAN Tag 的“来龙去脉”

前言

自从上篇文章《三层交换机的工作原理》发布后,有很多的网络爱好者私底下与我取得了联系,针对当前的TCP/IP网络做了很多的探讨,从这些爱好者身上我也学习到了很多,正所谓活到老,学到老;看这些爱好者对网络的技术的那种热爱与激情,也给我们写作者增加了不少的动力。

无论我们现在的技术发展到什么地步,最基本最核心的思想仍然不会发生变化;当前我们还在使用传统的路由器、交换机构建数据中心,但当前的网络技术也在不断的革新,另一种网络时代的格局即将到来,例如现在SDN(软件定义网络)、SDS(软件定义存储)、SDW(软件定义广域网)、SDS(软件定义软件)等,从本质上看SDN是将网络转发过程中的控制层面与数据层面分离,两个层面独自开发运作,也可以说这是将控制层面从分布式部署变成集中式部署,但无论怎样改变其底层还是使用TCP/IP协议,这就叫千变万变,万变不离其宗。但是我们也不得不承认TCP/IP协议也存在很多的缺点,其功能的复杂性和安全问题层出不穷,无论你是什么网站只要挂载到Internet上,你都从不敢说它很安全。本文主要来阐述TCP/IP中Vlan的基本原理—Vlan Tag的“来龙去脉” 。

一、Vlan tag

无论在传统物理交换机、路由器,还是在Openstack Neutron网络、SDN网络中其工作原理仍然不会发生变化,网络上对此解释层出不穷,追本溯源还需研究其代码的实现方式;首先来回顾一下带有Vlan tag的Ethernet Frame封装格式:

其4字节的Tag字段有12bit是Vlan ID位,总共支持的VLAN数为2^12。

二、数据转发,Vlan标签如何动作

针对于这样的数据帧在我们传统的交换机,或者Vswitch里面是怎样被转发的呢?我们用两个例子来解释,如下图:

1和A通信,标签如何“动作”(本例中省略Native vlan的解释)

1).1主机发送普通的数据帧;

2).switch1收到此帧首先需要对其解封装,查看二层帧头部帧目的MAC地址;

3).从CAM表中查找其目的MAC地址对应的VLAN ID与接收该帧的接口对应的VLAN ID 是否相同,如果相同则找到对应的出接口,如果不同则丢弃该帧;

4).找到出接口后,打上对应的VLAN 标签,封装成802.1Q的帧,从Trunk接口发送出去;

5).到达switch2后,解封装查看帧头部的目的MAC地址;

6).从CAM表中查找其目的MAC地址对应的VLAN ID与接收该帧头部的VLAN ID是否匹配,如果匹配,则查找对应的出接口,如果不同则丢弃该帧;

7).找到出接口后,封装成原始的帧,从相应端口转发出去。

注意:vlan tag动作打不打标签不是基于接口的概念,而是基于其查表,cpu计算,背板的功能,我看过太多的文章,也听过很多人在描述交换机转发数据包是说的一句话“Access 口用来去标签,Trunk口用来打标签,”或是“Access口和Trunk口具有打标签和剥离标签的功能”,这样的描述都是错的。如果这样做的话,交换机太傻了,这样的代码实现也是非常低级的。

例如,我们再看一种情况:

主机1和主机2通信,问在交换机内部有打标签和剥离标签的动作吗?1和2 在相同的vlan中,他们之间通信经过交换机如果需要打标签的话,那岂不是加重交换机的计算负载吗,所以像这样的两个主机在相互通信的时候,仅仅是查看CAM表,而不需要执行打标签和剥离标签的动作。

三、Openstack Neutron网络中vlan 的工作原理

1.情景1——vm03 与 vm 04 通信

由于vm03 和 vm 04 分别在两台不同的物理服务器上,所以他们之间通信必须要经过外界物理交换机的帮助;

a. vm03 从eth0发送常规ethernet frame经过qbrccc到qvoccc;

b. br-int 上的qvoccc接收到该帧之后,开始解封装其数据包,查看ethernet头部的dest mac字段;

c. 因为其发送的数据是从qvoccc接收到的,而qvoccc 接口已经被划分到vlan 20中,如下配置:

d. 所以在查看vcam表的时候,需要查看mac/vlan id是否一致,如果一致则将数据封装成802.1Q的frame从int-br-eth1发送到br-eth1上,如果不一致则丢弃;

e. 当br-eth1 从 phy-br-eth1 接收到ethernet frame 时,首先就去查看local-vlan 到 global-vlan的一个映射表,配置如下:

发现 local_vlan=20 需要将其转换成vlan 120 ;

f. br-eth1 将会查看其vcam表,查找frame destmac address对应的vlan id是否为120 如果是,则将其封装成802.1Q vlan 120的frame 从对应的接口(eth1)转发出去;

g. 物理交换机中转发过程此处不再熬述;

h. 此frame到达vm04所在的物理机br-eth1上时,将解封装查看帧的dest mac 字段;

i. 然后查找vcam表地址对应的vlan tag与此帧的tag是否一致,如果一致则封装之后从相应的接口(phy-br-eth1)转发出去,如果不一致则丢弃(此处与传统交换机并无差异);

j. 当vm04所在物理机的br-int的int-br-eth1接收到该帧的时候,首先解封装查看帧的dest mac 字段;

k. 继而查看vcam表,寻找该mac地址对应的vlan id 与该帧的vlan tag 是否匹配,如果匹配执行如下操作,如果不匹配丢弃;

l. 当匹配时,br-int上将会查看local_global vlan id 映射关系,配置如下:

vlan tag=120 需要转换成 tag 20;注意:转换是查表的一个过程中,而不是具体的一个操作,更不是在进入接口的时候;

m. 当查询完成映射表之后将会再一次查找vcam表,寻找转化后的vlan id与该表中 mac地址对应的vlan id是否匹配,如果匹配则封装成常规的frame,从相应端口转发出去,如果不匹配则丢弃。

情景2—vm01和vm02之间通信

和我们传统的交换机是一样的,在这个过程中,br-int是不做任何的打标签,弹标签的动作,就是普通的frame之间转发数据,此处不再熬述。

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2018-01-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏携程技术中心

携程Android App插件化和动态加载实践

携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍Androi...

22870
来自专栏猫哥学前班

网络慢?看看路由器设置对不对

防蹭网 开启 UPnP QoS 与网络限速 设置正确的 MTU 值 使用路由器交换机模式 使用无线中继扩展 Wi-Fi 信号 1、防蹭网 这是最最首要的一条...

1.1K160
来自专栏Golang语言社区

go实现西瓜视频花椒直播等平台智能答题

本文源码 https://github.com/Chain-Zhang/answer_ai 介绍 最近出了很多答题平分奖金的直播,只要能够连续答对12道题,就能...

458110
来自专栏iKcamp

iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影。 前面的文章中,...

42490
来自专栏FreeBuf

伽利略远程监控系统完全安装指南

7月初,外媒用臭名昭著形容意大利的网络军火商公司hacking team及其被黑事件,黑吃黑的黑客将该公司rcs系统的安装程序、源代码和邮件打包供所有人下载,更...

417100
来自专栏高性能服务器开发

C++日志系统如何设计

笔者在写作本章节的时候,并不敢把此章节的标题叫做《高性能日志系统的设计》,之所以不敢加上“高性能”三个字的原因是,第一,我的对于日志系统设计知识和经验都来自于学...

75930
来自专栏IT派

Python库大全,建议收藏留用!

学Python,想必大家都是从爬虫开始的吧。毕竟网上类似的资源很丰富,开源项目也非常多。

29520
来自专栏李想的专栏

腾讯云负载均衡CLB的那些“独门利器”

今天就聊一聊腾讯云的负载均衡提供给客户的那些独有的特性,大家也可以了解下腾讯云负载均衡器的优势所在。

1.6K120
来自专栏Python中文社区

QQ空间爬虫最新分享,一天 400 万条数据

前言 本文为作者对其开源项目QQSpider的说明文档。主要替换了程序里一些不可用的链接,对登录时的验证码作了处理,对去重队列作了优化。并且可以非常简单地实现爬...

54270
来自专栏進无尽的文章

基础篇-iOS后台运行以及相关

对于APP的前后台运行情况的了解,有助于我们在实际开发中规避一些问题,以及采取稳妥的方法处理和解决问题,是很必须的。

69310

扫码关注云+社区

领取腾讯云代金券