mirror of
https://github.com/DefectingCat/DefectingCat.github.io
synced 2025-07-15 16:51:37 +00:00
38 lines
25 KiB
HTML
38 lines
25 KiB
HTML
<!DOCTYPE html><html lang="zh-CN" data-default-color-scheme=""auto""><head><meta charset="UTF-8"><link rel="apple-touch-icon" sizes="76x76" href="/images/img/apple-touch-icon.webp"><link rel="icon" type="image/png" href="/images/img/favicon.webp"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,shrink-to-fit=no"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="theme-color" content="#9DC8C8"><meta name="description" content=""><meta name="author" content="Defectink"><meta name="keywords" content=""><title>QinQ基础操作 - 🍭Defectink</title><link rel="stylesheet" href="https://cdn.defectink.com/static/twitter-bootstrap/4.5.3/css/bootstrap.min.css"><link rel="stylesheet" href="https://cdn.defectink.com/static/github-markdown-css/4.0.0/github-markdown.min.css"><link rel="stylesheet" href="/lib/hint/hint.min.css"><link rel="stylesheet" href="https://cdn.defectink.com/static/highlight.js/10.0.0/styles/github-gist.min.css"><link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css"><link rel="stylesheet" href="https://cdn.defectink.com/static/t/font_1736178_kmeydafke9r.css"><link rel="stylesheet" href="/css/main.css"><link rel="stylesheet" href="/css/xfy.css"><script src="/js/utils.js"></script><script src="/js/color-schema.js"></script><meta name="generator" content="Hexo 5.2.0"><link rel="alternate" href="/xml/atom.xml" title="🍭Defectink" type="application/atom+xml"><link rel="alternate" href="/xml/rss.xml" title="🍭Defectink" type="application/rss+xml"></head><body><header style="height:75vh"><nav id="navbar" class="navbar fixed-top navbar-expand-lg navbar-dark scrolling-navbar"><div class="container"><a class="navbar-brand" href="/"> <strong>🍭Defectink</strong> </a> <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><div class="animated-icon"><span></span><span></span><span></span></div></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><ul class="navbar-nav ml-auto text-center"><li class="nav-item"><a class="nav-link" href="/">🏠 首页</a></li><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">📕 索引</a><div class="dropdown-menu" aria-labelledby="navbarDropdown"><a class="dropdown-item" href="/categories/">🎁 分类</a> <a class="dropdown-item" href="/tags/">🎐 标签</a></div></li><li class="nav-item"><a class="nav-link" href="/archives/">📂 归档</a></li><li class="nav-item"><a class="nav-link" href="/about/">🎃 关于</a></li><li class="nav-item"><a class="nav-link" href="/links/">🙆♀️ 小伙伴</a></li><li class="nav-item"><a class="nav-link" href="/pgp/">🔐 PGP</a></li><li class="nav-item" id="search-btn"><a class="nav-link" data-toggle="modal" data-target="#modalSearch"> <i class="iconfont icon-search"></i> </a></li><li class="nav-item" id="color-toggle-btn"><a class="nav-link" href="javascript:"> <i class="iconfont icon-dark" id="color-toggle-icon"></i> </a></li></ul></div></div></nav><div class="banner intro-2" id="background" parallax="true" style="background:url(/images/img/post.webp) no-repeat center center;background-size:cover"><div class="full-bg-img"><div class="mask flex-center" style="background-color:rgba(0,0,0,.3)"><div class="container page-header text-center fade-in-up"><span class="h2" id="subtitle"></span><div class="mt-3"><span class="post-meta mr-2"><i class="iconfont icon-author" aria-hidden="true"></i> Defectink</span><span class="post-meta"><i class="iconfont icon-date-fill" aria-hidden="true"></i> <time datetime="2019-05-29 16:21" pubdate>2019年5月29日 下午</time></span></div><div class="mt-1"><span class="post-meta mr-2"><i class="iconfont icon-chart"></i> 2.2k 字</span><span class="post-meta mr-2"><i class="iconfont icon-clock-fill"></i> 26 分钟</span></div></div></div></div></div></header><main><div class="container-fluid"><div class="row"><div class="d-none d-lg-block col-lg-2"></div><div class="col-lg-8 nopadding-md"><div class="container nopadding-md" id="board-ctn"><div class="py-5" id="board"><article class="post-content mx-auto" id="post"><h1 style="display:none">QinQ基础操作</h1><p class="note note-info">本文最后水于:2020年11月2日 凌晨</p><div class="markdown-body" id="post-body"><blockquote><p>QwQ♥</p></blockquote><h2 id="QinQ简介"><a href="#QinQ简介" class="headerlink" title="QinQ简介"></a>QinQ简介</h2><p>QinQ技术(或称为IEEE 802.1ad、Vlan stacking)。是802.1q协议(Virtual Bridged Local Area Networks)为基础衍生出的一种通讯协议。</p><p>它是一项拓展vlan空间的技术,通过在原有的以太网帧中再堆叠一个802.1q的报头来达到拓展vlan空间的功能。使其vlan数量最多可以达4094(inner)*4094(outer)。即802.1Q-in-802.1Q,所以称之为QinQ协议。</p><h3 id="目的"><a href="#目的" class="headerlink" title="目的"></a>目的</h3><p>随着当前的以太网技术的发展,利用传统802.1q vlan来对用户进行隔离和标识收到很大限制。因为IEEE802.1Q中定义的VLAN Tag域只有12个比特,仅能表示4096个VLAN,无法满足以太网中标识大量用户的需求,于是QinQ技术应运而生。</p><p>而运用了QinQ协议之后,可以在原有的vlan标签中再堆叠一层vlan标签,使其vlan的数量达到翻倍,极大的拓展了vlan的空间。</p><h3 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h3><ul><li>扩展VLAN,对用户进行隔离和标识不再受到限制。</li><li>QinQ内外层标签可以代表不同的信息,如内层标签代表用户,外层标签代表业务,更利于业务的部署。</li><li>QinQ封装、终结的方式很丰富,帮助运营商实现业务精细化运营。</li></ul><ol><li>解决日益紧缺的公网VLAN ID 资源问题</li><li>用户可以规划自己的私网VLNA ID</li><li>提供一种较为简单的二层VPN解决方案</li><li>使用户网络具有较高的独立性</li></ol><h3 id="实现方式"><a href="#实现方式" class="headerlink" title="实现方式"></a>实现方式</h3><p>QinQ拥有两种实现方式:</p><ol><li><p>基本QinQ</p><ol><li>如果收到的是带有VLAN Tag的报文,该报文就成为带双Tag的报文。</li><li>如果收到的是不带VLAN Tag的报文,该报文就成为带有本端口缺省VLAN Tag的报文。</li></ol></li><li><p>灵活QinQ</p><ol><li>为具有不同内层VLAN ID的报文添加不同的外层VLAN Tag。</li><li>根据报文内层VLAN的802.1p优先级标记外层VLAN的802.1p优先级和添加不同的外层VLAN Tag。通过使用灵活QinQ技术,在能够隔离运营商网络和用户网络的同时,又能够提供丰富的业务特性和更加灵活的组网能力。</li></ol></li></ol><ul><li><p>基本QinQ</p><p>基本QinQ是基于接口的封装,是指进入一个接口的所有流量都将全部封装为一个相同的外层Vlan tag。封装方式不够灵活,用户业务区分不够细致。这种封装方式称之为基本QinQ。</p></li><li><p>灵活QinQ</p><ul><li>基于Vlan ID的QinQ封装:这种封装方式可以针对不同的vlan tag来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式称之为灵活QinQ。</li><li>基于802.1q优先级的QinQ封装:这种封装方式可以针对用户不同优先级的数据流来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式亦称之为灵活QinQ。</li></ul></li></ul><h2 id="终结子接口"><a href="#终结子接口" class="headerlink" title="终结子接口"></a>终结子接口</h2><p>“终结”意思为设备对传过来的报文tag进行识别,然后根据后续的转发行为来对单层或双层的tag进行玻璃或继续传输。</p><p>“终结”一般作用于子接口上,故称之为:终结子接口</p><p>QinQ技术在和MPLS/IP核心网连接时,根据不同的情况,会用到不同的终结方法:</p><ul><li>如果路由子接口是对报文的单层Tag终结,那么该子接口称为Dot1q终结子接口;</li><li>如果路由子接口是对报文的双层Tag终结,那么该子接口称为QinQ终结子接口。</li></ul><p>Tips:Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN的报文,收到不带VLAN的报文会直接丢弃。</p><h2 id="帧格式"><a href="#帧格式" class="headerlink" title="帧格式"></a>帧格式</h2><p>QinQ报文有着固定的格式,就是在802.1Q的标签上再堆叠一层802.1Q标签。QinQ报文比普通的vlan标签多4个字节。vlan帧最小帧长为68字节。</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/ethernet-QinQ-format2.webp" srcset="/images/img/loading.gif" alt="ethernet-QinQ-format2"></p><table><thead><tr><th>字段</th><th>长度</th><th>含义</th></tr></thead><tbody><tr><td>Destination address</td><td>6字节</td><td>目的MAC地址。</td></tr><tr><td>Source address</td><td>6字节</td><td>源MAC地址。</td></tr><tr><td>Type</td><td>2字节</td><td>长度为2字节,表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。对于内层VLAN tag,该值设置为0x8100;对于外层VLAN tag,有下列几种类型0x8100:思科路由器使用0x88A8:Extreme Networks switches使用0x9100:Juniper路由器使用0x9200:Several路由器使用</td></tr><tr><td>PRI</td><td>3比特</td><td>Priority,长度为3比特,表示帧的优先级,取值范围为0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据包。</td></tr><tr><td>CFI</td><td>1比特</td><td>CFI (Canonical Format Indicator),长度为1比特,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。用于区分以太网帧、FDDI(Fiber Distributed Digital Interface)帧和令牌环网帧。在以太网中,CFI的值为0。</td></tr><tr><td>VID</td><td>12比特</td><td>LAN ID,长度为12比特,表示该帧所属的VLAN。在VRP中,可配置的VLAN ID取值范围为1~4094。</td></tr><tr><td>Length/Type</td><td>2字节</td><td>指后续数据的字节长度,但不包括CRC检验码。</td></tr><tr><td>Data</td><td>42~1500字节</td><td>负载(可能包含填充位)。</td></tr><tr><td>CRC</td><td>4字节</td><td>用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。</td></tr></tbody></table><h3 id="报文示例"><a href="#报文示例" class="headerlink" title="报文示例"></a>报文示例</h3><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%8A%A5%E6%96%87-1582421531943.webp" srcset="/images/img/loading.gif" alt="报文"></p><h3 id="TPID(Tag-Protocol-Identifier)"><a href="#TPID(Tag-Protocol-Identifier)" class="headerlink" title="TPID(Tag Protocol Identifier)"></a>TPID(Tag Protocol Identifier)</h3><p>TPID:标签协议标识ID(Tag Protocol Identifier)是Vlan tag中的一个字段,标识该vlan tag的协议类型。IEEE 802.1Q协议规定QinQ的外层vlan标签的type值为:(0x8100)。</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E5%A4%96%E5%B1%82type.webp" srcset="/images/img/loading.gif" alt="外层type"></p><blockquote><p>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报文。<br>另外,不同运营商的系统可能将QinQ帧外层VLAN标记的TPID设置为不同值。为实现与这些系统的兼容性,可以修改TPID值,使QinQ帧发送到公网时,承载与特定运营商相同的TPID值,从而实现与该运营商设备之间的互操作性。以太网帧的TPID与不带VLAN标记的帧的协议类型字段位置相同。为避免在网络中转发和处理数据包时出现问题,不可将TPID值设置为下表中的任意值:</p></blockquote><table><thead><tr><th align="center">协议类型</th><th align="center">对应值</th></tr></thead><tbody><tr><td align="center">ARP</td><td align="center">0x0806</td></tr><tr><td align="center">RARP</td><td align="center">0x8035</td></tr><tr><td align="center">IP</td><td align="center">0x0800</td></tr><tr><td align="center">IPV6</td><td align="center">0x86DD</td></tr><tr><td align="center">PPPoE</td><td align="center">0x8863/0x8864</td></tr><tr><td align="center">MPLS</td><td align="center">0x8847/0x8848</td></tr><tr><td align="center">IPX/SPX</td><td align="center">0x8137</td></tr><tr><td align="center">LACP</td><td align="center">0x8809</td></tr><tr><td align="center">802.1x</td><td align="center">0x888E</td></tr><tr><td align="center">HGMP</td><td align="center">0x88A7</td></tr><tr><td align="center">设备保留</td><td align="center">0xFFFD/0xFFFE/0xFFFF</td></tr></tbody></table><h2 id="基本QinQ配置"><a href="#基本QinQ配置" class="headerlink" title="基本QinQ配置"></a>基本QinQ配置</h2><p>拓扑:</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E5%9F%BA%E6%9C%ACqinq.webp" srcset="/images/img/loading.gif" alt="基本qinq"></p><p>如图示,SW2和SW3用于模拟运营商之间的Internet,SW1和SW4为客户内网。基本QinQ的配置就作用于SW2和SW3之间,将客户内网内的vlan10与vlan20封装上一层vlan100,用于再SW2和SW3之间传输。</p><ul><li>SW1和SW4配置相同:</li></ul><pre><code class="hljs routeros">sysname SW1
|
||
<span class="hljs-comment">#</span>
|
||
vlan batch 10 20
|
||
<span class="hljs-comment">#</span>
|
||
interface GigabitEthernet0/0/1
|
||
<span class="hljs-built_in"> port </span>link-type trunk
|
||
<span class="hljs-built_in"> port </span>trunk allow-pass<span class="hljs-built_in"> vlan </span>10 20
|
||
<span class="hljs-comment">#</span>
|
||
interface GigabitEthernet0/0/2
|
||
<span class="hljs-built_in"> port </span>link-type access
|
||
<span class="hljs-built_in"> port default vlan </span>10
|
||
<span class="hljs-comment">#</span>
|
||
interface GigabitEthernet0/0/3
|
||
<span class="hljs-built_in"> port </span>link-type access
|
||
<span class="hljs-built_in"> port default vlan </span>20</code></pre><p>SW1和SW4只需做基本配置,用作普通二层交换。</p><ul><li>SW2和SW3配置相同:</li></ul><pre><code class="hljs apache"><span class="hljs-attribute">sysname</span> SW<span class="hljs-number">2</span>
|
||
<span class="hljs-comment">#</span>
|
||
<span class="hljs-attribute">vlan</span> batch <span class="hljs-number">100</span>
|
||
<span class="hljs-comment">#</span>
|
||
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">1</span>
|
||
<span class="hljs-attribute">port</span> link-type dot<span class="hljs-number">1</span>q-tunnel //开启基本二层QinQ功能
|
||
<span class="hljs-attribute">port</span> default vlan <span class="hljs-number">100</span> //并划分为vlan<span class="hljs-number">100</span>
|
||
<span class="hljs-comment">#</span>
|
||
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">2</span>
|
||
<span class="hljs-attribute">port</span> link-type trunk //普通trunk
|
||
<span class="hljs-attribute">port</span> trunk <span class="hljs-literal">allow</span>-pass vlan <span class="hljs-number">100</span></code></pre><p>SW1的<code>G 0/0/1</code>为trunk接口,对应连接的SW2的<code>G 0/0/1</code>为基本二层QinQ接口,划分vlan为vlan 100。</p><p>使用PC1发送ICMP包到PC3,数据包内容为:</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%8A%A5%E6%96%872.webp" srcset="/images/img/loading.gif" alt="报文2"></p><p>其中,可以看到内层的802.1q的vlan标签ID为10,type为(0x0800);外层的,也就是SW2封装的vlan标签ID为100,type为(0x8100)。</p><h2 id="灵活QinQ配置"><a href="#灵活QinQ配置" class="headerlink" title="灵活QinQ配置"></a>灵活QinQ配置</h2><p>拓扑和上述一样:</p><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%81%B5%E6%B4%BB%E6%8B%93%E6%89%91.webp" srcset="/images/img/loading.gif" alt="灵活拓扑"></p><p>我们在模拟internet的SW2和SW3之间添加了一个vlan 200,用于配置灵活的QinQ的vlan 20堆叠一个vlan 200的tag。</p><p>SW1和SW4的配置与普通的QinQ的配置相同,无需改变。</p><ul><li>SW2与SW3配置相同:</li></ul><pre><code class="hljs apache"><span class="hljs-attribute">sysname</span> SW<span class="hljs-number">2</span>
|
||
<span class="hljs-comment">#</span>
|
||
<span class="hljs-attribute">vlan</span> batch <span class="hljs-number">100</span> <span class="hljs-number">200</span>
|
||
<span class="hljs-comment">#</span>
|
||
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">1</span>
|
||
<span class="hljs-attribute">port</span> link-type hybrid //必须是hybrid接口模式
|
||
<span class="hljs-attribute">qinq</span> vlan-translation enable //开启vlan转换
|
||
<span class="hljs-attribute">port</span> hybrid untagged vlan <span class="hljs-number">100</span> <span class="hljs-number">200</span> //出方向时剥离vlan<span class="hljs-number">100</span>和<span class="hljs-number">200</span>的标签
|
||
<span class="hljs-attribute">port</span> vlan-stacking vlan <span class="hljs-number">10</span> stack-vlan <span class="hljs-number">100</span> //vlan<span class="hljs-number">10</span>堆叠vlan<span class="hljs-number">100</span>tag
|
||
<span class="hljs-attribute">port</span> vlan-stacking vlan <span class="hljs-number">20</span> stack-vlan <span class="hljs-number">200</span> ////vlan<span class="hljs-number">20</span>堆叠vlan<span class="hljs-number">200</span>tag
|
||
<span class="hljs-comment">#</span>
|
||
<span class="hljs-attribute">interface</span> GigabitEthernet<span class="hljs-number">0</span>/<span class="hljs-number">0</span>/<span class="hljs-number">2</span>
|
||
<span class="hljs-attribute">port</span> link-type trunk
|
||
<span class="hljs-attribute">port</span> trunk <span class="hljs-literal">allow</span>-pass vlan <span class="hljs-number">100</span> <span class="hljs-number">200</span></code></pre><p>从vlan10和vlan20的PC分别向各自的vlan发包,可以看到数据包内容:</p><ul><li>vlan10</li></ul><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%8A%A5%E6%96%873.webp" srcset="/images/img/loading.gif" alt="报文3"></p><ul><li>vlan20</li></ul><p><img src="../images/QinQ%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/vlan20.webp" srcset="/images/img/loading.gif" alt="vlan20"><br>当两台PC机正常通信的时候,可以看到不同vlan封装的外层vlan tag也是不一样的。这就是基于vlan的灵活QinQ。</p><h2 id="上述拓扑"><a href="#上述拓扑" class="headerlink" title="上述拓扑"></a>上述拓扑</h2><ul><li><a target="_blank" rel="noopener" href="http://cloud.defect.ink/s/s9l4h9rx">灵活QinQ</a></li><li><a target="_blank" rel="noopener" href="http://cloud.defect.ink/s/5ttw9ett">接口QinQ</a></li></ul><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li><a target="_blank" rel="noopener" href="http://www.023wg.com/message/message/cd_feature_eth_qinq.html">QinQ帧格式</a></li><li><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_38265137/article/details/80404320">QinQ基础知识</a></li></ul></div><hr><div><div class="post-metas mb-3"><div class="post-meta mr-3"><i class="iconfont icon-category"></i> <a class="hover-with-bg" href="/categories/%E7%BD%91%E7%BB%9C/">网络</a></div><div class="post-meta"><i class="iconfont icon-tags"></i> <a class="hover-with-bg" href="/tags/Network/">Network</a></div></div><p class="note note-warning"><a target="_blank" href="https://zh.wikipedia.org/wiki/Wikipedia:CC_BY-SA_3.0%E5%8D%8F%E8%AE%AE%E6%96%87%E6%9C%AC" rel="nofollow noopener noopener">CC BY-SA 3.0❤</a></p><div class="post-prevnext row"><article class="post-prev col-6"><a href="/defect/auto-backup.html"><i class="iconfont icon-arrowleft"></i> <span class="hidden-mobile">自动备份大法</span> <span class="visible-mobile">上一篇</span></a></article><article class="post-next col-6"><a href="/defect/fixed-inotify-watch-not-enough.html"><span class="hidden-mobile">解决inotify watch不够⌚</span> <span class="visible-mobile">下一篇</span><i class="iconfont icon-arrowright"></i></a></article></div></div><article class="comments" id="comments"><div id="vcomments"></div><script type="text/javascript">function loadValine(){addScript("https://cdn.defectink.com/static/valine/1.4.14/Valine.min.js",function(){new Valine({el:"#vcomments",app_id:"dD9t7mcIBVzJWag5ez6GPy2v-MdYXbMMI",app_key:"bWG6pmKsEscrH4JjrpNNAAy6",placeholder:"嘤嘤嘤???",path:window.location.pathname,avatar:"retro",meta:["nick","mail","link"],pageSize:"10",lang:"zh-CN",highlight:!0,recordIP:!1,serverURLs:""})})}waitElementVisible("vcomments",loadValine)</script><noscript>Please enable JavaScript to view the <a target="_blank" href="https://valine.js.org" rel="nofollow noopener noopener">comments powered by Valine.</a></noscript></article></article></div></div></div><div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn"><div id="toc"><p class="toc-header"><i class="iconfont icon-list"></i> 目录</p><div id="tocbot"></div></div></div></div></div></main><a id="scroll-top-button" href="#" role="button"><i class="iconfont icon-arrowup" aria-hidden="true"></i></a><div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true"><div class="modal-dialog modal-dialog-scrollable modal-lg" role="document"><div class="modal-content"><div class="modal-header text-center"><h4 class="modal-title w-100 font-weight-bold">搜索</h4><button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button></div><div class="modal-body mx-3"><div class="md-form mb-5"><input type="text" id="local-search-input" class="form-control validate"> <label data-error="x" data-success="v" for="local-search-input">关键词</label></div><div class="list-group" id="local-search-result"></div></div></div></div></div><footer class="text-center mt-5 py-3"><div class="footer-content"><a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a><i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a></div><div class="beian"><a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow noopener">皖ICP备17017808号</a></div></footer><script src="https://cdn.defectink.com/static/jquery/3.4.1/jquery.min.js"></script><script src="https://cdn.defectink.com/static/twitter-bootstrap/4.5.3/js/bootstrap.min.js"></script><script src="/js/debouncer.js"></script><script src="/js/main.js"></script><script src="/js/lazyload.js"></script><script defer="defer" src="https://cdn.defectink.com/static/clipboard.js/2.0.6/clipboard.min.js"></script><script src="/js/clipboard-use.js"></script><script src="/js/xfy.js"></script><script src="https://cdn.defectink.com/static/tocbot/4.11.1/tocbot.min.js"></script><script>$(document).ready(function(){var t=$("#board-ctn").offset().top;tocbot.init({tocSelector:"#tocbot",contentSelector:"#post-body",headingSelector:"h1,h2,h3,h4,h5,h6",linkClass:"tocbot-link",activeLinkClass:"tocbot-active-link",listClass:"tocbot-list",isCollapsedClass:"tocbot-is-collapsed",collapsibleClass:"tocbot-is-collapsible",collapseDepth:3,scrollSmooth:!0,headingsOffset:-t}),0<$(".toc-list-item").length&&$("#toc").css("visibility","visible")})</script><script src="https://cdn.defectink.com/static/typed.js/2.0.11/typed.min.js"></script><script>var typed=new Typed("#subtitle",{strings:[" ","QinQ基础操作 "],cursorChar:"❤",typeSpeed:70,loop:!1});typed.stop(),$(document).ready(function(){$(".typed-cursor").addClass("h2"),typed.start()})</script><script src="/js/local-search.js"></script><script>var path="/xml/local-search.xml",inputArea=document.querySelector("#local-search-input");inputArea.onclick=function(){searchFunc(path,"local-search-input","local-search-result"),this.onclick=null}</script><script src="https://cdn.defectink.com/static/fancybox/3.5.7/jquery.fancybox.min.js"></script><link rel="stylesheet" href="https://cdn.defectink.com/static/fancybox/3.5.7/jquery.fancybox.min.css"><script>$("#post img:not(.no-zoom img, img[no-zoom]), img[zoom]").each(function(){var t=document.createElement("a");$(t).attr("data-fancybox","images"),$(t).attr("href",$(this).attr("src")),$(this).wrap(t)})</script><script src="https://cdn.defectink.com/static/mermaid/8.5.0/mermaid.min.js"></script><script>window.mermaid&&mermaid.initialize({theme:"default"})</script></body></html> |