Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网络工程师必须要精通的Vlan 技术 802.1Q技术,今天带你入坟!

网络工程师必须要精通的Vlan 技术 802.1Q技术,今天带你入坟!

原创
作者头像
网络技术联盟站
修改于 2021-02-23 02:04:19
修改于 2021-02-23 02:04:19
1.6K0
举报

不管在学习过程还是在实际的项目工作中,大家对 vlan 技术都不陌生而且都可以灵活运用,虽然会用但对于数据帧在何时打上 vlan tag,如何在 trunk 链路上传输、何时剥离 vlan tag 以及在华为交换机的交换机制又是怎样的呢?大家可能有这方面的困惑,今天有我和大家一块儿探讨一下数据帧交换的详细过程:

特别简单的环境:如上图所示有两台华为的 S3700 交换机分别是 SW1 和 SW2,各创建一个vlan 10,然后起一个 vlanif 10,它们在同一个网段互联地址为 10.1.12.1 和 10.1.12.2,现在问题来了,要想让这两个地址相互通信,SW1 和 SW2 的 E0/0/1 口的链路类型因为配置成哪种模式呢?

我这有三个选项:

  1. 两端的链路类型都为 access、
  2. 两端的链路类型都为 trunk,并允许 vlan 10 通过、
  3. 一端为 access 一端为 trunk

具体哪个可以实现通信以及是如何实现通信的呢,我们通过实验验证来分析一下:

一、两端的链路类型都为 access

通过测试两端的链路类型都为 access 时可以相互通信,分析通信过程:SW1 向 SW2 发ping 包,假如 SW1 已知 SW2 的 MAC 地址,在这里我们不去过多讨论 ARP,SW1 和 SW2在同一个网段可以完成三层封装,创建了 vlan 并起了 vlanif 10,二层封装时就由Ethernet2 帧添加了 vlan tag 10 变成了 802.1q 的帧格式,交换机查找 MAC 地址表需要从 SW1 的 E0/0/1 口发出,E0/0/1 的链路类型为 access 在发送数据帧时需要剥离 tag,这时在链路上传输时二层帧是 Ethernet2 型(如图 2),到达 SW2 的 E0/0/1 口,此端口的链路的类型也为 access,access 在接收到没有打 tag 的数据帧时打上接口的 PVID 10,再交由 vlanif 10 的三层接口剥离 vlan tag 10 数据包到达了 SW2,通信是一个双向的过程一去一回,反之毅然,从而实现了双方通信。

“ 注:华为交换机 access 口的 vlan id 就是端口的 PVID ; ”

图 2:

二、两端的链路类型都为 trunk

通过测试两端的链路类型都为 trunk 时可以相互通信,分析通信过程:SW1 向 SW2 发ping 包,假如 SW1 已知 SW2 的 MAC 地址,在这里我们不去过多讨论 ARP,SW1 和 SW2在同一个网段可以完成三层封装,创建了 vlan 并起了 vlanif 10,二层封装时就由Ethernet2 帧添加了 vlan tag 10 变成了 802.1q 的帧格式,交换机查找 MAC 地址表需要从 SW1 的 E0/0/1 口发出,E0/0/1 的链路类型为 trunk 在发送数据帧时查看该帧的 VLANID 10 在 Trunk 的允许发送列表中,在我们没有修改 trunk 端口 pvid 时默认为 1,则直接发送,这时在链路上传输时二层帧是打上 vlan tag 的 802.1q 帧格式(如图 3),到达 SW2的 E0/0/1 口,此端口的链路的类型也为 trunk,trunk 口在接收到打 tag 的数据帧时不做改变,再交由 vlanif 10 的三层接口剥离 vlan tag 10 数据包到达了 SW2,通信是一个双向的过程一去一回,反之毅然,从而实现了双方通信。

图 3:

三、一端为 access 一端为 trunk

通过测试一端为 access 一端为 trunk 不能相互通信,分析原因:SW1 向 SW2 发 ping 包,由于 SW1 不知道 SW2 的 MAC 地址,需要发送 ARP 请求,创建了 vlan 并起了 vlanif 10,ARP 的封装在 Ethernet2 帧添加了 vlan tag 10 变成了 802.1q 的帧格式,从 SW1 的 E0/0/1口发出,E0/0/1 的链路类型为 trunk 在发送数据帧时查看该帧的 VLAN ID 10 在 Trunk 的允许发送列表中,在我们没有修改 trunk 端口 pvid 时默认为 1,则直接发送,这时在链路上传输时二层帧是打上 vlan tag 的 802.1q 帧格式(如图 4),到达 SW2 的 E0/0/1 口,此端口的链路的类型access,access口在收到一个打vlan tag的数据帧时会丢弃此数据帧,所以双方无法通信。

图 4:

3.1、一端为 access 一端为 trunk 在某些情况下是可以通信,这种情况是什么情况呢?

当 trunk 口的 PVID 为 10 时,SW1 在从 trunk 口发送数据帧时查看该帧的 VLAN ID 10 在Trunk 的允许发送列表中,而端口的 pvid 和 vlan tag 一致时,则剥离 vlan tag 发送,这时在链路上传输时二层帧是 Ethernet2 型(如图 5),到达 SW2 的 E0/0/1 口,此端口的链路的类型也为 access,access 在接收到没有打 tag 的数据帧时打上接口的 PVID 10,再交由 vlanif 10 的三层接口剥离 vlan tag 10 数据包到达了 SW2,通信是一个双向的过程一去一回,反之毅然,从而实现了双方通信。

图 5:

上述实验里提到了 PVID,大家对 PVID 了解多少呢,通过以下实验来巩固一下吧!

情况一、

AR1 可以和 AR2 通信吗?

答案是不通,分析原因:

AR1 上首次和 AR2 通信没有对端的 MAC 地址无法完成二层封装,首先由 AR1 发起 ARP请求,到达 SW1 的 E0/0/2 口,E0/0/2 口为 access 在收到一个没有打 vlan tag 的数据帧是打上端口的 pvid 10,在交换机内泛洪,从 E0/0/1 口发出,E0/0/1 口的链路类型为 trunk在发送数据帧时查看该帧的 VLAN ID 10 在 Trunk 的允许发送列表中, trunk 端口 pvid 为20,则直接发送,到达 SW2 的 E0/0/1 口,此端口的链路的类型也为 trunk,trunk 口在接收到打 tag 的数据帧时不做改变,交换机内部需要交由 vlan10 的端口去处理,SW2上 E0/0/2 不属于 vlan10 不做处理,最终是 ARP 请求失败无法通信(如图 6)

图 6:

情况二、

答案是不通,但可以实现 AR1 到 AR2 的单向通信.

分析原因:AR1 上首次和 AR2 通信没有对端的 MAC 地址无法完成二层封装,首先由 AR1 发起 ARP请求,到达 SW1 的 E0/0/2 口,E0/0/2 口为 access 在收到一个没有打 vlan tag 的数据帧是打上端口的 pvid 10,在交换机内泛洪,从 E0/0/1 口发出,E0/0/1 口的链路类型为 trunk在发送数据帧时查看该帧的 VLAN ID 10 在 Trunk 的允许发送列表中, trunk 端口 pvid 为20,则直接发送,到达 SW2 的 E0/0/1 口,此端口的链路的类型也为 trunk,trunk 口在接收到打 tag 的数据帧时不做改变,交换机内部需要交由 vlan10 的端口去处理,E0/0/2端口类型为 access,在发送数据帧是剥离 vlan tag 到达 AR2,实现了单向通信,但是 AR2在 ARP 请求时以单播形式到达 SW2 的 E0/0/2 口打上 pvid 10 ,从 E0/0/1 口发出时查看该帧的VLAN ID 10在Trunk的允许发送列表中, trunk端口pvid和vlan tag相同,剥离vlantag 发送,到达 SW1 的 E0/0/1 口为 trunk,该帧不包含 Tag,将打上端口的 PVID 20,交换机内部需要交由 vlan20 的端口去处理,SW1 上 E0/0/2 不属于 vlan20 不做处理,最终是 ARP reply 失败,无法通信。(如图 7)

“ 注:华为交换机 access 口的 vlan id 就是端口的 PVID ; ”

图 7: R1 的接口 MAC 地址为:

AR2 收到了 AR1 的 ARP 请求

情况三、

答案是可以互通,分析原因:

假设 AR1 已知 AR2 的 MAC 地址,AR1 发送 ping 包,到达 SW1 的 E0/0/2 为 access,在收到一个没有打 vlan tag 的数据帧打上端口的 pvid 10,交换机内部交由 E0/0/1 口发送,E0/0/1 为 trunk 链路,该帧的 VLAN ID 10 在 Trunk 的允许发送列表中, trunk 端口 pvid 和vlan tag 相同,剥离 vlan tag 发送,在 trunk 链路上传输时此数据帧为 Ethernet2 型(如图 8),到达 SW2 的 E0/0/1 口时,E0/0/1 口为 trunk 链路,该帧不包含 Tag,将打上端口的 PVID 20,交换机内部需要交由 vlan20 的端口去处理,SW2 上 E0/0/2 为 access,在发送数据帧时剥离 tag 发送,数据成功到达 AR2,通信是一个双向的过程一去一回,反之毅然,从而实现了双方通信。

“ 注:华为交换机 access 口的 vlan id 就是端口的 PVID ”

图 8:

总结:

  • Access 端口在收到数据后会添加 VLAN Tag,VLAN ID 和端口的 PVID 相同。
  • Access 端口在转发数据前会移除 VLAN Tag。
  • 当 Trunk 端口收到帧时,如果该帧不包含 Tag,将打上端口的 PVID;如果该帧包含 Tag,则不改变。
  • 当 Trunk 端口发送帧时,该帧的 VLAN ID 在 Trunk 的允许发送列表中:若与端口的 PVID 相同时,则剥离 Tag 发送;若与端口的 PVID 不同时,则直接发送。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot服务端表单数据校验
1、首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。
别先生
2020/05/18
8250
SpringBoot服务端表单数据校验
SpringBoot整合Servlet、Filter、Listener、访问静态资源、文件上传
首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。
别先生
2020/05/08
1.7K0
SpringBoot整合SpringMVC、持久层技术MyBatis
1、通过使用SpringBoot、SpringMVC、MyBatis整合,实现一个对数据库中的数据表的增加、修改、删除、查询操作。
别先生
2020/05/18
9630
SpringBoot整合SpringMVC、持久层技术MyBatis
springBoot系列教程07:异常捕获
发生异常是很正常的事,异常种类也是千奇百怪,发生异常并不可怕,只要正确的处理,并正确的返回错误信息并无大碍,如果不进行捕获或者处理,分分钟服务器宕机是很正常的事
肖哥哥
2018/08/02
9020
springBoot系列教程07:异常捕获
聊聊springcloud的serviceRegistryEndpoint
本文主要研究一下springcloud的serviceRegistryEndpoint
code4it
2018/09/17
1.4K0
Swagger-ui在文件上传时报错net::ERR_CONNECTION_RESET
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2K0
springcloud踩坑
直到我看见了 服务提供方的报错 一下子我就明白了 我数据库服务没开!!!!!!!!!!! 这里只是想分享以下踩坑经验 希望大家不要像我一样粗心
暴躁的程序猿
2022/03/24
3660
org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method service()
前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题。 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法,又多此一举的单独整理了这篇文章,是因为在解决此问题时首先搜索了一下关于此问题的文章,但是网上并没有搜到关于此问题的答案,因此自己做了整理。 问题描述 在springboot与thymeleaf整合过程中,出现了如下报错: org.thymeleaf.exceptions.TemplateProcessingExcepti
程序员十三
2018/03/15
2.7K0
java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho
搞了我两天真是服了 出现这个问题是没有loadbalanc,但是nacos中ribbon会造成loadbalanc包失效 在common的pom文件中加入
全栈程序员站长
2022/09/05
1.4K0
springcloud与hystrix整合时freemarker依赖问题分析
乍一看,是 freemarker 解析的问题,但是所有的依赖都是正常情况下处理的,没有头绪。
山行AI
2020/02/11
1.2K0
java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
因为“0000-00-00 00:00:00”在mysql中是作为一个特殊值存在的但 java.sql.Date 将其视为 不合法的值 格式不正确,这才是报错的原因
用户5899361
2020/12/07
9370
jxls工具导出excel,报错:Cannot load XLS transformer. Please make sure a Transformer implementation is in cl
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163882.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/15
1.2K0
feign.FeignException$MethodNotAllowed: status 405 reading xxx#yyy(Integer)
使用feign 调用异常 feign.FeignException$MethodNotAllowed: status 405 reading ConsumerService#findById(Integer)
时间静止不是简史
2020/07/27
2.3K0
feign.FeignException$MethodNotAllowed: status 405 reading xxx#yyy(Integer)
springboot 使用 freemarker 无法正常跳转的问题?
参考:https://blog.csdn.net/Lin_xiaofeng/article/details/79122053
别先生
2019/07/30
1.5K0
springboot 使用 freemarker 无法正常跳转的问题?
初学Spring Cloud踩坑之org.springframework.web.client.HttpClientErrorException: 400 null
初学Spring Cloud踩坑之org.springframework.web.client.HttpClientErrorException: 400 null
Java架构师必看
2021/05/14
1.7K0
zuul报错java.net.UnknownHostException: 4d59d509898a: Name or service not known
是这样的,eureka、zuul和普通的微服务在本地是OK的,部署到docker后,通过zuul访问某个微服务就报错了。用的是serviceId的方式,在eureka界面也能看到各个微服务都是在线的,没有问题,但就是通过zuul的路由访问时会报错。
天涯泪小武
2019/01/17
2.5K0
BadSqlGrammarException:PageHelper use near 'LIMIT 50'
作为一名Java开发人员,你可能在某个深夜,面对着那令人头秃的错误日志,不禁发问:“为什么我的SQL语句总是出错?”今天,就让我们一起深入探讨这个在Java开发项目中常见的问题——org.springframework.jdbc.BadSqlGrammarException,特别是在处理Excel导入时,如何避免这个让人头疼的错误。
疯狂的KK
2025/01/16
1610
BadSqlGrammarException:PageHelper use near 'LIMIT 50'
org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call
前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题。 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法,又多此一举的单独整理了这篇文章,是因为在解决此问题时首先搜索了一下关于此问题的文章,但是网上并没有搜到关于此问题的答案,因此自己做了整理。 问题描述 在springboot与thymeleaf整合过程中,出现了如下报错: ``` org.thymeleaf.exceptions.TemplateProcessingExcepti
程序员十三
2018/03/15
2K0
SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after
SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30001ms.
二十三年蝉
2018/10/11
7.4K0
SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after
聊聊springboot tomcat的maxHttpFormPostSize
本文主要研究一下spring boot tomcat的maxHttpFormPostSize参数
code4it
2023/08/17
7140
推荐阅读
相关推荐
SpringBoot服务端表单数据校验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档