计算机网路——自顶向下的网络层

一、网络层协议原理

1.1 转发与路由
  网络层的作用从表面上看极为简单,即将分组从一台发送主机移动到一台接收主机。为此,需要使用两种重要的网络层功能,即转发路由。转发指的是当一个分组到达某路由器时的一条输入链路时,该路由器必须将该分组移动到适当的输出链路,通常用硬件实现;路由指的是分组从发送方流向接收方时,分组路径的决定策略,通常由软件实现。网络层传输的分组称为数据报【Data gram】。

1.2 网络层服务模型
  网络层服务模型可以分为无连接服务连接服务。无连接服务不事先为系列分组的传输确定传输路径,由路由算法决定;而连接服务为系列分组的传输确定从源到目的经过的路径,并在传输结束后拆除连接。
  因特网的网络层提供了单一的服务,称为尽力而为的服务,不保证顺序、时延等。


二、IP

2.1 IPv4数据报格式
  当今因特网网络层的关键协议是网际互连协议【Internet Protocol,IP】,其中广泛部署的是IP版本4【IP version 4,IPv4】。其数据报格式如下
IPv4

其中:
  -版本号字段占4位,用IP协议的版本填充,如IPv4为0100,IPv6为0110;
  -首部长度字段描述了IP分组首部的长度,以4Byte为单位;
  -服务类型(TOS)字段占8位,指示期望获得的服务类型,一般情况下不使用,置为00H;
  -总长度字段描述了IP分组的总字节数,使用16位,故最大的IP分组为65535Byte,而最小分组要使用20Byte,故IP分组可以封装的最大数据为65515Byte;
  -标识、标志位、片偏移与IP数据报分片有关;
  -生存时间【Time-to-Live,TTL】字段指示了IP分组可以在网络中通过的跳步数,即路由器数。每当路由器转发一次分组,TTL减少1,直至TTL为0,路由器将丢弃该IP分组;
  -协议字段占8位,指示了IP分组封装的数据使用的协议,其中,TCP为6,UDP为17;
  -首部校验和字段实现IP分组首部的差错校验,在计算校验和时该字段置0;
  -源IP地址与目的IP地址各占32位,分别表示了发送分组与接收分组的主机的IP地址。

2.2 IPv4数据报分片
  网络的链路存在数据帧可封装数据的上限,称为最大传输单元【Maximum Transmission Unit,MTU】。当大的IP分组向较小的MTU链路转发时,需要进行分片,将一个IP分组分为多个,并在到达主机后进行重组。
  IP首部的总长度、标识、标志位和片偏移用于确定分片的相对顺序:
  -标识字段占16位,用于表示一个IP分组,IP协议利用一个计数器,每产生IP分组就使计数器加1,作为该IP分组的标识;
  -标志位字段占3位,包括保留位、DF、MF,DF标志着禁止分片,MF标志着该数据报片不是最后一片;
  -片偏移字段占13位,描述了IP分组分片封装原IP分组数据的相对偏移量,以8byte为单位。
接下来考虑一个IP分组的总长度为 L L L,待转发链路的MTU为 M M M,当 L > M L > M L>M且IP分组的DF标志位置0时,标识可以且需要分片。分片遵循如下原则:
  -分片生成的所有分片的标识都复制原IP分组的标识;
  -除了最后一个分片,其他分片均分为MTU允许的最大分片;
  -最大分片可封装的数据应该是8的倍数。
那么,一个最大分片可封装的数据为 d = ⌊ M − 20 8 ⌋ × 8 d = \lfloor \frac{M - 20}{8} \rfloor × 8 d=8M20×8需要的总片数为 n = ⌈ L − 20 d ⌉ n = \lceil \frac{L - 20}{d} \rceil n=dL20第i片的片偏移字段取值为 F i = d / 8 × ( i − 1 ) F_i = d/8 × (i - 1) Fi=d/8×(i1)每片的总长度字段为 L i = { d + 20 , 1 ≤ i < n L − ( n − 1 ) d , i = n L_i = \left\{\begin{aligned} &d + 20, &&1 \le i < n \\ &L - (n-1)d, &&i = n \\\end{aligned}\right. Li={d+20,L(n1)d,1i<ni=n每片的MF标志位为 M F i = { 1 , 1 ≤ i < n 0 , i = n MF_i = \left\{\begin{aligned} &1, &&1 \le i < n \\ &0, &&i = n \\\end{aligned}\right. MFi={1,0,1i<ni=n
2.3 IPv4编址
  通常情况下,一台主机只有一条链路连接到网络。当主机发送数据报时,就在该链路上发送,而主机与物理链路之间的边界称为接口【Interface】。路由器有多个接口,而主机可能有一或多个接口。
  IPv4通过32比特的标号标识主机与路由器的接口,称为IP地址
  IP地址可以划分为高位的网络号与低位的主机号。IP地址具有相同网络号的设备接口称为IP子网,一般的IP子网不跨越路由器,同一IP子网下的设备彼此物理联通。

  IP地址根据网络号与主机号的划分分为如下有类IP地址:
  -网络号8位,主机号24位,网络号的高位为0,对应的IP地址为0.0.0.0-127.255.255.255,称为A类地址;
  -网络号16位,主机号16位,网络号的高位为10,对应的IP地址为128.0.0.0-191.255.255.255,称为B类地址;
  -网络号64位,主机号8位,网络号高位为110,对应的IP地址为192.0.0.0-223.255.255.255,称为C类地址;
  -不划分子网,IP地址高位为1110,对应的IP地址为224.0.0.0-239.255.255.255,称为D类地址;
  -不划分子网,IP地址高位为1111,对应的IP地址为240.0.0.0-255.255.255.255,称为E类地址。
此外,还有如下特殊的IP地址:
  -网络号为0,主机号为0,仅可以作为源地址,在未被分配IP地址时子网范围内表示本机;
  -网络号为0,主机号为特定值,仅可以作为目的地址,在不使用网络号的情况下指定子网内的某个特定主机;
  -网络号位全为1,主机号位全为1,仅可以作为目的地址,用于在本网内广播;
  -网络号为特定值,主机号为0,不可以作为任何地址,用于标识某个特定的子网;
  -网络号为特定值,主机号位全为1,仅可以作为目的地址,用于在某个特定的子网内广播;
  -网络号为127,主机号为位不全为0或1的值,可以作为源与目的地址,用于本地软件的环回测试。
此外,还有如下用于内网的私有IP地址:
  -A类地址的网络号为10;
  -B类地址的网络号为176.16-172.31;
  -C类地址的网络号为192.168.0-192.168.255;

  当需要划分一个更小范围的IP子网时,可以将原IP地址主机号的部分比特作为子网号。而为了区分网络号、子网号与主机号,使用子网掩码确定划分方式。子网掩码在网络号与子网号的位取1,而主机号的位取0,例如A类地址的子网掩码为255.0.0.0。
  由于子网掩码的取值方法,将IP地址与子网掩码按位与运算,即可得到子网地址。

2.4 路由聚合
  无类域间路由【Classless Inter-Domain Routing,CIDR】不使用有类地址,通过融合子网地址与子网掩码,完成子网划分,其显式的划分了IP地址,直接将网络号与子网号的位数标注在IP地址之后,例如 201.2.3.64 , 255.255.255.192 = 201.2.3.64 / 26 201.2.3.64, 255.255.255.192 = 201.2.3.64/26 201.2.3.64,255.255.255.192=201.2.3.64/26表示改地址的前26位为子网号,即200.23.16.0。
  CIDR一方面提高了IPv4地址空间的分配效率,另一方面可以将多个子网聚合为一个较大的子网,提高路由的效率,称为路由聚合
  在路由聚合的情况下,IP地址组织成了层次结构;当路由聚合的子网发生中断时,单独IP与子网IP均发布路由信息,采用最长前缀匹配优先的准则,从而可以正确的选择IP。考虑聚合子网1的聚合地址为 S n 1 = { 200.23.16.0 / 23 , 200.23.20.0 / 23 , 200.23.22.0 / 23 , . . . , 200.23.30.0 / 23 } Sn_1 = \{200.23.16.0/23, 200.23.20.0/23, 200.23.22.0/23, ..., 200.23.30.0/23\} Sn1={200.23.16.0/23,200.23.20.0/23,200.23.22.0/23,...,200.23.30.0/23}而聚合子网2的聚合地址为 S n 2 = { 200.23.18.0 / 23 } Sn_2 = \{200.23.18.0/23\} Sn2={200.23.18.0/23}其中,聚合子网1会将其集合内的子网描述为 S n 1 = 200.23.16.0 / 20 Sn_1 = 200.23.16.0/20 Sn1=200.23.16.0/20,而 S n 2 = 200.23.18.0 Sn_2 = 200.23.18.0 Sn2=200.23.18.0,其位信息有 S n 1 = 11001000.00010111.00010000.00000000 S n 2 = 11001000.00010111.00010010.00000000 Sn_1 = 11001000.00010111.00010000.00000000 \\ Sn_2 = 11001000.00010111.00010010.00000000 Sn1=11001000.00010111.00010000.00000000Sn2=11001000.00010111.00010010.00000000当目的地址为200.23.18.0/23的分组路由时,尽管两个聚合子网的前缀都符合,但是相比于聚合子网1,聚合子网2有着更长的与IP分组目的地址匹配的前缀,故将该分组发往聚合子网2。

2.5 DHCP
  主机获得IP地址的方式包括静态配置与动态配置。静态配置即硬编码,人为的指定IP地址;而动态配置使用动态主机配置协议【Dynamic Host Configuration Protocal,DHCP】,从服务器动态的获取IP地址、子网掩码、默认网关、DNS服务器的名称及其IP地址。DHCP允许了地址的重用,并支持地址续租与移动用户的接入。
  DHCP协议的步骤如下:
  -主机在子网内广播DHCP发现报文,其字段为src0.0.0.0,dst255.255.255.255,yiaddr0.0.0.0;
  -DHCP服务器利用DHCP提供报文进行响应,其字段为src服务器源地址,dst255.255.255.255,yiaddr动态地址;
  -主机向与其响应的DHCP服务器请求IP地址,发送DHCP请求报文,其字段为src0.0.0.0,dst255.255.255.255,yiaddr动态地址;
  -DHCP服务器为其分配IP地址,回复DHCP确认报文,其字段为src服务器地址,dst255.255.255.255,yiaddr动态地址,以及子网掩码、默认网关以及DNS服务器地址。
  DHCP协议在应用层实现,其将报文封装到UDP数据报中,通过IP进行链路层广播。

2.6 NAT
  内网地址为私有网址,其不允许进入互联网。网络地址转换【Network Address Translation,NAT】协议将所有的源IP替换为相同的NAT IP地址,为NAT路由器输出端口的IP地址,并为不同的主机分配不同的端口号。NAT使得本地网络设备对互联网不可见。
  NAT协议的步骤如下:
  -使用NAT IP地址替换每个进入互联网的IP数据报的源IP地址与源端口号;
  -将NAT IP地址与IP地址及端口号的替换信息储存到NAT转换表中;
  -根据NAT转换表,将进入内网的IP数据报的NAT IP地址替换回原源IP地址与源端口号。

  考虑这样的场景,客户期望连接内网地址为10.0.0.1的服务器,但是由于内网对互联网不可见,客户不能直接访问该服务器。该问题称为NAT穿透问题,可以静态配置NAT,使得某个特定的访问直接转发给特定的服务器;或利用互联网网关设备协议自动配置,学习特定的访问;或使用中继,令内网的服务器及客户同时与互联网的中继服务器建立连接。

2.7 ICMP
  互联网控制报文协议【Internet Control Message Protocol,ICMP】支持主机与路由器进行差错报告与网络探询。在发生某种错误时,主机或路由器就会生成并发送一个ICMP报文以指示该错误。
  ICMP报文通常认为是IP的一部分,但是从体系结构上讲其似乎位于IP之上,因为ICMP报文承载在IP分组中,作为IP的有效载荷。其报文格式为
在这里插入图片描述
其数据字段由IP首部与差错IP报文的载荷的前8byte组成。其类型、编码与具体描述为
在这里插入图片描述
并且有如下情况不发送ICMP差错报告:
  -ICMP差错报告报文发生差错;
  -除了第1个IP数据报分片发送错误报告后的剩余片差错;
  -多播IP数据报差错;
  -特殊地址的IP数据报差错;

2.8 IPv6
  由于新的子网和IP节点以惊人的增长率连接到互联网上,32位的IP地址空间即将用尽,并且IPv4有待加强,使得IP版本6【IP version 6,IPv6】被开发出来。
  IPv6的数据报格式为
IPv6
其中,IPv6的最大有效载荷为64K,下一首部字段标识了有效载荷中使用的传输层协议。
  IPv6的地址形式将32位用分号分割为8段每4位一段的地址,并且可以与IPv4转换,例如13.1.68.3的IPv6地址为0:0:0:0:0:FFFF:13.1.68.3。IPv6不再使用子网掩码,而是用CIDR,并且在ULR中使用使用中括号标识IPv6地址。
  IPv4到IPv6的迁移使用隧道,在IPv6路由器之间使用IPv6数据报,而在IPv4路由器之间将IPv6的数据报作为IPv4数据报的载荷。


三、路由算法
  路由算法的关键问题是最小代价路径,分为静态路由,由人工配置;与动态路由,由算法动态决定,并及时响应链路的代价与拓扑变化。

3.1 链路状态路由算法
  链路状态路由算法基于贪心算法的迪科斯彻【Dijkstra】算法,要求所有结点掌握网络拓扑与链路费用。考虑将网络抽象为带权有向图 G = ( V , E ) G = (V, E) G=(V,E),以 v 1 v_1 v1为原点,使用数组 D D D记录 v 1 v_1 v1 v i v_i vi的最短路径长度, P P P记录 v 1 v_1 v1 v i v_i vi的最短路径上经过的顶点, C C C记录顶点之间的权,其算法步骤形如
  1.将 V V V分为最短路径已经确定的顶点集合 S S S与未确定的顶点集合 V − S V - S VS,并初始化 S = v 0 S = {v_0} S=v0 P [ i ] = 1 P[i] = 1 P[i]=1 D [ i ] = C [ 1 ] [ j ] D[i] = C[1][j] D[i]=C[1][j]
  2.在 V − S V - S VS选取顶点 w w w,使得 w w w v 0 v_0 v0的距离最小,即 D [ w ] = m i n { D [ i ] ∣ i ∈ V − S } D[w] = min\{D[i]|i \in V-S\} D[w]=min{D[i]iVS}从而, v 0 v_0 v0到达 w w w仅通过 S S S的点,且是一条最短路径,并将 w w w加入 S S S
  3.更新 D [ v ] , v ∈ V − S D[v], v \in V - S D[v],vVS,有 D [ v ] = m i n { D [ v ] , D [ w ] + C [ w ] [ v ] } D[v] = min\{D[v], D[w] + C[w][v]\} D[v]=min{D[v],D[w]+C[w][v]} P [ v ] = w P[v] = w P[v]=w
  4.迭代2-3,直到 S = V S = V S=V D D D便记录了最短路径长度, P P P记录了最短路径。
由于链路是实时变化的,链路状态路由算法可能存在震荡。

3.2 距离向量路由算法
  距离向量路由算法基于动态规划,如果令 D [ x ] [ y ] D[x][y] D[x][y]是结点 x x x y y y的最短路径,那么有动态规划方程 D [ x ] [ y ] = m i n v { C [ x ] [ i ] + D [ i ] [ y ] } D[x][y] = min_v \{ C[x][i] + D[i][y] \} D[x][y]=minv{C[x][i]+D[i][y]}称为结点 x x x距离向量【Distance vector,DV】。
  对于结点 x x x,其已知到达所有邻近点的代价 c ( x , v ) c(x, v) c(x,v),同时维护所有邻近点的DV。那么,距离向量路由算法的核心思想为每个结点不定时的将自己的DV发送给邻近点,当结点受到新的DV时根据动态规划方程更新自己的DV,那么最终所有节点的DV将收敛于实际的最小代价。
  距离向量路由算法是异步迭代算法,在局部链路代价改变或有来自邻近点的DV更新时,才发起自己的DV更新,并在DV发生改变时告知邻近点。其算法步骤形如
  1.初始化DV估计值,告知邻近点;
  2.进入等待状态,直到本地局部链路更新或者有来自邻近点的DV更新;
  3.重新计算DV估计值,并在有变化时告知邻近点;
  4.迭代2~3。

  考虑网络有三个节点 x x x y y y z z z,其中 c ( x , y ) = 4 c(x, y) = 4 c(x,y)=4 c ( x , z ) = 50 c(x, z) = 50 c(x,z)=50 c ( y , z ) = 1 c(y, z) = 1 c(y,z)=1,那么在收敛时,结点分别维护了 D [ x ] [ y ] = 4 D [ x ] [ z ] = 5 D [ y ] [ z ] = 1 D[x][y] = 4\\ D[x][z] = 5\\ D[y][z] = 1 D[x][y]=4D[x][z]=5D[y][z]=1当局部链路发生变化时,取 c ( x , y ) = 1 c(x, y) = 1 c(x,y)=1,考虑 y y y结点与 z z z结点的相互告知,那么会发生如下情况:
  -结点 y y y检测到局部链路变化,通过动态规划方程更新 D V [ y ] [ x ] = m i n { c ( y , x ) , c ( y , z ) + D [ z ] [ x ] } = 1 D V [ y ] [ z ] = m i n { c ( y , z ) , c ( y , x ) + D [ x ] [ z ] } = 1 DV[y][x] = min\{ c(y, x), c(y, z) + D[z][x]\} = 1\\ DV[y][z] = min\{ c(y, z), c(y, x) + D[x][z]\} = 1 DV[y][x]=min{c(y,x),c(y,z)+D[z][x]}=1DV[y][z]=min{c(y,z),c(y,x)+D[x][z]}=1由于DV发生改变,告知邻近点;
  -结点 z z z收到告知并更新 D V [ z ] [ x ] = m i n { c ( z , x ) , c ( z , y ) + D [ y ] [ x ] } = 2 D V [ z ] [ y ] = m i n { c ( z , y ) , c ( z , x ) + D [ x ] [ y ] } = 1 DV[z][x] = min\{ c(z, x), c(z, y) + D[y][x]\} = 2\\ DV[z][y] = min\{ c(z, y), c(z, x) + D[x][y]\} = 1 DV[z][x]=min{c(z,x),c(z,y)+D[y][x]}=2DV[z][y]=min{c(z,y),c(z,x)+D[x][y]}=1由于DV发生改变,告知邻近点;
  -结点 y y y收到告知并更新DV,未发生改变,从而告知邻近点。
  再考虑 c ( x , y ) = 60 c(x, y) = 60 c(x,y)=60,考虑 y y y结点与 z z z结点的相互告知,那么会发生如下情况:
  -结点 y y y检测到局部链路变化,通过动态规划方程更新 D V [ y ] [ x ] = m i n { c ( y , x ) , c ( y , z ) + D [ z ] [ x ] } = 6 DV[y][x] = min\{ c(y, x), c(y, z) + D[z][x]\} = 6 DV[y][x]=min{c(y,x),c(y,z)+D[z][x]}=6由于DV发生改变,告知邻近点;
  -结点 z z z收到告知并更新 D V [ z ] [ x ] = m i n { c ( z , x ) , c ( z , y ) + D [ y ] [ x ] } = 7 DV[z][x] = min\{ c(z, x), c(z, y) + D[y][x]\} = 7 DV[z][x]=min{c(z,x),c(z,y)+D[y][x]}=7由于DV发生改变,告知邻近点;
  -结点 y y y检测到局部链路变化,通过动态规划方程更新 D V [ y ] [ x ] = m i n { c ( y , x ) , c ( y , z ) + D [ z ] [ x ] } = 8 DV[y][x] = min\{ c(y, x), c(y, z) + D[z][x]\} = 8 DV[y][x]=min{c(y,x),c(y,z)+D[z][x]}=8由于DV发生改变,告知邻近点;
  -结点 z z z收到告知并更新 D V [ z ] [ x ] = m i n { c ( z , x ) , c ( z , y ) + D [ y ] [ x ] } = 9 DV[z][x] = min\{ c(z, x), c(z, y) + D[y][x]\} = 9 DV[z][x]=min{c(z,x),c(z,y)+D[y][x]}=9由于DV发生改变,告知邻近点;
  -…
可以看出,当代价变优时,DV迅速做出改变;但当代价变差时,DV的迭代缓慢,称为无穷计数问题。其可以使用毒性逆转技术,即令通告者的DV中,其与被通告者的最小代价置为无穷大;或限制最大跳步,在达到跳步最大值后,表明通告双方之间的路径发生了无穷计数问题,而直接置为无穷大。


四、路由协议
  将任意规模网络抽象为图计算路由过于理想化,在大量的路由计算信息交换的过程中,可能会淹没链路。

4.1 自治系统
  聚合路由器为一个区域,称为自治系统【Autonomous systems,AS】,在同一个AS内,路由器运行相同的路由协议算法。AS通过存在于边缘的网关路由器通过链路连接其他AS的网关路由器。
  考虑三个自洽系统 A S 1 AS_1 AS1 A S 2 AS_2 AS2 A S 3 AS_3 AS3,那么 A S 1 AS_1 AS1的内某路由器收到了一个地址不在 A S 1 AS_1 AS1内的数据报, A S 1 AS_1 AS1必须学习到可以通过 A S 2 AS_2 AS2到达的地址与通过 A S 3 AS_3 AS3到达的地址,并将网络可达信息传播给 A S 1 AS_1 AS1的内部路由器; A S 1 AS_1 AS1内的路由器则根据路由算法确定到达特定网关路由器的最佳路径。
  当AS内的分组可以通过多个路径到达外部AS的目的时,使用热土豆路由将分组发送给最近的网关路由器。
  因特网采用了层次路由的架构,其内部使用的路由协议称为内部网关协议【Interior gateway protocols,IGP】。

4.2 RIP
  路由信息协议【Routing Information Protocol,RIP】是一种IGP,其使用距离向量路由算法,并规定
  -最大跳步为15,每一链路为一个跳步,同时携带下一节点信息,从而实现毒性逆转;
  -每隔30s,邻接点之间交换一次DV,称为通告,当180秒未收到通告时认为邻接点或链路失效,重新计算路由并通告给邻接点;
  -每次通告最多有25个目的子网。
RIP的路由表由应用层进程进行管理,通告报文使用UDP数据报发送。

4.3 OSPF
  开放式最短路径优先协议【Open Shortest Path First】是一种IGP,其使用链路状态算法,其报文直接封装在IP数据报中,并向整个AS泛洪。
  相比于RIP,OSPF安全性更高,并且允许使用多条费用相同的路径,针对不同的TOS链路设置度量,并集成单播与多播。
  OSPF支持对大规模的AS继续分层,将AS分为主干区与局部区,使用既属于主干又属于局部的区边界路由器连接,主干区的路由器称为主干路由器,而主干区与外部AS通过AS边界路由器相连。

4.4 BGP
  边界网关协议【Border Gateway Protocol,BGP】是一种AS间的路由协议,其是将因特网整合为整体的关键,其允许子网向因特网的其余部分通过其存在,分为eBGP用于在邻接AS获取子网可达信息;iBGP在AS内部广播子网可达信息。
  两个BGP路由器之间交换BGP报文称为BGP会话,其基于半永久的TCP连接。BGP报文包括:
  -OPEN,建立TCP连接并认证发送方;
  -UPDATE,通告新路径或撤销原路径;
  -KEEPALIVE,在无更新时保持连接或确认认证请求;
  -NOTIFICATION,报告先前报文的差错,或关闭连接。
其通告了去往不同前缀的路径。当 A S 1 AS_1 AS1的网关路由器向 A S 2 AS_2 AS2的路由器发送包含某个前缀的BGP报文时,就意味着 A S 1 AS_1 AS1可以为 A S 2 AS_2 AS2转发数据包到该前缀的子网,并且 A S 1 AS_1 AS1会在通告中聚合网络前缀;同时, A S 2 AS_2 AS2的网关路由器会通过iBGP向 A S 2 AS_2 AS2的所有路由器分发新的前缀可达性信息。
  BGP的路由信息包括前缀与属性,其中属性包括
  -AS-PATH,包含了通告中所经过的AS序列;
  -NEXT-HOP,指向下一跳的AS地址。
  BGP是一种基于策略的路由,其会通过决策来决定是否接收该路由通告,例如对于某期望收益的结点收到了无收益的路由通告,该节点可以拒绝该通告而不提供无收益的抓发。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值