单播 广播 组播_耗时10+小时撰写 带你系统认识组播 收藏这些概念

组播multicast:在一个或跨越多个广播域,实现点对多点的通信需求,不存在强制性;比单播技术更加灵活、比广播技术更加高效;广泛应用在网络电视、在线直播、远程教育、视频会议等对带宽和数据交互实时性较高的信息服务。

单播unnicast:在一个或跨越多个广播域,实现点对点的通信需求。

广播broadcast:在同一个广播域内,实现点对多点的通信需求,存在强制性。

1ada1f1056ecaff555ab4d592aae2a93.png

1、 高效性:克服了广播发送数据的缺点,实现了点到多点之间高效的数据传输。

2、 节省资源:更好的带宽利用,只针对组播组成员发送且不存在强制性,可以节省了信源主机和非组播组成员不必要的CPU和内存消耗。

3、 时效性:发送源只需要发送一份数据,而目的地就可以同时接收到该数据。

4、 发送源主机和中间路由器都不必知道接收者的存在就可以直接发送。

5、 组播可以实现多对一、一对多、多对多的应用。

注:组播只能基于UDP封装且不能提供可靠传输机制;没有序列号,报文发送容易乱序,一般需要通过添加实时传输协议RTP来保证数据传输的序列性;组播在发送时可能会产生环路和重复包

组播源:信息的发送者称为"组播源"或"信源"。

组播路由器:提供组播功能的路由器称为"组播路由器";组播路由器不仅提供组播路由功能,也提供组成员管理功能;同时也可以是一个或多个组播组的接收成员;同一组播组的成员可以广泛分布在网络中的任何地方,即"组播组"关系没有地域限制;

组播组成员:相同信息的接收者构成一个组播组,每个接收者都是"组播组成员"。

组播设计架构:

eecd0f5006b53203beb5ec9d81cb05f1.png

L3组播:信源/组播应用程序--研发工程师

L2组播:组播路由器/组播动态路由选择协议--网络工程师

-IGP:PIM(协议无关组播)、DVMRP、MOSPF、CBT

注:PIM对IGP无要求,路由可达即可;而MOSPF基于单播OSPF基础上运行的。

-EGP:MSDP(组播源发现协议)、MP-BGP(BGP v4+)

注:MSDP可以实现跨越不同的AS发送和接收组播报文,结合MPBG一起使用;

L1组播:组播组成员/因特网组管理协议IGMP--网络工程师

注:通过交互IGMP报文,让最后一跳路由器知道自己身后是否存在组播组成员;不存在就不发送;存在就延伸树形结构并将组播发送给组播组成员。

组播报文封装:针对不同的应用进行不同的封装

59ba99028d469f5bb47b8c62be64c410.png

组播地址:标识一组接收者,不能分配给某个网卡使用,没有网络位和主机位的说法,也没有网络地址和广播地址(扁平化地址/32);标准组织IANA将D类地址空间分配给IPv4组播使用,范围224.0.0.0 -- 239.255.255.255;

IPv4组播MAC地址:前24位地址位为01005E,第25位恒为0;后23位地址位是IP地址的后23位地址(32:1);

IPv6组播MAC地址:将组播地址的后32提取出来,然后在前边添加3333

fd39de005d80a1b3118696f4e7bc4725.png

因特网组管理协议IGMP:运行在最后一跳组播路由器和主机之间,用于建立、维护组播组成员关系;通过IGMP在路由器中记录的信息判断某个组播组是否在本地有组播组成员,能够实现两个功能:

1、主机通过发送IGMP报文通知路由器希望接收某个特定组播组的信息;

2、路由器通过IGMP报文周期性地查询局域网内的组播组成员是否处于活动状态,实现所连网段组播组成员关系的收集与维护。

IGMP报文封装:Ethernet2|IPv4|IGMP|FCS IP协议号为2

1、IGMPv1(RFC 1112)中定义了基本的组成员查询和报告过程;支持ASM模型

3a7735c020210b19db25a4639acc7183.png

版本:IGMP版本为1

类型:成员关系查询报文Query(0x11)和成员关系通告报文Report(0x12)

校验和:防止报文被篡改、冲突。

组地址:当用于成员关系通告时,组地址字段包含该组组播地址。

当用于成员关系查询时,本字段为0,并被主机忽略。

查询报文Query:由最后一跳路由器60s/次周期发送,目的地址为224.0.0.1,TTL值为1;路由器给主机发送Query报文会形成一个IGMP查询表,老化时间为180s,超过180s没有收到通告报文就会删除对应的IGMP表项。

通告报文Report:由PC主机发送,分为主动通告和针对查询报文的通告。

IGMP离组:PC会静悄悄的离组,不会通知路由器,最后一跳路由器在3个hello周期内没有收到Report报文会将该主机从IGMP查询列表中删除。

IGMP report supress优化机制:一台PC收到了路由器发送的Query报文,不能立马去做Report确认,PC开启一个随机计时器,范围为1-10s,取值为整数,在计时器过期后,其中的一台PC会发送目的地址为该组组播地址的Report报文,最后一跳路由器和组内其他成员收到这个Report报文后就会抑制报告发送。

当一个域内有多台最后一跳路由器时,需要选举出一台路由器作为IGMP查询者在IGMPv1中就需要由组播动态路由选择协议(如PIM)选举出唯一的指定路由器DR作为IGMP查询者。

2、 IGMPv2(RFC 2236)在IGMPv1的基础上添加了指定组查询、组成员快速离开的机制和最大响应时间等机制;只支持ASM模型

f87bd876ba2f25263aa534a3ac966f82.png

类型:

1)成员关系查询(0x11)

-常规查询:用于确定组播组有哪些成员,常规查询地址由全零表示;

-指定组查询:用于查询特定的组播组是否还有组成员。

2)版本2成员关系通告报文(0x16)

3)版本1成员关系通告报文(0x12)

4)离组报文Leave Group message(0x17)

最大响应时间:最大响应时间为10s,响应时间间隔为0.1s

校验和:防止报文被篡改、冲突。

组地址:在查询消息中,发送一个常规查询报文时组地址域设为0;发送一个特定组查询报文时,则用该组的组播组地址;发送成员报告或离开组的报文时,组地址保留了要报告或要离开的组播组地址。

查询者选举:当有多个最后一跳路由器时,路由器会互相发送Query报文进行查询者选举(224.0.0.1),比较路由器的接口地址,地址小的路由器会被选举为查询者,查询者周期性60s/次发送Query报文,邻居路由器超过120s没有收到Query报文,接口地址第二小的路由器成为查询者(和PIM选举的DR无关)

离组过程:主机在关闭组播应用的时候会通过224.0.0.2给路由器发送离组报文Leave Group message,路由器收到离组报文后会立即发送Group-specific query(目的地址为离组报文发送的组播组地址)并将最大响应时间修改为2s(思科只发送一次),路由器在2s内收到主机的Report报文,会保留组播查询表项。

路由器在2S内没有收到Report报文就会立即删除对应的IGMP表项。

Router#show ip igmp group(查看igmp表项)

Router#show ip igmp int e0/0查询路由器接口igmp配置

3、IGMPv3(RFC 3376)中增加的主要功能是成员可以指定接收或拒绝来自某些组播源的报文,实现了对SSM模型的支持。

91d170ac7ee33ed1d84c3b198c24d6e1.png

1、保留(Resv):发送的时候以0填充,接收的时候不做处理,被忽略。

2、标志位S(禁止路由器处理):当被设置成1时,表示任何接收路由器禁止更新它们在收到查询时要更新的那些定时器。但它不禁止查询者选举或者普通的在路由器上执行的(当路由器作为一个组成员的时候)主机端的查询处理。

3、查询者的健壮变量(QRV):如果不为0,QRV中包含中一个被查询者使用的[健壮变量]的值,如果查询者的健壮变量的值超过7,即QRV字段的最大值,那么QRV被设成0。路由器取最近收到的查询中的QRV值作为它们自己的健壮性变量的值,除非最近收到的QRV是0,在这种情况下,接收者使用缺省的健壮性变量值,或者是一个静态配置的值。

4、查询者的查询间隔代码(QQIC):指定查询者使用的查询间隔。

5、源数量Number_of_Source:表明该查询中存在多少个源地址,在普通查询或指定组查询中这个值是0,在指定多个源的查询中,这个值为非0值。

6、源地址Sourceaddress:n个IP单播地址的数组,n就是源数量字段的值。

在IGMPV3中它有了以下的改进功能:

1、增加了组播组成员的控制能力;IGMP V3不仅可以指定要加入哪个组播组,还能明确要求从哪个指定组播源接受信息,这也是指定源组播功能。

2、响应消息包含多组记录:IGMP V3响应消息包含的组地址为224.0.0.22,可以携带1个或多个组记录,可以包含组播组地址、数目不等的源地址信息。

3、取消了Report的抑制机制、增加了指定源组查询报文;取消了离组报文,需要结合第三方协议配合离组。

互联网组管理协议嗅探IGMP Snooping:运行在二层设备上的组播约束机制,用于管理和控制组播组成员;运行IGMP Snooping的二层设备就有能力识别所有的IGMP报文,通过对收到的IGMP报文进行分析,为端口和组播IP地址建立起映射关系表项,并根据这样的映射关系精确转发组播数据到达指定组播组成员;

注:思科交换机默认开启IGMP Snooping。

版本:CGMP(初始版本)、IGMP Snooping、IGMP Snooping Proxy(代理)

e5f3f105597f415e35ca304c378b01fb.png

1)路由器端口(Router Port):交换机上朝向三层组播设备(DR或IGMP查询者)一侧的端口,如Switch A和Switch B各自的Ethernet1/1端口;交换机将本设备上的所有路由器都记录在路由器端口列表中。

2)成员端口(Member Port):又称组播组成员端口,交换机上朝向组播组成员一侧的端口,如Switch A的Ethernet1/2和Ethernet1/3端口和Switch B的Ethernet1/2端口;交换机将所有成员端口都记录在IGMP Snooping转发表中。

IGMP Snooping工作机制:

1、 普遍组查询

IGMP查询者定期向本地网段内的所有主机与路由器(224.0.0.1)发送IGMP普遍组查询报文,以查询该网段有哪些组播组的成员;

2. 报告成员关系

如果主机要加入某个组播组,它会主动向IGMP查询者发送IGMP成员关系通告报文以声明加入该组播组或Report回复查询报文;在收到IGMP成员关系通告报文时,交换机将其通过VLAN内的所有路由器端口转发出去,从该报文中解析出主机要加入的组播组IP地址,并对该报文的接收端口做如下处理:

1)如果不存在该组播组所对应的转发表项,则创建转发表项,将该端口作为动态成员端口添加到出端口列表中,并启动其老化定时器;

2)如果已存在该组播组所对应的转发表项,但其出端口列表中不包含该端口,则将该端口作为动态成员端口添加到出端口列表中,并启动其老化定时器;

3)如果已存在该组播组所对应的转发表项,且其出端口列表中已包含该动态成员端口,则重置其老化定时器。

交换机不会将IGMP成员关系报告报文通过非路由器端口转发出去,因为根据主机上的IGMP成员关系报告抑制机制,如果非路由器端口下还有该组播组的成员主机,则这些主机在收到该报告报文后便抑制了自身的报告,从而使交换机无法获知这些端口下还有该组播组的成员主机。

3. 离开组播组

运行IGMPv1的主机离开组播组时,当其对应的动态成员端口的老化定时器超时后,交换机就会将该端口对应的转发表项从转发表中删除。

运行IGMPv2或IGMPv3的主机离开组播组时,会通过发送IGMP离开组报文,以通知组播路由器自己离开了某个组播组;当交换机从某动态成员端口收到IGMP离组报文时,首先判断要离开的组播组所对应的转发表项是否存在以及该组播组所对应转发表项的出端口列表中是否包含该接收端口:

-如果不存在该组播组对应的转发表项或该组播组对应转发表项的出端口列表中不包含该端口,交换机不会向任何端口转发该报文,而将其直接丢弃;

-如果存在该组播组对应的转发表项且该组播组对应转发表项的出端口列表中包含该端口,交换机会将该报文通过VLAN内的所有路由器端口转发出去。同时由于不知道该接收端口下是否还有该组播组的其它成员,所以交换机不会立刻把该端口从该组播组所对应转发表项的出端口列表中删除,而是重置其老化定时器。

当IGMP查询者收到IGMP离开组报文后,从中解析出主机要离开的组播组的地址,并通过接收端口向该组播组发送IGMP特定组查询报文。交换机在收到IGMP特定组查询报文后,将其通过VLAN内的所有路由器端口和该组播组的所有成员端口转发出去。对于IGMP离开组报文的接收端口(假定为动态成员端口),交换机在其老化时间内如果从该端口收到了主机响应该特定组查询的IGMP成员关系报告报文,则表示该端口下还有该组播组的成员,于是重置其老化定时器;如果没有从该端口收到主机响应特定组查询的IGMP成员关系报告报文,则表示该端口下已没有该组播组的成员,则在其老化时间超时后,将其从该组播组所对应转发表项的出端口列表中删除。

组播动态路由选择协议:让路由器拥有转发组播流量的功能;运行在三层组播设备之间,用于建立和维护组播"路由"并正确、高效地转发组播数据包;组播"路由"建立了从一个信源到多个接收者之间的无环数据传输路径,即组播分发树。

组播"路由"只有在数据流量出现的时候才会存在,在组播流量出现后的180s就会消失;组播"路由"为路由器记录的树形结构信息,包含信源的IP地址、组播流量的组播组地址、流量的入接口(incoming-interface)、流量的出接口信息列表(outgoing-interface-list)。

-IGP:PIM(协议无关组播)、DVMRP、MOSPF、CBT

-EGP:MSDP(组播源发现协议)、MPBGP(BGP v4+)

协议无关组播PIM:与单播路由协议无关,但事实上还是依靠单播路由来建立组播PIM邻居;当组播报文到达本地设备时,首先对其进行RPF校验;若RPF校验通过,则创建相应的组播"路由"表项,从而进行组播报文的转发;若RPF检查失败,则丢弃该报文。

反向路径转发RPF(Reverse Path Forwarding):组播路由协议依赖于已有的单播路由信息来创建组播"路由"表项,在创建组播"路由"表项时,使用RPF校验机制,以确保组播数据能够沿着正确的路径传输,避免环路和重复包;路由器收到组播流量,先判断路由器去往信源的单播路由对应的出接口是否是接收组播流量的入接口,如果是,则转发组播流量;如果不是,则丢弃;路由器对于一个信源,RPF接口有且只有一个;如果路由器去往信源有多条链路,怎么进行RPF接口选择?

1. 如果出接口不一样,则PK出接口地址,接口地址大的选举为RPF接口;

2. 如果出接口一样,下一跳地址不一样,则比较下一跳IP地址大小,下一跳地址大的选举为RPF接口。

3.写组播静态转发信息:ip mroute+信源ip地址/掩码+RPF接口+去往信源的上一跳地址(根据网络类型选择是否需要+去往信源的上一跳地址)。

4.启用MP-BGP路由协议,IPv4 multicast中运行MP-BGP的接口成为RPF接口

如果在路由器上同时运行以上三种方法,在进行组播路径选择的时候首先遵循最长匹配原则,其次比较管理距离(组播静态优于MP-BGP优于单播路由)

报文封装:Ethernet2|IPv4|PIM|FCS IP协议号103

99c45a26173b82a5a9f542eeca2d3d68.png

版本:当前使用版本2

类型:Hello/0 加入/剪枝/3 Assert/5

嫁接/6 嫁接回应/7 状态刷新/9

Hello发送时间为30s,hold 时间为3.5倍hello时间;Hello发送使用的组播组地址224.0.0.13;路由器之间首先通过发送hello建立PIM邻居;

在MA网络中,需要进行DR选举:先比较接口优先级,取值范围为0-42亿,0表示优先级最低,默认值为1;优先级高的选举为DR;如果优先级一样比较接口地址,大的选举为DR;DR支持抢占,没有BDR;DR在Sparse模式下非常重要。

根据实现机制的不同,PIM分为以下两种模式:

1、PIM-DM(Dense Mode密集模式)/推模型,简称最短路径树SPT,也称源树;

由于对路由器消耗大,一般适用于规模较小、组成员密集的局域网内。

1)假设所有主机都需要接收组播报文,将组播数据泛洪到网络的所有节点。

2)对没有组播数据转发的分支进行修剪,只保留有接收者的分支。

3)周期性重复"扩散-修剪"。

4)当被修剪的分支上出现组播组成员时,为了减少该节点恢复成转发状态的时间,适用"嫁接"机制恢复对组播数据的转发。

▶第一跳路由器收到组播流量,首先校验RPF接口,只要RPF接口没有问题,就会把组播流量转发给所有PIM邻居以及所有接收IGMP Report的组播组成员;所有路由器都会形成一个(S,G)组播组表项和一个(*,G)组播组表项。

(S, G)表示"组播源组",通常表示最短路径树或有信源S发往组播组G的组播报文,其中S(source)为信源IP地址,G(group)为组播组地址。

(*, G)表示由任意组播源发往组播组G的组播报文,"*"表示任意组播源,G(group)表示特定组播组地址。

▶组播流量泛洪后3分钟后才会开始修剪,对于没有连接组播组成员或没有下游其他邻居的路由器,会给上游邻居回向发送Prune修剪报文,路由器收到Prune报文不会立即停止发送组播,只有在路由器连接所有邻居的接口都收到Prune报文才会停止发送组播流量;但是不会删除对应的(S,G)组播组表项每隔3分钟还有再泛洪一次保证新的接入者能够加入。

▶嫁接(Graft)报文为使新加入的组播组成员不需要等待3min就可以正常接收到组播流量;当处在修剪状态的路由器下连接的设备突然出现组播组员,默认3分钟后才会收到组播流量;为加快网络收敛速度,如果路由器有组播接收者想要的对应的组播表项(S,G),该路由器会向上游路由器发送Graft报文,上游路由器收到Graft报文会立即将修剪状态超时并向上游邻居发送Graft报文,组播组流量就可以立马泼了下来。

▶通过断言机制Assert防止重复报文,做负载均衡的路由器通过既能发送又能接收组播流量的接口发送断言报文(断言报文包含:去往信源路由的管理距离、去往信源单播路由的度量值和接口IP地址),通过比较断言报文中的参数("管理距离>度量值>IP地址,管理距离/度量值是越小越好,IP地址是越大越好)选举出Winner,由Assert winner发送组播流量,其他接口不允许转发组播流量。

2、PIM-SM(Sparse Mode稀疏模式)/拉模型;对应两棵树,从信源和RP之间的叫SPT,从RP到接收者之间的叫RPT共享树;比较节省路由器的硬件资源,适用于范围广、组播成员分散的大型网络中;

1)假设所有主机都不需要接收组播报文,先确定下游是否存在接收者。

2)设定汇集点RP(Rendezvous Point)路由器,所有组播数据通过RP转发。

3)最后一跳路由器向RP发送Join报文,该报文逐条发送到RP,所经过的路径就是组播转发路径。

4)信源向RP注册,发送组播数据,RP沿着组播转发路径(RPT)转发数据。

▶首先需要指定一个RP;RP为启用PIM路由器上的一个接口,RP到路由器必须可达,可以指定多个RP但同时工作的只有一个RP。RP接口可以是物理接口,也可以是逻辑接口,建议使用逻辑接口以保持稳定性。

▶最后一跳路由器收到来自组播成员的Report报文,会查看去往RP单播路由的下一跳地址,根据下一跳地址向上一跳邻居路由器发送单播Join报文,邻居路由器会形成(*,G)表项并向RP方向发送Join报文,直到RP收到Join报文。

(*, G):表示共享树(多个源共享一棵树)或由任意组播源发往组播组G的组播报文,"*"表示任意组播源,G表示特定组播组IP地址。

▶第一跳路由器将收到的第一个组播帧封装成单播的PIM报文发送给RP,这个报文称为Register(注册报文);RP会查看是否有共享树存在,如果有,会将Register报文解封装发送给最后一跳路由器的组播组成员并根据单播路由向信源发送Join报文,沿途的路由器都会形成(S,G)表项,通过两棵树的拼接形成从信源到组播组成员的完整链路;与此同时RP会给第一跳路由器发送Register-stop报文,第一跳路由器开始发送流量,当流量到达最后一跳路由器,最后一跳路由器有一个阈值(思科默认为0kbps),超过后自动切换成源树(share tree),最后一条路由器向信源发送Join报文;如果中间路由器到信源有更优的路径,中间路由器发送 RP-bit prune报文给RP阻塞中间路由器到RP的路径(永久阻塞),中间路由器根据IGP路由选择到达信源的最优路径发送组播流量。

在Spare-mode下,如果有多台第一跳路由去往RP,在收到信源发送的组播流量时,只有DR路由器才能给RP发送Register报文;如果有多台最后一跳路由器,只有选举为DR的那个最后一条路由器才能给RP发送Join报文。

在RPT共享树中,路由器不是基于三层报头的源IP地址的RPF校验,而是基于RP的接口地址进行RPF校验;

静态RP:没有冗余,可能会出现单点故障,不常用;手工配置RP地址 ip pim rp-address+环回口地址,需要在所有PIM的路由器上配置;默认RP选举动态优先级高于静态;后面接override参数才能让静态RP生效。

Auto-RP:思科私有的选举RP的方式,可以实现RP的自动选举、实现冗余备份;可以在中大型网络中使用;Auto-RP定义了两个角色和报文:

▶CRP(RP候选者):想成为RP的路由器,每台路由器都能做。

▶CMA(候选者中继代理):用来判断谁是RP并通告RP消息的路由器。

注:成为CRP或CMA的条件,必须宣告进IGP且接口必须启用任意模式的PIM

▶宣告报文Announce:接口启用CRP的路由器会自动发送Announce报文(源地址:想成为RP接口地址,目的地址:224.0.1.39)给所有邻居,普通路由器不会监听224.0.1.39报文,只有CMA会监听224.0.1.39;如果有多台路由器参选RP,会比较接口地址,接口地址大的路由器会被选举为RP。

▶发现报文Discover:选举出RP后,CMA会给邻居路由器发送Discover报文(源地址:CMA接口地址,目的地址:224.0.1.40),然后邻居路由器会泛洪扩散给域内所有路由器。

▶在Spare模式下,在CRP/CMA是同一台路由器和CRP和CMA直连的情况下,域内选举RP可以成功;对于CRP和CMA不直连的情况,CRP发送Announce报文给邻居时,因为邻居此时不知道RP是谁,会将Announce报文丢弃,RP选举失败。

1、如果想要选举成功,需要将接口模式修改为稀疏密集模式Spare-Dense-mode,接口在Spare模式下无法转发Announce报文,会切换到Dense模式将Announce报文发送给邻居,最终发送给CMA,CMA会将RP信息通过Discover报文发送给域内所有路由器,RP选举成功后正常组播流量会以Spare模式发送。

2.全局配置模式下敲ip pim auto-rp listener (224.0.1.39)敲完这条命令,路由器在收到224.0.1.39的报文会以Dense模式发送,对于其他报文以Spare模式发送。

将接口设置为CRP命令:ip pim send-rp-announce loopback 0 scope 255

将接口设置为CMA命令:ip pim send-rp-discover loopback 0 scope 255

BSR:共有标准的选举RP的方式,可以实现RP的自动选举且切换速度快,支持冗余备份和负载均衡;BSR也定义了两个角色:

▶RP-Candidate:相当于RP候选者

▶C-BSR:相当于候选者中继代理

▶在BSR环境中,由于候选RP单播发送RP通告给BSR;所以是先选举BSR;BSR初始通告延迟为130s,在初始延迟时间内,BSR不会发送任何报文,而是监听有没有其他的BSR存在,其他BSR周期性(60s)发送BSR通告,想成为BSR的路由器通过PK选举出C-BSR(先PK优先级,以小为优;优先级一样PK接口地址,以大为优),C-BSR周期性60S/次(2.5倍hold时间)发送BSR通告,通告目的地址为224.0.0.13(PIM的hello地址),内容包含BSR接口地址、BSR优先级、BSR计时器和RP-SET(所有候选RP的信息,初始为空)。

▶收到BSR通告的路由器会先进行RPF校验:

1.查看单播路由表去往BSR路由的出接口是否是接收BSR通告的入接口。

2.查看去往BSR单播路由的下一跳地址和接收BSR通告三层报头源IP地址是否一致,如果校验成功,则接收BSR报文并通过其他接口产生对应的BSR通告并发出;如果不一致,则丢弃。

▶RP的选举:收到BSR通告的路由器会根据最长匹配原则、比较优先级,以小为优、比较RP接口地址,以大为优;Auto-RP由CMA确定RP,BSR是由各自选举出适合自己的RP,以实现RP的负载均衡。

(Route-config)# ip pim rp-candiate loopback 0 priority

(Route-config)# ip pim bsr-candiate loopback 0 priority

(route)# Show ip pim bsr-router

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值