热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MPLS:多协议标签交换

MPLS:多协议标签交换多协议:可以基于多种不同的3层协议来生成2.5层的标签信息;包交换—包为网络层的PDU,故包交换
MPLS:多协议标签交换

多协议:可以基于多种不同的3层协议来生成2.5层的标签信息;

包交换—包为网络层的PDU,故包交换是基于IP地址进行数据转发;就是路由器的路由行为;

**原始的包交换:**数据包进入路由器后,路由器需要查询本地的路由表(RIB-路由信息数据库),再基于下一跳或者目标ip查询本地的ARP表,才能进行数据的转发;

**快速的包交换:**一次路由多次交换;每个数据流中的第一个包将被基于原始包交换规则转发;过程中生成缓存列表,记录整个通讯过程,该数据流量剩余数据包仅查询缓存记录即可;

**特快的包交换:**无需路由,直接交换; CEF-cisco特快交换,为cisco私有技术;非cisco厂商设备均存在和cef转发机制相同的技术;

路由表、ARP –转换为 FIB(转发信息数据库)表 流量转发过程中仅查询FIB表即可;

FIB的特点:在将路由器表转换过程中,存储递归查询结果;同时将新封装的二层地址进行绑定;

IP fast0/0 172.16.20.115(7)

​ (递归后的出接口) 0 packets, 0 bytes

​ epoch 0

​ sourced in sev-epoch 357

​ Encap length 14

​ 701CE7662A9768EFBD1D24C50800 新的二层封装

​ 目标MAC 源MAC 类型号

**标签交换:**数据包在进入到的MPLS的域内后,将在第2层和3层中间压入标签号;使得域内的路由器在转发该数据包时,基于2.5层的标签号仅需要查询本地的一张LFIB表(标签转发信息数据库)

最初在包交换仅支持原始交换时,标签的意义在于更快的查询;但随着包交换的加速,使用标签交换失去了快速查表的优势;

当下MPLS存在的意义:

1、解决BGP的路由黑洞 2、MPLS VPN 3、MPLS TE 流量工程

另外:随着包交换的加速,使得今天的MPLS技术也开始基于FIB表工作;来提高MPLS的工作效率;

一、 工作过程

控制层面:路由协议工作,生成RIB,流量的方向即为控制流量;

数据层面:设备基于路由表访问目标,产生数据流量;与控制层面方向相反;

控制层面:

1)在没有MPLS时控制层面仅生成RIB(路由表)和FIB(转发信息数据库);FIB是基于RIB生成;

2)MPLS协议会启动TDP(cisco私有)或LDP(公有),直连设备间将建立邻居关系;

LDP-- 基于UDP和TCP的646端口工作;先使用udp发送组播hello包发现邻居,获取邻居ip地址,再和该直连邻居建立TCP的会话;邻居关系建立后;为了邻居关系间的稳定,一般使用设备的环回地址来建立tcp会话;建议设置环回地址为mpls协议的route-id,该id值将携带在组播收发的hello报文中,之后自动进行tcp会话建立;

总结:MPLS协议需要在直连邻居间使用router-id地址来进行TCP的会话;故前提条件为,route-id必须为设备真实使用的ip地址,建议为环回地址—稳定; 组播hello包在直连的物理接口上收发,来获取对端的router-id,自然也要求router-id值间路由可达;

因此正常在建立LDP的邻居关系间,路由协议已经收敛完成,RIB和FIB表已经生成;

3)MPLS在建立邻居关系后,生成邻居表;LDP协议再基于本地FIB表中学习到的路由条目生成标签号;cisco设备默认基于FIB表中所有学习到的路由条目生成标签号,华为设备默认仅基于FIB表中32位掩码的主机路由生成标签号;原因在于正常32位主机路由为ospf学习的环回接口,正常工程中只有BGP和MPLS VPN才会基于环回通讯,使用标签转发;其他普通流量还是基于特快包交换来进行;反观cisco在启动mpls以后,所有流量将基于标签转发,降低了转发效率(前提为默认)

4)标签号生成后,将存储于本地的LIB表-标签信息数据库;LIB表将在邻居间共享;

LIB表中装载本地及邻居为每条路由分发的标签号;

5)运行MPLS协议的设备,将LIB和FIB进行结合,将标签号和最佳路径的关系映射生成LFIB表(标签转发信息数据库)

注:控制层面生成的表格

RIB—》FIB—》LIB—》LFIB 前两张表为路由协议工作后生成,后两张表为MPLS的LDP协议生成;

数据层面:

1) 没有MPLS协议,基于FIB表正常转发即可

2) 名词:MPLS domain – MPLS的工作半径

​ edge LSR(PE)–边界标签交换路由器 工作mpls域的边缘,连接域外设备

LSR (P) – 标签交换路由器 整体工作MPLS域内

3) 当流量进入到第一台pe设备时, 在没有特快交换之前,路由器基于目标IP地址查询本地的RIB;

之后还要在LIB表中对应才能确定流量是否应该压入标签,需要两张表的查询;

在存在特快交换时,流量进入第一pe时,直接查询FIB表,表中关联标签号,将直接确定是否压入标签;

流量再到P路由器,接收到流量中若存在标签基于LFIB表转发,若没有标签基于FIB表即可;

流量从最后一台边界离开MPLS 域时将弹出标签;

存在标签号的流量,进入路由器时,入标签表应该为本地路由器分配的编号,出标签为本地的下游(下一跳)设备分配的标签号; 上下游的概念基于数据层面进行标定;

二、 标签号

标签被压入在2层与3层之间,称为2.5层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hm53SLdh-1644507418046)(file:///C:\Users\asus\AppData\Local\Temp\ksohtml\wpsD38B.tmp.jpg)]

标签的格式—32位,4个字节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlLYOweO-1644507418047)(file:///C:\Users\asus\AppData\Local\Temp\ksohtml\wpsD38C.tmp.jpg)]

前20位为标签号,2^20个标签号;其中1-15号保留,作为特殊编号;

第21-23位exp,3位8个数,为优先级,用于QOS策略使用;

第24位为栈底位,该位为1标识该标签为最后一层标签;MPLS最大可以在一个数据包中封装3层标签;

普通的MPLS 一层标签 MPLS VPN 两层 MPLS TE 3层

TTL 生存时间 在第一次压入标签时,将当前数据包中的3层TTL复制到标签中;之后查询一次标签TTL减一,在最后一跳设备弹出标签时将2.5层的TTL复制到3层报头中;

三、 MPLS的次末跳 – 倒数第二跳 默认执行

边界LSR将本地的直连网段传递给MPLS域内邻居后,LDP分配标签号为3,告知倒数第二跳设备它的身份;导致倒数第二跳设备在查询LFIB表后,已知转发路径的前提下提前弹出标签,使得最后一跳路由器均只需要查询FIB表; 否则最后一跳路由器在查询LFIB表后,弹出标签还需要查询FIB;

四、 MPLS的配置

1、 IP可达— 使用路由协议全网可达

2、 配置MPLS – LDP

[r2]mpls lsr-id 2.2.2.2 必须先定义mpls的router-id,要为本地设备的真实ip地址,且邻居可达,因为 该地址将用于建立TCP会话,建议使用环回地址
[r2]mpls 再开启mpls协议[r2-mpls]mpls ldp 再激活LDP协议[r2-mpls-ldp]q之后需要在所有标签经过的接口上开启协议[r2]interface GigabitEthernet 0/0/1[r2-GigabitEthernet0/0/1]mpls 先开启MPLS[r2-GigabitEthernet0/0/1]mpls ldp 再激活LDP协议

当启动配置完成后,邻居间使用UDP报文组播收发hello包;之后基于hello包中的router-id地址进行TCP会话的建立;

[r3]display tcp statusTCPCB Tid/Soid Local Add:port Foreign Add:port VPNID Stateb4cf3d64 167/6 3.3.3.3:646 4.4.4.4:50858 0 Establishedb4cf3adc 167/3 3.3.3.3:50806 2.2.2.2:646 0 Established

当tcp会话建立后,邻居间基于TCP会话再建立邻居关系,生成邻居表:

[r3]display mpls ldp peer

再然后基于本地的FIB表,默认华为仅针对32位的主机路由生成标签号;存储于LIB表中,之后邻居间共享LIB表;

[r3]display fib 查看FIB表[r4]display mpls ldp lsp 查看LIB表,装载本地和邻居为各条路由分配的标签号

最后路由器将LIB和FIB集合,生成最佳路径的标签转发规则—LFIB

[r4]display mpls lsp 查看LFIB表

注:默认华为仅针对32位主机路由分配标签

[r3]mpls [r3-mpls]lsp-trigger all 开启功能,将针对fib表中所有路由进行标签号的分配[r2]tracert -v -a 2.2.2.2 56.1.1.2

五、 使用mpls解决BGP的路由黑洞

MPLS协议并不会为通过BGP协议学习的路由条目分配标签号;

而是在访问这些BGP路由目标网段时,在流量中压入到达这些网段的BGP下一跳设备地址的标签号;

例:R2从BGP邻居5.5.5.5 学习到6.6.6.0 网段的路由;R2在访问6.6.6.0 时,将在数据包中压入到达5.5.5.5ip地址的标签号,来穿越中间没有运行BGP协议的设备;实现打破路由黑洞;

注:华为设备默认不为BGP协议执行下一跳标签机制,cisco默认执行;

华为设备需要开启 route recursive-lookup tunnel 路由基于隧道进行递归查找

六、 MPLS VPN

1、 CE将私有路由传递到PE端

2、 PE端在收到不同CE发送过来的相同网段路由时,使用RD值进行区分—格式X:X 32位

3、 PE端将附上RD的私有路由不能直接装载于本地公有路由表中,需要放置到对应的VRF(虚拟路由转发)空间内;之后再路由付RT值,用于传递到对端PE设备,对端区分信息;

VPNV4路由=普通IPV4路由+RD+RT

4、 VPNV4路由需要MP-BGP来进行传递;对端基于RT值,将路由装载到对应的VRF空间内,再共享给对应的CE;

5、 控制层面工作完成后,数据层面需要基于MPLS来工作,由于数据层面不能携带RD/RT值;

故mpls将在数据包中压入两层标签,外层标签用于穿越中间设备,打破BGP路由黑洞;

内层标签用于对应VRF空间;

------------------------------------------开始实验---------------------------------------


实验要求:

在这里插入图片描述

实验拓扑:

在这里插入图片描述

第一步:

先配置公网部分:

配置IP
[r2-LoopBack0]ip add 2.2.2.2 32
[r2-LoopBack0]int g0/0/2
[r2-GigabitEthernet0/0/2]ip add 23.1.1.1 24[r3-LoopBack0]ip address 3.3.3.3 255.255.255.255
[r3-LoopBack0]int g0/0/0
[r3-GigabitEthernet0/0/0]ip add 23.1.1.2 24
[r3-GigabitEthernet0/0/1]ip add 34.1.1.1 24[r4]int g0/0/0
[r4-GigabitEthernet0/0/0]ip add 34.1.1.2 24
[r4-GigabitEthernet0/0/0]int l0
[r4-LoopBack0]ip add 4.4.4.4 32
[r4]int g0/0/2
[r4-GigabitEthernet0/0/2]ip add 47.1.1.1 24
[r4-ospf-1]silent-interface g0/0/2 #设置与R7的接口为沉默接口[r7]int g0/0/0
[r7-GigabitEthernet0/0/0]ip add 47.1.1.2 24
[r7-LoopBack0]ip add 192.168.4.1 24
[r7-GigabitEthernet0/0/1]ip add 192.168.3.1 24运行IGP
[r2]ospf 1 router-id 2.2.2.2
[r2-ospf-1]area 0
[r2-ospf-1-area-0.0.0.0]net 2.2.2.2 0.0.0.0
[r2-ospf-1-area-0.0.0.0]net 23.1.1.1 0.0.0.0[r3]ospf 1 router-id 3.3.3.3
[r3-ospf-1]area 0
[r3-ospf-1-area-0.0.0.0]net 3.3.3.3 0.0.0.0
[r3-ospf-1-area-0.0.0.0]net 23.1.1.2 0.0.0.0[r4]ospf 1 router-id 4.4.4.4
[r4-ospf-1]area 0
[r4-ospf-1-area-0.0.0.0]net 34.1.1.2 0.0.0.0
[r4-ospf-1-area-0.0.0.0]net 4.4.4.4 0.0.0.0
[r4-ospf-1-area-0.0.0.0]net 47.1.1.1 0.0.0.0

测试:在R2上 ping R7
在这里插入图片描述
第二步:

配置vpn空间

[r1]int l0
[r1-LoopBack0]ip add 192.168.1.1 24
[r1-LoopBack0]int g0/0/1
[r1-GigabitEthernet0/0/1]int g0/0/0
[r1-GigabitEthernet0/0/0]ip add 192.168.2.1 24[r2]ip vpn-instance b1
[r2-vpn-instance-b1]route-distinguisher 1:1
[r2-vpn-instance-b1-af-ipv4]vpn-target 1:1
[r2]int g0/0/0
[r2-GigabitEthernet0/0/0]ip binding vpn-instance b1 #绑定接口
[r2-GigabitEthernet0/0/0]ip add 192.168.2.2 24

测试:
在这里插入图片描述
同理,配置R4和R5

[r4]ip vpn-instance b2
[r4-vpn-instance-b2]route-distinguisher 1:1
[r4-vpn-instance-b2-af-ipv4]vpn-target 1:1
[r4-vpn-instance-b2]int g0/0/1
[r4-GigabitEthernet0/0/1]ip binding vpn-instance b2
[r4-GigabitEthernet0/0/1]ip add 192.168.3.2 24[r5]int l0
[r5-LoopBack0]ip add 192.168.4.1 24
[r5-LoopBack0]int g0/0/0
[r5-GigabitEthernet0/0/0]ip add 192.168.3.1 24

测试:
在这里插入图片描述

第三步:配置MPLS和BGP

[r2]mpls lsr-id 2.2.2.2
[r2]mpls
[r2-mpls]mpls ldp
[r2-mpls-ldp]int g0/0/2
[r2-GigabitEthernet0/0/2]mpls
[r2-GigabitEthernet0/0/2]mpls ldp[r3]mpls lsr-id 3.3.3.3
[r3]mpls
[r3-mpls]mpls ldp
[r3-mpls-ldp]int g0/0/0
[r3-GigabitEthernet0/0/0]mpls
[r3-GigabitEthernet0/0/0]mpls ldp
[r3-GigabitEthernet0/0/0]int g0/0/1
[r3-GigabitEthernet0/0/1]mpls
[r3-GigabitEthernet0/0/1]mpls ldp[r4]mpls lsr-id 4.4.4.4
[r4]mpls
[r4-mpls]mpls ldp
[r4-mpls-ldp]int g0/0/0
[r4-GigabitEthernet0/0/0]mpls
[r4-GigabitEthernet0/0/0]mpls ldpR2和R4进行BGP建邻
[r2]bgp 1
[r2-bgp]router-id 2.2.2.2
[r2-bgp]peer 4.4.4.4 as-number 1
[r2-bgp]PEER 4.4.4.4 connect-interface LoopBack 0
[r2-bgp]ipv4-family vpnv4
[r2-bgp-af-vpnv4]peer 4.4.4.4 enable [r4]bgp 1
[r4-bgp]router-id 4.4.4.4
[r4-bgp]peer 2.2.2.2 as-number 1
[r4-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[r4-bgp]ipv4-family vpnv4
[r4-bgp-af-vpnv4]peer 2.2.2.2 enable

以上配置完后,中间环境已全部搭好

第四步:

把R1和R5通过静态用mplsVPN打通:

先在R1、R5上写静态:
[r1]ip route-static 192.168.3.0 24 192.168.2.2
[r1]ip route-static 192.168.4.0 24 192.168.2.2
[r5]ip route-static 192.168.1.0 24 192.168.3.2
[r5]ip route-static 192.168.2.0 24 192.168.3.2接下来在R2和R5上做配置:
[r2]ip route-static vpn-instance b1 192.168.1.0 24 192.168.2.1 #写去往R1上网段的静态
[r2]bgp 1
[r2-bgp]ipv4-family vpn-instance b1
[r2-bgp-b1]import-route direct #重发布到B1中
[r2-bgp-b1]import-route static R5上同理:
[r4]ip route-static vpn-instance b2 192.168.4.0 24 192.168.3.1
[r4]bgp 1
[r4-bgp]ipv4-family vpn-instance b2
[r4-bgp-b2]import-route direct
[r4-bgp-b2]import-route static

分别在R2上查看bgp表
在这里插入图片描述
测试:在R1上ping192.168.3.0网段:
在这里插入图片描述
把R6和R7通过动态用mplsVPN打通:

创建区域并绑定接口
[r2]ip vpn-instance a1
[r2-vpn-instance-a]ipv4-family
[r2-vpn-instance-a-af-ipv4]route-distinguisher 2:2
[r2-vpn-instance-a-af-ipv4]vpn-target 2:2
[r2-vpn-instance-a-af-ipv4]q
[r2-vpn-instance-a]int g0/0/2
[r2-GigabitEthernet0/0/2]ip binding vpn-instance a1
[r2-GigabitEthernet0/0/2]ip add 192.168.2.2 24[r4]ip vpn-instance a2
[r4-vpn-instance-a]ipv4-family
[r4-vpn-instance-a-af-ipv4]route-distinguisher 2:2
[r4-vpn-instance-a-af-ipv4]vpn-target 2:2
[r4-vpn-instance-a-af-ipv4]q
[r4-vpn-instance-a]int g0/0/2
[r4-GigabitEthernet0/0/2]ip binding vpn-instance a2
[r4-GigabitEthernet0/0/2]ip add 192.168.3.2 24[Huawei]sysname r6
[r6]int lo 0
[r6-LoopBack0]ip add 192.168.1.1 24
[r6-LoopBack0]int g0/0/2
[r6-GigabitEthernet0/0/2]ip add 192.168.2.1 24[r7]int lo 0
[r7-LoopBack0]ip add 192.168.4.2 24
[r7-LoopBack0]int g0/0/2
[r7-GigabitEthernet0/0/2]ip add 192.168.3.2 24[r6]rip 1
[r6-rip-1]version 2
[r6-rip-1]un summary
[r6-rip-1]network 192.168.1.0
[r6-rip-1]network 192.168.2.0[r2]rip 1 vpn-instance a
[r2-rip-1]version 2
[r2-rip-1]un summary
[r2-rip-1]network 192.168.2.0[r4]ospf 2 vpn-instance a
[r4-ospf-2]area 0
[r4-ospf-2-area-0.0.0.0]network 192.168.3.1 0.0.0.0[r7]ospf 1 router-id 7.7.7.7
[r7-ospf-1]area 0
[r7-ospf-1-area-0.0.0.0]network 192.168.3.1 0.0.0.0
[r7-ospf-1-area-0.0.0.0]network 192.168.4.2 0.0.0.0双向重发布
[r2]rip 1 vpn-instance a
[r2-rip-1]import-route bgp
[r2-rip-1]q
[r2]bgp 1
[r2-bgp]ipv4-family vpn-instance a
[r2-bgp-a]import-route rip 1[r4]ospf 2 vpn-instance a
[r4-ospf-2]import-route bgp
[r4-ospf-2]q
[r4]bgp 1
[r4-bgp]ipv4-family vpn-instance a
[r4-bgp-a]import-route ospf 2

查看7的路由表:
在这里插入图片描述
在R6上pingR7
在这里插入图片描述

至此,实验要求已全部满足。


推荐阅读
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • HSRP热备份路由器协议的应用及配置
    本文介绍了HSRP热备份路由器协议的应用及配置方法,包括设计目标、工作原理、配置命令等。通过HSRP协议,可以实现在主动路由器故障时自动切换到备份路由器,保证网络连通性。此外,还介绍了R1和R2路由器的配置方法以及Sw1和Sw2交换机的配置方法,最后还介绍了测试连通性和路由追踪的方法。 ... [详细]
  • 1、Ipv4只能用于内网,外网只能用2、DNS:把域名解析成ip地址3、MAC地址就是物理地址(网卡序列号)   IP地址:电脑序列号4、不同电脑,微信之间互相通信,靠的是端口;  ... [详细]
author-avatar
141qws_330
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有