QinQ基础知识

article/2025/10/3 17:45:44

QinQ简介

定义:

QinQ(802.1Q-in-802.1Q)技术是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能,可以使私网VLAN透传公网。由于在骨干网中传递的报文有两层802.1Q Tag(一层公网Tag,一层私网Tag),即802.1Q-in-802.1Q,所以称之为QinQ协议。

##目的:

随着以太网技术在网络中的大量部署,利用802.1Q VLAN对用户进行隔离和标识受到很大限制。因为IEEE802.1Q中定义的VLAN Tag域只有12个比特,仅能表示4096个VLAN,无法满足以太网中标识大量用户的需求,于是QinQ技术应运而生。

QinQ是通过在原有的802.1Q报文的基础上增加一层802.1Q标签来实现的,使得VLAN数量增加到4094×4094,扩展了VLAN空间。

随着以太网的发展以及精细化运作的要求,QinQ的双层标签又有了进一步的使用场景。它的内外层标签可以代表不同的信息,如内层标签代表用户,外层标签代表业务。另外,QinQ报文带着两层Tag穿越公网时,内层Tag透明传送,也是一种简单、实用的VPN技术。因此它又可以作为核心MPLS VPN在以太网VPN的延伸,最终形成端到端的VPN技术。

优点:

  • 扩展VLAN,对用户进行隔离和标识不再受到限制。
  • QinQ内外层标签可以代表不同的信息,如内层标签代表用户,外层标签代表业务,更利于业务的部署。
  • QinQ封装、终结的方式很丰富,帮助运营商实现业务精细化运营。
  1. 解决日益紧缺的公网VLAN ID 资源问题
  2. 用户可以规划自己的私网VLNA ID
  3. 提供一种较为简单的二层VPN解决方案
  4. 使用户网络具有较高的独立性

原理描述

基本原理:

QinQ是指在802.1Q VLAN的基础上增加一层802.1Q VLAN标签,从而拓展VLAN的使用空间。在公网的传输过程中,设备只根据外层VLAN Tag转发报文,并根据报文的外层VLAN Tag进行MAC地址学习,而用户的私网VLAN Tag将被当作报文的数据部分进行传输。

QinQ报文:

QinQ报文有固定的格式,就是在802.1Q的标签之上再打一层802.1Q标签,QinQ报文比802.1Q报文多四个字节。

这里写图片描述

图;QinQ帧格式

字段解释:

字段长度含义
Destination address6字节目的MAC地址。
Source address6字节源MAC地址。
Type2字节长度为2字节,表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。对于内层VLAN tag,该值设置为0x8100;对于外层VLAN tag,有下列几种类型0x8100:思科路由器使用0x88A8:Extreme Networks switches使用0x9100:Juniper路由器使用0x9200:Several路由器使用
PRI3比特Priority,长度为3比特,表示帧的优先级,取值范围为0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据包。
CFI1比特CFI (Canonical Format Indicator),长度为1比特,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。用于区分以太网帧、FDDI(Fiber Distributed Digital Interface)帧和令牌环网帧。在以太网中,CFI的值为0。
VID12比特LAN ID,长度为12比特,表示该帧所属的VLAN。在VRP中,可配置的VLAN ID取值范围为1~4094。
Length/Type2字节指后续数据的字节长度,但不包括CRC检验码。
Data42~1500字节负载(可能包含填充位)。
CRC4字节用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。

报文示例:

这里写图片描述

图:QinQ抓包示例

QinQ封装:

QinQ封装是指如何把单层Q报文转换成双层Q报文。

根据不同的封装数据,QinQ可以分为几种不同类型,包括基本QinQ和灵活QinQ两大类。其中基本QinQ是指基于接口的QinQ,灵活QinQ包括基于VLAN ID的QinQ和基于802.1p优先级的QinQ,具体如下:

  • 基于接口的QinQ封装

    基于接口的封装是指进入一个接口的所有流量全部封装一个相同的外层VLAN Tag,封装方式不够灵活,用户业务区分不够细致,这种封装方式也称作基本QinQ。

  • 基于VLAN ID的QinQ封装(灵活QinQ)

    基于VLAN ID的QinQ封装可以对不同的数据流选择是否封装外层Tag、封装何种外层Tag,因此这种封装方式也称作灵活QinQ。

    例如:当同一用户的不同业务使用不同的VLAN ID时,可以根据VLAN ID区间进行分流。假设PC上网的VLAN ID范围是101~200;IPTV的VLAN ID范围是201~300;VoIP的VLAN ID范围是301~400。根据VLAN ID范围,对PC上网业务封装上外层Tag 100,对IPTV封装上外层Tag 300,对VoIP封装上外层Tag 500。

  • 基于802.1p优先级的QinQ封装(基于流的灵活QinQ)

    基于802.1p优先级的QinQ封装可以对不同优先级的数据流选择是否封装外层Tag、封装何种外层Tag,因此这种封装方式也称作灵活QinQ。

    例如:当同一用户的不同业务使用不同的优先级,如语音、视频、数据等。可以根据优先级为这些业务建立不同的数据传输通道,方便对业务进行区分。

QinQ的实现方式:

QinQ的实现方式可分为以下两种:

  1. 基本QinQ

    • 如果收到的是带有VLAN Tag的报文,该报文就成为带双Tag的报文。
    • 如果收到的是不带VLAN Tag的报文,该报文就成为带有本端口缺省VLAN Tag的报文。
  2. 灵活QinQ

    • 为具有不同内层VLAN ID的报文添加不同的外层VLAN Tag。
    • 根据报文内层VLAN的802.1p优先级标记外层VLAN的802.1p优先级和添加不同的外层VLAN Tag。

    通过使用灵活QinQ技术,在能够隔离运营商网络和用户网络的同时,又能够提供丰富的业务特性和更加灵活的组网能力。

QinQ/Dot1q终结子接口:

终结主要是指设备对报文的单层或者双层Tag进行识别,然后根据后续的转发行为对单层或者双层Tag进行剥离或继续传送。

终结一般在路由子接口上执行,即:终结子接口。

QinQ技术在和MPLS/IP核心网连接时,根据不同的情况,会用到不同的终结方法。

  • 如果路由子接口是对报文的单层Tag终结,那么该子接口称为Dot1q终结子接口。
  • 如果路由子接口是对报文的双层Tag终结,那么该子接口称为QinQ终结子接口。

注意:

Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN的报文,收到不带VLAN的报文会直接丢弃。

基本QinQ:

基本QinQ,是基于接口方式实现的。开启接口的基本QinQ功能后,当该接口接收到报文,设备会为该报文打上配置的外层Tag。如果接收到的是已经带有VLAN Tag的报文,则为其加上外层VLAN Tag;如果接收到的是不带VLAN Tag的报文,则先为其加上内层VLAN Tag,再加上外层Tag。

灵活QinQ:

  • 基于VLAN ID的灵活QinQ:为具有不同内层VLAN ID的报文添加不同的外层VLAN Tag。
  • 基于802.1p优先级的灵活QinQ:根据报文的原有内层VLAN的802.1p优先级添加不同的外层VLAN Tag。

灵活QinQ功能是对基本QinQ功能的扩展,它比基本QinQ的功能更灵活。二者之间的主要区别是:

  • 基本QinQ:对进入二层QinQ接口的所有帧都加上相同的外层Tag。
  • 灵活QinQ:对进入二层QinQ接口的帧,可以根据不同的内层Tag而加上不同的外层Tag,对于用户VLAN的划分更加细致。

TPID(Tag Protocol Identifier):

标签协议标识TPID(Tag Protocol Identifier)是VLAN Tag中的一个字段,表示VLAN Tag的协议类型,IEEE 802.1Q协议规定该字段的取值为0x8100。

IEEE802.1Q协议定义的以太网帧的VLAN Tag。802.1Q Tag位于SA(Source Address)和Length/Type之间。通过检查对应的TPID值,设备可确定收到的帧承载的是运营商VLAN标记还是用户VLAN标记。接收到帧之后,设备将配置的TPID值与帧中TPID字段的值进行比较。如果二者匹配,则该帧承载的是对应的VLAN标记。例如,如果帧承载TPID值为0x8100的VLAN标记,而用户网络VLAN标记的TPID值配置为0x8200,设备将认为该帧没有用户VLAN标记。也就是说,设备认为该帧是Untagged报文。

另外,不同运营商的系统可能将QinQ帧外层VLAN标记的TPID设置为不同值。为实现与这些系统的兼容性,可以修改TPID值,使QinQ帧发送到公网时,承载与特定运营商相同的TPID值,从而实现与该运营商设备之间的互操作性。以太网帧的TPID与不带VLAN标记的帧的协议类型字段位置相同。为避免在网络中转发和处理数据包时出现问题,不可将TPID值设置为下表中的任意值:

协议类型及对应值描述表:

协议类型对应值
ARP0x0806
RARP0x8035
IP0x0800
IPv60x86DD
PPPoE0x8863/0x8864
MPLS0x8847/0x8848
IPX/SPX0x8137
LACP0x8809
802.1x0x888E
HGMP0x88A7
设备保留0xFFFD/0xFFFE/0xFFFF

QinQ配置

配置基本QinQ(二层):

如下图,通过配置基本QinQ,实现客户网络在运营商网络中的传输。

这里写图片描述

图:基本QinQ配置拓扑

配置文件:

LSW1和LSW4配置相同:

<SW1>dis current-configuration 
#
sysname SW1
#
vlan batch 10 20
#
interface GigabitEthernet0/0/1port link-type accessport default vlan 10
#
interface GigabitEthernet0/0/2port link-type accessport default vlan 20
#
interface GigabitEthernet0/0/3port link-type trunkport trunk allow-pass vlan 10 20
#

LSW3和LSW4配置相同:

[SW2]dis current-configuration 
#
sysname SW2
#
vlan batch 100
#
interface GigabitEthernet0/0/1port link-type dot1q-tunnel //使能二层QinQ功能port default vlan 100 //划分接口到VLAN100
#
interface GigabitEthernet0/0/2port link-type trunkport trunk allow-pass vlan 100
#

配置灵活QinQ(二层):

拓扑如上,LSW1和LSW4配置同上。

LSW2和LSW3配置如下:

[SW2]dis current-configuration 
#
sysname SW2
#
vlan batch 100 200
#
interface GigabitEthernet0/0/1
qinq vlan-translation enable
//开启QinQ的VLAN转换功能
port hybrid untagged vlan 100 200
//定义接口出方向剥离VLAN100和VLAN200的标签
port vlan-stacking vlan 10 stack-vlan 100
//接口收到来自VLAN10的数据帧后叠加一层VLAN100的外层标签
port vlan-stacking vlan 20 stack-vlan 200
//接口收到来自VLAN20的数据帧后叠加一层VLAN200的外层标签
#
interface GigabitEthernet0/0/2port link-type trunkport trunk allow-pass vlan 100 200
#

注:

  1. 灵活QinQ只能用在hybrid接口,trunk口无法实现。
  2. qing protocol 9100 \只会修改针对内层VLAN TAG的以太类型的改写,用于不同厂商的设备互通。华为默认为8100,可配置范围为0x0600~0xFFFF。
  3. **基本QinQ可配置多层,而灵活QinQ只能配置两层,**想要配多层,第三层开始得结合配置基本QinQ。

参考文档:华为HedEx文档



http://chatgpt.dhexx.cn/article/9X7M8gOe.shtml

相关文章

10 个有用的 Python 字符串函数你必须知道

&#x1f482; 个人网站:【 海拥】【保卫机器人】【骑士冒险】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼家族】&#x1f4ac; 免费且实用的计算机相关知识题…

Python字符串函数使用详解

Python的友好在于提供了非常好强大的功能函数模块&#xff0c;对于字符串的使用&#xff0c;同样提供许多简单便捷的字符串函数。Python 字符串自带了很多有用的函数&#xff0c;在字符串函数之前先介绍一个非常实用的dir()内置函数&#xff0c;因为对每一个初学者还是大佬级别…

MySQL 十大常用字符串函数

数据库函数是一种具有某种功能的模块&#xff0c;可以接收零个或多个输入值&#xff0c;并且返回一个输出值。MySQL 为我们提供了许多用于处理和分析数据的系统函数&#xff0c;本文给大家介绍 10 个常用的字符串函数&#xff0c;以及相关的其他函数。 1 CONCAT() CONCAT(str1,…

Oracle 中常用的字符串函数总结

一、substr 函数 —— 字符串截取 格式1&#xff1a; substr(string,start_pos,length) 格式2&#xff1a; substr(string,start_pos) 说明&#xff1a; 从指定位置start_pos截取字符串string的length位&#xff0c;如果不指定length&#xff08;格式2&#xff09;则从指…

MySQL --- 常用函数 - 字符串函数

函数 MySQL 函数会对传递进来的参数进行处理&#xff0c;并返回一个处理结果&#xff0c;也就是返回一个值。 MySQL 包含了大量并且丰富的函数&#xff0c;咱们讲解几十个常用的&#xff0c;剩下的比较罕见的函数我们可以到「MySQL 参考手册」查询。 字符串函数 函数作用UP…

常用字符串函数的使用

目录 一.求字符串长度 1.strlen用来计算字符串的长度&#xff08;该长度不包括\0&#xff09; 二.长度不受限制的字符串函数 1.strcpy字符串拷贝 2.strcat附加一个字符串 3.strcmp字符串大小比较 三.长度受限制的字符串函数介绍 1.strncpy字符串拷贝(能设置要拷贝的字符个…

字符串操作常用函数

字符串常用函数有如下 puts() //输出字符串 gets() //获取字符串 strlen() //计算字符串长度 memset() //初始化 strcpy() strncpy() //字符串的拷贝 strcat() //字符串的拼接 strcmp() //字符串的比较 strchr() strstr() //字符串的查找 strtok…

字符串函数

本文重点 重点介绍处理字符串内存的库函数的使用和注意事项 求字符串长度 ——strlen长度不受限制的字符串函数 ——strcpy、strcat、strcmp长度受限制的字符串函数介绍——strncpy、strncat、strncmp字符串查找——strstr、strtok错误信息报告——strerror字符操作 前言 C语…

java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算)

下载地址: jep3.5 jar包与文档.rar 由于3.X并未上传maven所有只能下载jar包使用maven本地导入 <dependency><groupId>com.singularsys</groupId><artifactId>jep</artifactId><version>3.5</version><scope>system</scope…

【译】Jep 文档(1)——介绍(Introction)

原文连接&#xff08;http://www.singularsys.com/jep/doc/html/index.html&#xff09; 介绍 综述 Jep 是一个用于分析和计算数学表达式的java库。有了这个包&#xff0c;您就可以把数学公式当作是字符串&#xff0c;并且立即求出它们的值。许多常见的数学函数和常量都是内…

Java RMI反序列化/JEP290相关

RMI 远程过程调用 (Remote Procedure Call)是一种服务器-客户端模式&#xff0c; Java的RMI&#xff08;Remote Method Invocation&#xff09;是一种RPC实现。 其基本思想是程序员可以像本地那样&#xff0c;与远程对象进行交互。 步骤&#xff1a; 1、创建一个接口IRemote…

Java第三方库——Jep数学公式计算

Java第三方库——Jep数学公式计算 官网简介&#xff1a;JEP JAVA仅用几行代码解析和计算数学表达式。这个包允许用户以字符串的形式输入公式&#xff0c;并立即对其求值。JEP支持用户定义的变量、常量和函数。包括一些常用的数学函数和常量。 1.下载3.x版本依赖并引入 官方网站…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…

Java中JCP, JEP, JLS, JSR是什么

JCP Java Community Process JCP&#xff08;Java Community Process&#xff09;是一个开放的国际组织&#xff0c;主要由Java开发者以及被授权者组成&#xff0c;职能是发展和更新。 JCP维护的规范包括J2ME、J2SE、J2EE&#xff0c;XML&#xff0c;OSS&#xff0c;JAIN等。组…

java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)

2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算) 1.增加jep依赖 <dependency><groupId>org.scijava</groupId><artifactId>jep</artifactId><version>2.4.2</versio…

使用Jep在Java中执行Python代码

接上次用Eclipse编写Python代码&#xff1a;使用Eclipse编写Python代码_Cc_Sonia的博客-CSDN博客_eclipse写python程序 为了把深度学习模型部署到Java App上&#xff0c;需要用Java调用Python。试过Jython&#xff0c;但它只对python2有效。。。最后supervisor建议使用Jep&…

jep的使用

参考jep官网:http://www.singularsys.com/jep/ Jep Java只用几行代码解析和评估数学表达式。此程序包允许您的用户输入公式作为字符串&#xff0c;并立即对其进行评估。Jep支持用户定义的变量&#xff0c;常量和函数。包括许多常见的数学函数和常数。 那么啰嗦,说白了就是支持…

python JEP安装

安装python ( 深坑 &#xff1a;安装之前请yum install python3-devel 避免出现i.e.: export LD_PRELOAD/usr/lib/libpython2.7.so.1.0 问题 ) 下载源码 Python Release Python 3.6.5 | Python.org 解压 进入目录 ./configure --prefix/opt/software/python --enab…

JEP:Java表达式分析器

JEP 是一个用于解析和计算数学表达式的 Java 类库。通过使用这个包你可以把公式看 作字符串并快速计算它们。其中内置了大量公共的数学函数和常量供用户使用。另外&#xff0c;你也 可以通过自定义变量、常量、函数等方式扩展 JEP 。 使用 JEP 计算一个字符串表达式包括…

java 使用JEP 进行节点计算

2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算)​​​​​​​ 1.JEP基础相关 请参考: java 使用JEP解析字符串计算公式 求值(附带自定义函数编写) 2.使用节点计算 注释写的很明白 要仔细看 public st…