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

IP组播配置与管理——2

PIM-DM(IPv4)配置与管理

PIM-DMIPv4)配置与管理

在PIM-DM模式中使用“推”(Push)模式转发组播报文,就是由PIM路由器向组播成员主动推送组播数据,因为PIM-DM网络仅适用于ASM模型,即它的组播源是任意的,组播成员和组播路由器都不关心组播源的位置。当网络中有活跃的组播源出现,即有组播源需要向某组播组发送组播数据时,会将组播数据扩散到全网,借助RPF检查机制创建组播路由表项,实现组播数据转发。因为组播数据要在全网泛洪扩散,所以一般用于规模较小、组成员分布密集的组播网络,否则可能造成组播路由器的数据转发压力。

PIM-DM的关键工作机制包括邻居发现、扩散、剪枝、嫁接、断言和状态刷新这几个过程


如上图所示,在PIM-DM网络中出现了活跃的组播源Source后,通过组成员管理协议IGMP,SwitchD、SwitchE了解到与其相连的HostB、HostC为组播组成员,便将接收到的组播数据分别向组成员所在网段转发。由于与SwitchC相连网段没有组成员,它会逐跳向上游发起剪枝操作。组播源的最后一跳PIM组播路由器SwitchA接收到剪枝报文后,就会将与SwitchC相连的下游接口从PIM路由表项的下游接口列表中删除,抑制组播数据向该接口的网段转发。PIM-DM网络就是这样通过这种周期性的“扩散-剪枝”来构建并维护一棵单向无环的SPT(Source Specific Shortest Path Tree,源指定最短路径树)。整个SPT路径是以组播源为起点的,同时组播源也是组播的中心。

一、PIM-DM(IPv4)特性的产品支持

除S2700/3700外,其他交换机均支持PIM-DM。

PIM-DM可配置的主要特性包括基本功能的配置、PIM-DM控制参数的调整和PIM Silent。

1、PIM-DM基本功能

PIM-DM基本功能就是对对应的VLAN或者Loopback接口上使能PIM-DM功能。在接口上使能了PIM-DM功能之后,系统采用PIM-DM的缺省值就可以正常工作,将组播源发出的组播数据分发到组成员网段。

2、PIM-DM控制参数

有时为了提高网络安全性,增强组播报文转发的控制能力,根据实际需要设备支持调整PIM-DM控制参数:

3、PIM Silent

在直连用户主机的接口上需要使能PIM协议,以便在该接口上可以建立PIM邻居,处理各类PIM协议报文。但这里存在一个问题,那就是如果有恶意主机模拟向PIM路由器发送PIM Hello报文时,有可能导致设备瘫痪。为了避免这样的情况发生,可以将该接口设置为PIM Silent状态(即PIM消极状态),这样就可禁止该接口接收和转发任何PIM协议报文,删除该接口上的所有PIM邻居以及PIM状态机。但该接口上的IGMP功能不受影响。

该功能仅适用于与用户主机网段直连的PIM设备接口。且该用户网段只与这一台PIM设备相连。配置了该功能后,接口将不再接收和转发任何PIM协议报文,但这样配置后,该接口配置的其他PIM功能将失效,需谨慎使用。如果用户网段与多台PIM设备相连,且如果在多个PIM设备接口上配置PIM Silent,则这些接口都成为了静态DR,会导致该网段中同时存在多个DR,从而引发组播故障。

与PIM-DM相关的功能和参数缺省配置为PIM-DM未使能、状态刷新功能在使能PIM-DM功能后使能,PIMSilent功能未使能。

二、配置PIM-DM基本功能

在配置PIM-DM前需要先配置好单播路由协议,保证网络内单播路由畅通。且设备上不能同时使能PIM-DM和PIM-SM,如果接口上需要同时使能PIM-DM和IGMP,必须先使能PIM-DM,再使能IGMP

PIM-DM基本功能的配置很简单,主要就是两项基本任务:一是全局使能组播路由功能(如果在配置其他组播功能时已使能,则无需再使能),二是在对应的VLAN接口或Loopback接口上使能PIM-DM功能。

三、调整组播源控制参数

每当PIM设备在接收到源S发往组播组G的组播报文后,就会启动该(S,G)表项的定时器,即源生存时间(缺省值为210s)。下次如果超时前接收到该组播源发来的报文,则重置定时器;如果超时后没有接收到该组播源发来的报文,则认为该(S,G)表项失效,将其删除。通过这种方法可以及时地更新PIM路由器上的组播转发表项。

另外,如果希望控制组播流量或者保证组播成员所接收的组播数据的安全性,还可在PIM设备上配置源地址过滤策略,只接收该策略允许范围内组播源发送的组播数据,拒绝非法的组播数据。缺省情况下,没有过滤策略,即接收任何组播源发来的组播数据。通过基本或高级ACL可对组播源地址或组地址进行过滤,还可对组播源生存时间进行控制,提高数据安全性、控制网络流量。在调整组播源控制参数前,需配置好PIM-DM基本功能。

示例1:使用数字型ACL配置接收组播源地址为10.10.1.2的组播数据包,丢弃组播源地址为10.10.1.1的组播数据包。

[Huawie]system-view

[Huawei]acl number 2001

[Huawei-acl-basic-2001]rule permit source10.10.1.2 0

[Huawei-acl-basic-2001]rule deny source10.10.1.1 0

[Huawei-acl-basic-2001]quit

[Huawei]multicast routing-enable

[Huawei]pim

[Huawei-pim]source-policy 2001

示例2:使用命名型ACL配置接收组播源地址为10.10.1.2的组播数据包,丢弃组播源地址为10.10.1.1的组播数据包。

[Huawie]system-view

[Huawei]acl name myacl

[Huawei-acl-adv- myacl]rule permit ipsource 10.10.1.2 0

[Huawei-acl- adv- myacl]rule deny ip source10.10.1.1 0

[Huawei-acl- adv- myacl]quit

[Huawei]multicast routing-enable

[Huawei]pim

[Huawei-pim]source-policy acl-name myacl

示例3:使用数字型ACL配置接收组播源地址为10.10.1.2,组播组地址为255.1.1.3的组播数据包。

[Huawie]system-view

[Huawei]acl number 3001

[Huawei-acl-basic-3001]rule permit source10.10.1.2 0 destination 255.1.1.3 0

[Huawei-acl-basic-3001]quit

[Huawei]multicast routing-enable

[Huawei]pim

[Huawei-pim]source-policy 3001

四、调整邻居控制参数

通过调整邻居控制参数,控制邻居间Hello报文的交互,可以防止非法邻居关系的建立,保证PIM-DM网络的安全。调整邻居控制参数前,也需完成PIM-DM基本功能配置。

1、调整Hello报文的时间控制参数

PIM设备通过周期性地发送Hello报文来维护PIM邻居关系,就像RIP、OSPF这些动态路由协议中的邻居维护一样。当PIM设备收到邻居发来Hello报文后会启动定时器,时间设为该Hello报文的保持时间。如果超时后没有收到邻居发来的Hello报文则认为该邻居失效或不可达。为了避免多个PIM设备同时发送Hello报文而导致冲突,当PIM设备接收到Hello报文时将延迟一段时间再发送Hello报文。该段时间的值为一个随机值,并且小于触发Hello报文的最大延迟。

发送Hello报文的时间间隔(缺省为30s)、Hello报文的保持时间(缺省为105s)在全局PIM视图下和接口视图下都可配置。如果同时配置,接口视图上的配置生效。但触发Hello报文的最大延迟时间(缺省为5s)只能在接口上配置。

2、配置邻居过滤策略

设备支持以下两种邻居过滤策略,来保证PIM-DM网络的安全和畅通。

(1)限定合法的邻居地址范围,防止非法邻居入侵等。

(2)拒绝接收无GenerationID的Hello报文,保证与设备相连的都是正常工作的PIM邻居。


示例:配置VLANIF100与地址为4.4.4.4的交换机建立PIM邻居。

[Huawie]system-view

[Huawei]acl number 2001

[Huawei-acl-basic-2001]rule permit source4.4.4.4 0.0.0.0

[Huawei-acl-basic-2001]quit

[Huawei]multicast routing-enable

[Huawei]interface vlanif 100

[Huawei-Vlanif100]pim neighbor-policy 2001

五、调整剪枝控制参数

如果当前与设备相连的网段没有组播组成员,设备就需要向上游发送剪枝报文,请求停止转发组播数据。可根据实际需要调整剪枝过程的控制参数,控制组播报文转发来支持不同转发场景。如果没有特殊需要,推荐使用缺省值。

在剪枝控制参数调整过程中,可以配置:Join-Prune报文的时间控制参数、Join-Prune报文的信息携带能力、剪枝延迟时间这3个方面,但它们的配置无先后顺序。

1、调整Join-Prune报文的时间控制参数

PIM设备通过向上游发送的剪枝信息被封装在PIM协议通用的转发控制报文(即Join-Prune报文)中。上游设备在收到Join-Prune报文后,就会启动定时器(缺省值为210s),时间设为Join-Prune报文自身携带的保持时间。超时后,如果没有收到下游后续发来的Join-Prune报文,则恢复相应组播组下游接口的转发。

Join-Prune报文的保持时间在全局PIM视图下和接口视图下都可配置。如同时配置,接口视图上的配置生效。

2、调整Join-Prune报文的信息携带能力

在PIM-DM网络中,Join-Prune报文主要包含了需要剪枝的表项信息。设备支持通过配置Join-Prune报文长度、包含表项数目、发送方式,来调整向上游发送剪枝信息的信息量。

(1)当PIM邻居设备性能比较差,处理单个Join-Prune报文耗时比较长,可以通过调整发送的Join-Prune报文长度(缺省值为8100字节)来控制发送Join-Prune报文携带的(S,G)表项数量,来降低PIM邻居设备的压力。

(2)当PIM邻居设备端口带宽较小时,可以通过调整周期性报文发送队列长度,控制每次发给PIM邻居设备的(S,G)表项数量(缺省值为1020个),采取小量多批次方式发送Join-Prune报文,从而避免PIM邻居设备来不及处理就将报文丢弃,引起路由震荡。

(3)缺省情况下,为了提高发送效率,Join-Prune报文都是打包向上游发送。如果不希望Join-Prune报文打包发送,可去使能此功能,使Join-Prune报文一个个地发送。

3、调整剪枝延迟时间

在PIM剪枝过程中,从收到下游设备发来的剪枝信息到继续向上游设备发送剪枝信息会有一段延迟时间,这个时间称为LAN-Delay(缺省值为500ms)。PIM设备向上游发完剪枝信息后,也不会立即将相应下游接口剪掉,还会保持一段时间向下游转发,以便下游设备有时间提出否决剪枝的请求。这段否决剪枝的时间称为Override-Interval(缺省值为2500ms)。所以实际上PIM设备从接收到剪枝信息到完成剪枝动作总共延迟了LAN-Delay + Override-Interval = PPT。PPT表示当前交换机从收到下游剪枝报文到执行剪枝操作(抑制下游接口转发)之间的延时。在PPT时间内如果收到下游发来的剪枝否决报文,则取消剪枝操作。

LAN-Delay、Override-Interval在全局PIM视图下和接口视图下都可配置,同时配置,接口视图下的配置优先级高于系统视图下的配置,接口视图下的配置生效。



六、调整嫁接控制参数

为使被剪枝网段快速恢复转发,设备会向上游发送Graft报文请求恢复组播数据转发,并同时在发送接口启动定时器(缺省为3s)。超时后,如果设备仍没有接收到组播数据,会重新向上游发送Graft报文。通过调整嫁接控制参数,可以控制组播数据报文的转发来支持不同转发场景。

调整嫁接控制参数的方法很简单,就是在对应的VLAN接口或者Loopback接口视图下使用pimtimer graft-retry interval命令在接口上配置重传Graft报文的时间间隔,取值范围是1~65535的整数秒。

示例:在VLANIF100接口上配置重传Graft报文的时间间隔为80s。

[Huawei]multicast routing-enable

[Huawei]interface vlanif 100

[Huawei-Vlanif100]pim timer graft-retry 80

七、调整状态刷新控制参数

为防止被剪枝接口因为剪枝状态超时而恢复转发,PIM-DM网络启用了状态刷新功能,通过在与组播源直连的第一跳PIM设备上周期性地扩散发送State-Refresh报文,刷新接口剪枝定时器,维持SPT数。同样,在调整状态刷新控制参数之前,需要完成PIM-DM基本功能配置。

在整个调整状态刷新控制参数配置过程中,可以配置以下几个方面:禁止状态刷新报文的转发、状态刷新报文的TTL值、状态刷新报文的时间控制参数。配置时无限售顺序。

1、禁止状态刷新报文的转发

缺省情况下,为了避免下游一直没有组播需求的被剪枝接口因为超时而恢复转发,与组播源S直连的PIM设备会触发发送(S,G)状态刷新报文。该报文会逐跳向下游扩散,刷新所有PIM设备上的剪枝定时器。这样没有转发需求的接口将一直处于抑制转发状态。

如果希望组播数据每次“扩散——剪枝”时都能在全网扩散,不需要通过设备转发状态刷新报文来抑制被剪枝接口转发组播数据,可在接口上禁止此功能。但状态刷新机制能够很好地减少网络资源浪费,一般情况下不建议禁止接口的状态刷新报文的收发能力。

2、调整状态刷新报文的时间控制参数

与组播源直连的第一跳PIM设备会周期性(缺省值为60s)地向下游发送状态刷新报文。由于状态刷新报文扩散发送,设备很有可能在短时间内收到重复的状态刷新报文。为了避免这种情况发生,设备在收到针对某(S,G)的状态刷新报文后,会启动定时器(缺省值为30s),时间设为该报文的抑制时间。在定时器超时前,如果收到相同的状态刷新报文,就会直接丢弃。

3、配置状态刷新报文的TTL值

设备在收到状态刷新报文后,会将状态刷新报文的TTL值(缺省值为255)减去1,然后继续向下游扩散转发来刷新下游设备的剪枝定时器,直至状态刷新报文的TTL值为0.当网络规模很小而TTL值很大时,会造成状态刷新报文在网络中循环传递。因此,为了有效控制刷新报文的传递范围,需要根据网络规模大小配置合适的TTL值。但因为状态刷新报文是由与组播源直连的第一跳PIM设备触发发送,所以状态刷新报文的TTL值只能在该设备上配置有效

八、调整断言控制参数

当一个网段内有多个相连的PIM设备通过RPF检查后向该网段转发组播数据时,则需要通过断言竞选来保证只有一个PIM设备向该网段转发组播数据。在竞选中落败的PIM设备会抑制相应下游接口向该网段转发组播数据。但是这种竞选失败的状态只会保持一段时间,这段时间称为Assert报文的保持时间。超时后,落选的设备会重新恢复转发组播数据从而触发新一轮的竞选。

当设备从下游接口接收到组播数据时,说明该网段中还存在其他的上游设备。设备从该接口发出Assert报文,参与竞选唯一上游。可调整断言Assert报文保持时间(缺省值为180s),可在全局PIM视图下或接口视图下配置。同时配置,则接口视图上的配置生效。调整前需先完成PIM-DM基本功能配置。

在全局的配置方法是在PIM视图下使用holdtimeassert interval命令配置Assert报文的保持时间;在接口上的配置方法是在具体的VLAN接口或者Loopback接口视图下使用pim Holdtime assert interval命令配置Assert报文的保持时间,取值范围7~65535的整数秒。

示例1:在PIM视图中全局配置交换机保持Assert状态的超时时间为100s。

system-view

[Huawei]multicast routing-enable

[Huawei]pim

[Huawei-pim]holdtime assert 100

示例2:配置VLANIF100接口的保持Assert状态的超时时间为100s。

system-view

[Huawei]multicast routing-enable

[Huawei]interface vlanif 100

[Huawei-Vlanif100]pim holdtime assert 100

九、配置PIM Silent

使能PIM Silent功能的接口会禁止接收和转发任何PIM协议报文,删除该接口上的所有PIM邻居以及PIM状态机。但是,该接口上的IGMP功能不受影响。该功能仅适用于与用户主机网段直连的PIM设备接口,且该用户网段只与这一台PIM设备相连

配置接口为PIM Silent状态的方法很简单,只需在对应的VLAN接口或Loopback接口视图下配置pim silent命令,使能PIM Silent功能即可。

十、PIM-DM管理

(1)display piminterface [ interface-type interface-number | Up | down ] [verbose]

(2)display pimNeighbor [neighbor-address | interface interface-type interface-number |verbose ]*

(3)display pimrouting-table [ group-address [ mask { group-mask-length | group-mask } ] |source-address [ mask { source-mask-length | source-mask } ] | incoming-interface{ interface-type interface-number | register } | outgoing-interface { include |exclude | match } { interface-type interface-number |register | none } | mode {dm | sm | ssm } | flags flag-value | fsm ]*[ outgoing-interface-number [ number] ]

(4)display pimrouting-table brief [ group-address [ mask { group-mask-length | group-mask } ]| source-address [ mask { source-mask-length | source-mask } ] |incoming-interface { interface-type interface number | register } ]*

(5)display pim control-message  counters [ message-type { assert | graft |graft-ack | hello | join-prune | state-refresh | bsr } | interfaceinterface-type interface-number ]*

(6)display pimgrafts

(7)display pimcontrol-message counters [message-type { assert | graft | graft-ack | hello |join-prune | state-refresh | bsr } | interface interface-type interface-number]*

(8)display piminvalid-packet [interface interface-type interface-number | message-type {assert | graft | graft-ack | hello | join-prune | state-refresh } ]*

(9)reset pimrouting-table group group-address mask { group-mask-length | group-mask }source source-address interface interface-type interface-number

十一、PIM-DM基本功能配置示例

如下图,为一个用户比较密集的小型网络,用户主机HostA、HostB希望能够接收到Source发送的组播数据。

1、基本配置思路分析

要求在一个密集型小型组播网络中,各组播成员可以接收到组播源发来的组播数据。所以可以使用PIM-DM协议为网络中的用户主机提供组播服务,使得加入同一组播组的所有主机能够接收组播源发往该组的组播数据。具体配置任务如下:

(1)按照图中标注配置交换机各VLAN接口IP地址和单播路由协议,因为组播域内路由协议PIM依赖单播路由协议。单播路由是组播协议正常工作的基础。

(2)在所有提供组播服务的交换机上使能组播路由功能,并在各VLAN接口上使能PIM-DM功能。使能PIM-DM功能之后才能配置PIM-DM的其他功能。

(3)在与主机侧相连的交换机VLAN接口上使能IGMP,用于维护组成员关系。但是,如果用户主机侧需同时配置PIM-DM和IGMP,必须先使能PIM-DM,再使能IGMP。

2、具体配置步骤

(1)配置各交换机接口的IP地址和掩码,各交换机间采用OSPF进行互连,确保网络中各交换机间能够在网络层互通,并且之间能够借助单播路由协议实现动态路由更新。

[SwitchA]vlan batch 10 20 30

[SwitchA]interface vlanif 10

[SwitchA-Vlanif10]ip address 192.168.5.1 24

[SwitchA-Vlanif10]quit

[SwitchA]interface vlanif 20

[SwitchA-Vlanif20]ip address 10.110.1.1 24

[SwitchA-Vlanif20]quit

[SwitchA]interface vlanif 30

[SwitchA-Vlanif30]ip address 192.168.1.1 24

[SwitchA-Vlanif30]quit

[SwitchA]interface gigabitetnernet 0/0/1

[SwitchA-GigabitEthernet0/0/1]port hybridtagged vlan 10 #---把GE0/0/1接口以带标签方式加入VLAN10

[SwitchA-GigabitEthernet0/0/1]port hybridpvid vlan 10 #---配置GE0/0/1接口的缺省VLAN为VLAN10

[SwitchA-GigabitEthernet0/0/1]quit

[SwitchA]interface gigabitetnernet 0/0/2

[SwitchA-GigabitEthernet0/0/2]port hybridtagged vlan 20

[SwitchA-GigabitEthernet0/0/2]port hybridpvid vlan 20

[SwitchA-GigabitEthernet0/0/2]quit

[SwitchA]interface gigabitetnernet 0/0/3

[SwitchA-GigabitEthernet0/0/3]port hybridtagged vlan 30

[SwitchA-GigabitEthernet0/0/3]port hybridpvid vlan 30

[SwitchA-GigabitEthernet0/0/3]quit

[SwitchA]ospf

[SwitchA-ospf-1]area 0 #---进入OSPF骨干区域

[SwitchA-ospf-1-area-0.0.0.0]network192.168.5.0 0.0.0.255  #---宣告192.168.5.0/24网络

[SwitchA-ospf-1-area-0.0.0.0]network192.168.1.0 0.0.0.255

[SwitchA-ospf-1-area-0.0.0.0]network10.110.1.0 0.0.0.255

(2)在所有交换机使能组播路由功能,并在各VLAN接口上使能PIM-DM功能。

[SwitchA]Multicast routing-enable

[SwitchA]Interface vlanif10

[SwitchA-Vlanif10]pim dm

[SwitchA-Vlanif10]quit

[SwitchA]Interface vlanif20

[SwitchA-Vlanif20]pim dm

[SwitchA-Vlanif20]quit

[SwitchA]Interface vlanif30

[SwitchA-Vlanif30]pim dm

[SwitchA-Vlanif30]quit

    (3)在SwitchA连接用户主机的接口上使能IGMP功能。

[SwitchA]interface vlanif 20

[SwitchA-Vlanif20]igmp enable

    配置好后,可以使用displaypim interface命令查看接口上PIM的配置和运行情况。使用display pim routing-table命令查看PIM协议组播路由表。



推荐阅读
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 行为设计模式:命令模式详解
    命令模式是一种行为设计模式,它通过将请求封装为对象,使得可以使用不同的请求来参数化客户端,支持请求的排队、日志记录以及提供命令的撤销和恢复功能。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 最新进展:作为最接近官方声明的信息源,本文吸引了大量关注。若需获取最新动态,请访问:lkhill.com/ccie-version-5-update ... [详细]
  • 深入解析Nacos服务自动注册机制
    本文将探讨Nacos服务自动注册的具体实现方法,特别是如何通过Spring事件机制完成服务注册。通过对Nacos源码的详细分析,帮助读者理解其背后的原理。 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 本文介绍了如何通过创建自定义 XML 文件来修改 Android 中 Spinner 的项样式,包括颜色和大小的调整。 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • Android 开发技巧:使用 AsyncTask 实现后台任务与 UI 交互
    本文详细介绍了如何在 Android 应用中利用 AsyncTask 来执行后台任务,并及时将任务进展反馈给用户界面,提高用户体验。 ... [详细]
  • 本文介绍了在Linux环境下如何有效返回命令行状态、上一级目录及快速查找头文件和函数定义的方法。包括处理长时间运行命令、编辑器退出技巧、目录导航以及文件搜索策略。 ... [详细]
author-avatar
齐鲁墨_931
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有