IPv4+IPv6+DHCP

因特网的网络层有三个主要组件,第一个组件是IP协议,第二个组件是路由选择部分,这决定了数据报从源到目的地所流经的路径。第三个组件是报告数据报中的差错和对某些网络层信息请求进行响应的设施,这涉及到互联网控制报文协议(ICMP)。

网络层的内部视图如下:
在这里插入图片描述
而网际协议(IP)又有两个重要组件,它们是因特网编址和转发。目前有两个版本的IP在使用,广泛部署的IP协议是版本4的IP协议,通常被称为IPv4,而现在用来大规模替代IPv4的是IPv6。

一、IPv4数据报格式

IP共有两种格式,即IPv4和IPv6,首先介绍下IPv4(IP protocol version 4)。

IPv4数据报的格式如图4.16所示:
在这里插入图片描述
关键字段解释如下:

  • 版本(Version):这4比特规定了数据报的IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。不同的IP版本使用不同的数据报格式,IPv4版本的数据报如图4.16所示。
  • 首部长度:因为一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),故需要用这4比特来确定IP数据报中数据部分实际从哪里开始。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部。
  • 服务类型:服务类型(type of service,TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报(例如,一些特别要求低时延、高吞吐量或可靠性的数据报)能够相互区别开来。
  • 数据报长度:这是IP数据报的总长度(首部加上数据),以字节计。因为该字段长为16比特,所以IP数据报的理论最大长度为65535字节。然而,数据报很少有超过1500字节的。
  • 标识、标志、片漂移(Identifier,flags,fragmentation offset):这三个字段和IP分片有关,但是注意新版本的IP(IPv6)不允许在路由器上对分组分片。
  • 寿命:(Time-To-LIve,TTL)寿命字段用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环。每当数据报由一台路由器处理时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃。
  • 协议:该字段仅在一个IP数据报到达其最终目的地才会有用。它指示了IP数据报的数据部分应该交给哪个特定的运输层协议。例如,值为6表示数据部分要交给TCP,而值为17表明数据要交给UDP。
  • 首部检验和:首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。
  • 源和目的IP地址:当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段中插入其最终目的地地址。通常源主机通过DNS查找来决定目的地址。
  • 选项:选项字段允许IP首部被拓展,但是对选项的处理可能十分复杂且耗费时间。在IPv6首部中已经去掉了IP选项。
  • 数据(payload,有效载荷):在大多数情况下,IP数据报中的数据字段包含要交付给目的地的运输层报文段(TCP或者UDP)。然而,该数据字段也可承载其他类型的数据,如ICMP报文。

注意一个IP数据报有总长为20字节的首部(假设无选项)。如果数据报承载一个TCP报文段,则每个(无分片的)数据报共承载了总长40字节的首部(20字节的IP首部加上20字节的TCP首部)以及应用层报文。

二、IPv4数据报分片

不同链路层协议能承载的最大网络层数据报的大小是不同的。链路层帧能够承载的最大数据量称为MTU(maximum transmission unit)。因为每个IP数据报都被装入链路层帧进行运输,链路层协议的MTU对IP数据报附加了一个严格的限制。这个限制带来的问题并不在于限制大小本身,而是因为路由路线上每个发送者和接收者都可能使用不同的链路层协议,并且每个协议可能有着不同的MTU。

用一个例子来理解,假设我们是一个连接了几个链接的路由器,每个链接都运行不同的链路层协议,有着不同的MTU。假设我们从一个链接处接收到了一个IP数据报。我们需要检查转发表(forwarding table)来决定送出链接,但是这个送出链接的MTU小于IP数据报的大小。现在我们需要将IP数据报中的有效载荷分成两个或更多的小IP数据报,将每个更小的IP数据报封装进入单独的链路层帧中,然后将这些链路层帧发放到送出链接中。这些每个较小的IP数据报被称为片(fragment)。

片在到达目的地址的传输层前要进行组装。事实上,TCP和UDP都希望从网络层中收到完整的、未分片的数据段。IPv4的设计者从简便和性能方面进行考虑,将组装片的工作放在终端系统而不是网络路由器中进行。

当一个目的主机从相同的源接收到一系列数据报,它需要判断这些数据报中是否有一些是一些初始的、更大的数据报的分片。如果一些数据报是片,那么目的主机还需要判断它什么时候收到这些片的最后一个以及如何将它收到的片组装成一个数据报。为了使得终端主机能够成功执行这个任务,IPv4的设计者在IP数据报首部使用了标识、标志和片漂移这几个字段。当创建一个IP数据报时,发送主机会对数据报设定一个标识数、发送地址和目的地址。通常来讲,发送主机会逐渐随着发送数据报增大标识数。当一个路由器需要对数据报分片时,每个片都会有原数据报的源地址、目的地址及标识数。当终端主机收到了一个相同源主机发送的一系列数据报后,它可以检测标识数来判断这些数据报是否是同一个数据报的片。因为IP是不可靠的,数据报中的一个或多个可能永远不到达重点。出于这一点,为了让目的主机能够确保它收到了初始数据报的最后一片,最后一片的标志位被设置为0,其他的片标志位被设置为1。同样,为了让目的主机能够确认是否有片缺失(同时也确保能够用正确的顺序组装片),偏移字段被用来指定片在初始数据报中的位置。

三、IPv4编址

首先简述下主机与路由器连入网络的方法:一台主机通常只有一条链路连接到网络,当主机中的IP想发送一个数据报时,它就在该链路上发送,主机与物理链路之间的边界叫做接口(interface)。对于一台路由器而言,因为它的的任务是从链路上接受数据报并从其他链路转发出去,所以路由器必须拥有两条或更多条链路与它连接。因为每台主机与路由器都能发送和接受IP数据报,所以IP协议要求每台主机和路由器接口拥有自己的IP地址。因此,一个IP地址技术上是与一个接口相关联的,而不是与包括该接口的主机或路由器相关联的。

每个IP地址长度为32比特(等价为4字节),因此总共有 2 32 2^{32} 232个可能的IP地址。由于 2 10 2^{10} 210近似地表示 1 0 3 10^3 103,故容易看出约有40亿个可能的IP地址。这些地址一般按照点分十进制法(dotted-decimal notation)书写,即地址中的每个字节用它的十进制形式书写,各字节间以句号(点)隔开。例如,考虑IP地址193.32.216.9,193是该地址第一个8比特的十进制等价数,32是该地址的第二个8比特的十进制等价数,依次类推。地址193.32.216.9的等价二进制记法是:11000001 00100000 11011000 00001001

在全球因特网中的每台主机和路由器上的每个接口,必须有一个全球唯一的IP地址(在NAT后面的接口除外)。然而,这些地址不能随意地自由选择。一个接口的IP地址的一部分需要由其连接的子网来决定。

图4.18是一个IP编址与接口的例子:
在这里插入图片描述
在该图中,一台路由器(具有三个接口)用于互联7台主机。首先观察下分配给主机和路由器接口的IP地址,有几点需要注意。图中左上侧部分的3台主机以及它们连接的路由器接口,都有一个形如223.1.1.xxx的IP地址。这就是说,在它们的IP地址中,最左侧的的24比特是相同的。这4个接口也通过一个并不包含路由器的网络互联起来,在这里,我们将这种无路由器连接这些主机的网络表示为一朵云。

用IP的术语来说,互联这3个主机接口与1个路由器接口的网络形成一个子网(subnet)。IP编址为这个子网分配一个地址:223.1.1.0/24,其中的/24记法,可以被称为子网掩码(subnet mask),指示了32比特中的最左侧24比特定义了子网地址。任何要连接到223.1.10/24网络的主机都要求地址具有223.1.1.xxx的形式。图4.19显示了上图中的三个子网:
在这里插入图片描述
一个子网的IP定义并不局限于连接多台主机到一个路由器接口的以太网段。观察图4.20:
在这里插入图片描述
其中显示了3台通过点对点链路彼此互联的路由器。每台路由器有3个接口,每条点对点链路使用一个,而剩下的一个用于直接将路由器连接到一对主机。注意这里总共出现了6个子网,3个子网223.1.1.0/24、223.1.2.0/24和223.1.3.0/24类似于我们在上图中遇到的子网,另外三个子网需要我们注意,它们是223.1.9.0/24,用于连接路由器R1和路由器R2的接口;223.1.8.0/24,用于连接R2与R3;及223.1.7.0/24,用于连接R3与R1。

从上述讨论中我们可以知道,一个具有多个以太网段和点对点链路的组织(如一个公司或学术机构)将具有多个子网,在给定子网上的所有设备都具有相同的子网地址。原则上,不同的子网能够具有完全不同的子网地址,但是在实践中,它们的子网地址通常有许多共同之处。为了理解这一点,我们来看下在全球因特网中是如何处理编址的。

因特网的地址分配策略被称为无类别域间路由选择(Classes Interdomain Routing,CIDR)。CIDR将子网寻址的概念一般化了。和子网寻址一样,32比特的IP地址被划分为两部分,并且也具有点分十进制数形式a.b.c.d/x,其中x指示了地址的第一部分中含有多少比特。这种表示形式下的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀(或网络前缀),一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。在这种情况下,该组织内部的设备的IP地址将共享相同的前缀。

而一个地址的剩余32-x比特可认为是用来区分该组织的内部设备,因为这些设备的前缀都相同。当该组织内部的路由器转发分组时,才会考虑这些比特,这些较低阶的比特可能(或可能不)具有另外的子网结构。

有一个特殊的IP地址,这就是255.255.255.255,它被称为IP广播地址。当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所有主机。路由器也会有选择地向临近的子网转发该报文(虽然它们通常不这样做)。

在了解了编址方式后,我们需要知道主机和子网如何首次获取它们的地址。接下来介绍下一个组织如何为它的设备获取一块地址,以及一个设备(例如一台主机)是如何在组织获取的地址快中获取一个地址的。

3.1 获取一块地址

为了获取一块IP地址用于一个组织的子网,网络管理员可以首先与他的ISP联系,该ISP可能会从已分配给它的更大的地址块中提供一小块地址。例如,该ISP也许自己被分配了地址块200.23.16.0/20。该ISP可以依次将地址块分成8个大小相等的连续地址块,为本ISP支持的最多8个组织中的一个分配这些地址块中的一块。

那么ISP本身是怎么获得IP地址的呢?其实存在着一个全球性的权威机构,它具有管理IP地址空间并向各ISP和其他组织分配地址块的最终责任,这个机构叫做因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers,ICANN),管理规则基于[RFC 2050]。非营利的ICANN组织的作用不仅是分配IP地址,还管理DNS根服务器。它还有一项容易引起争议的工作,即分配域名与解决域名纷争。ICANN向区域性因特网注册机构(如ARIN、RIPE、APNIC和LACNIC)分配地址,这些机构一起形成了ICANN的地址支持组织,处理本地域内的地址分配/管理。

3.2 获取主机地址:DHCP

某组织一旦获得了一块地址,它就可为本组织内的主机与路由器接口逐个分配IP地址。系统管理员通常手工配置路由器中的IP地址(常常在远程通过网络管理工具进行配置)。主机地址也能手动配置,但这项任务通常都是使用动态主机配置协议(Dynamic Host Configuration,DHCP)来完成。DHCP允许主机自动获取(被分配)一个IP地址。网络管理员能够配置DHCP,以使某给定主机每次与网络连接时能得到一个相同的IP地址;或者得到一个临时的IP地址,该地址在每次与网络连接时也许是不同的。除了主机IP地址分配外,DHCP还允许一台主机得知其他信息,例如它的子网掩码,它的第一跳(first-hop)路由器地址(常称为默认网关,default gateway)与它的本地DNS服务器的地址。

由于DHCP具有能将主机连接进一个网络的网络相关方面的自动能力,故它又常被称为即插即用协议。DHCP还广泛地使用于住宅因特网接入网与无线区域网中,其中的主机频繁地加入和离开网络。例如,考虑一个学生带着便携机从宿舍到图书馆再到教室。很有可能在每个位置,这个学生将连接到一个新的子网,因此在每个位置都需要一个新的IP地址。DHCP在此情形下是最理想的方法,因为有许多用户来来往往,仅在有限的时间内需要地址。类似地,DHCP在住宅ISP接入网中是有用的,举一个例子:一个住宅区ISP有2000各客户,但不会有超过400个客户同时在线。在这种情况下,动态地分配地址的DHCP服务器不需要一个含2048个地址的块,而仅需一个含512个地址的块(例如像形式为a.b.c.d/23的块)。当主机加入或离开时,DHCP服务器要更新其可用的IP地址表。每当一台主机加入时,DHCP服务器从其当前可用的地址池中分配一个任意的地址给它;每当一台主机离开时,其地址便被收回这个池中。

DHCP是一个客户-服务器协议。客户通常是新到达的主机,它要获得包括自身使用的IP地址在内的网络配置信息。在最简单的场合下,每个子网将具有一台DHCP服务器。如果在某子网中没有服务器,则需要一个DHCP中继代理(通常是一台路由器),这个代理知道该网络的DHCP服务器的地址。图4.23显示了连接到子网223.1.2/24的一台DHCP服务器:
在这里插入图片描述
在这个网络中具有一台提供中继代理服务的路由器,它为连接到子网223.1.1/24和223.1.3/24的客户提供DHCP服务。

对于一台新到达的主机而言,针对上图的网络设置,DHCP协议是一个4个步骤的过程,如图4.24所示。在这幅图中,yiaddr代表被分配给该新到达客户的地址。
在这里插入图片描述
这4个步骤是:

  • DHCP服务器发现: 一台新到主机的首要任务是发现一个要与其交互的DHCP服务器,这可通过使用一个DHCP发现报文来完成,客户在UDP分组中向端口67发送该发现报文。此时主机不知道它所连接网络的IP地址,也不知道用于该网络的DHCP服务器地址。因此,DHCP客户生成包含DHCP发现报文的IP数据报时使用广播目的地址255.255.255.255并且使用”本主机“源地址0.0.0.0。DHCP客户将该数据报传递给链路层,链路层接下来将该帧广播到所有与该子网相连的子网。
  • DHCP服务器提供: DHCP服务器收到一个DHCP发现报文时,用一个DHCP提供报文向客户做出响应,仍然使用广播地址255.255.255.255。因为在子网中可能有几个DHCP服务器,该客户也许会发现它处于能在几个提供者之间进行选择的优越位置。每台服务器提供的报文包含有收到的发现报文的事务ID(transaction ID)、向客户推荐的IP地址、网络掩码以及IP地址租用期,即IP地址有效的时间量,服务器租用期通常设置为几小时或几天。
  • DHCP请求: 新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用一个DHCP请求报文进行响应,回应配置参数。
  • DHCP ACK: 服务器用DHCP ACK报文对DHCP请求进行响应,证实所需要的参数。

一旦客户收到DHCP ACK后,交互便完成了,并且该客户能够在租用期内使用DHCP分配的IP地址。因为客户可能在该租用期超时后还希望使用这个地址,所以DHCP还提供了一种机制以允许客户更新它对一个IP地址的租用。

DHCP的即插即用的特性使得网络管理员省去了手动配置IP的过程,然而,从移动性角度看,DHCP也有其不足之处。因为每当结点连到一个新子网时,要从DHCP得到一个新的IP地址,当一个移动结点在子网之间移动时,就不能维持与远程应用之间的TCP连接。有关DHCP的其他细节可在[Droms 2002]与[dhc 2012]中找到。一个DHCP的开放源码参考实现可从因特网系统协会[ISC 2012]得到。

3.3 网络地址转换

我们从NAT(Network Address Translation,网络地址转换)使能路由器的工作过程出发,来介绍NAT。

图4.25显示了一台NAT使能路由器的运行情况:
在这里插入图片描述
位于家中的NAT使能路由器有一个接口,该接口是图中右侧所示家庭网络的一部分,这个家庭网络的编址方式是10.0.0/24。地址空间10.0.0.0/8是在[RFC 1918]中保留的3部分IP地址空间之一,这些地址用于图中的家庭网络等专用网络或具有专用地址的地域(realm)。具有专用地址的地域是指其地址仅对该网络中的设备有意义的网络,比如,有数十万的家庭网络,而且许多的家庭网络都使用了相同的地址空间10.0.0.0/24。在一个给定家庭网络中的设备能够使用10.0.0.0/24编址彼此发送分组,然而,转发到家庭网络之外进入更大的全球因特网的分组显然不能再使用这些地址(或作为源地址,或作为目的地址),因为有数十万的网络使用这块地址,势必会产生重复,并导致冲突。这也就是说,10.0.0.0/24地址仅在给定的网络中才有意义。但是如果专用地址仅在给定的网络中才有意义的话,当向全球因特网发送或接收分组时,怎样使得IP地址唯一呢?在这种情况下NAT就发挥了作用。

NAT使能路由器对于外部世界来说甚至不像一台路由器,NAT路由器对外界的行为就如同一个具有单一IP地址的单一设备,在上图中,所有离开家庭路由器流向更大因特网的报文都拥有一个源IP地址138.76.29.7,且所有进入家庭的报文都拥有同一个目的地址138.76.29.7。从本质上讲,NAT使能路由器对外界隐藏了家庭网络的细节(路由器从ISP的DHCP服务器得到它的IP地址,并且路由器运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间中的计算机提供地址)。

因为从广域网到达NAT路由器的所有数据报都具有相同的目的IP地址,所以我们需要一种方式来知道它应将某个分组转发给哪个内部主机,这里需要使用的技巧是NAT路由器上的一张NAT转换表,在这个表中包含了一些端口号和IP地址。

还是以上图为例,假设一个家庭主机10.0.0.1请求IP地址为128.119.40.186的某台Web服务器(端口80)上的一个Web页面。主机10.0.0.1为其指派了(任意)源端口号3345并将该数据报发送到LAN中。NAT路由器收到该数据报,为该数据报生成一个新的源端口号5001,将源IP替代为其广域网一侧接口的IP地址138.76.29.7,并且将源端口号替换为新端口5001。当生成一个新的源端口号时,NAT路由器可选择任意一个当前未在NAT转换表中的源端口号。路由器中的NAT此时也在它的NAt转表中增加一个表项。Web服务器并不知道刚到达的包含HTTP请求的数据报已被NAT路由器进行了改变,它会发送一个响应报文,其目的地址是NAT路由器的IP地址,其目的端口是5001。当该报文到达NAT路由器时,路由器使用目的IP地址与目的端口号从NAT转换表中检索出家庭网络浏览器使用的适当IP地址(10.0.0.1)和目的端口号(3345)。于是,路由器改写该数据包的目的IP地址与目的端口号,并向家庭网络转发该数据报。

四、IPv6

由于新的子网和IP结点以惊人的增长率连到因特网上(并被分配唯一的IP地址),32比特的IP地址空间即将用尽。为了应对这种对大IP地址空间的需求,开发了一种新的IP协议,即IPv6。IPv6的设计者们还利用这次机会,在IPv4积累的运行经验基础上加进和强化了IPv4的其他方面。

4.1 IPv6数据报格式

IPv6数据报格式如图4.26所示:
在这里插入图片描述
IPv6中引入的最重要的变化显示在其数据报格式中:

  • 扩大的地址容量:IPv6将IP地址长度从32比特增加到了128比特。这就确保了全世界将不会用尽IP地址。现在,地球上的每个沙砾都可以用IP地址寻址了。除了单播与多播地址以外,IPv6还引入了一种称为任播地址(anycast address)的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。
  • 简化高效的40字节首部:如下讨论的那样,许多IPv4字段已被舍弃或作为选项。因而所形成的40字节定长首部允许更快地处理IP数据报。一种新的选项编码允许进行更灵活的选项处理。
  • 流标签与优先级:IPv6有一个难以琢磨的流(flow)定义。RFC 1752与RFC 2460中描述说,该字段可用于”给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流“。例如,音频与视频传输就可能被当作一个流。在另一方面,更为传统的应用(如某些为使其流量得到更好服务而付费的用户)承载的流量也有可能被当作一个流。然而,IPv6的设计者们显然已预见到最终需要能够区分这些流,即使流的确切含义还未完全确定。IPv6首部中还有一个8比特的流量类型字段,该字段就像IPv4中的TOS字段,可用于给出一个流中某些数据报的优先级,以便指明某些应用的数据报(如ICMP分组)比其他应用的数据报(如网络新闻)有更高的优先权。

如上所述,比较图4.26和图4.16就可以看出,IPv6数据报的结构更简单、更高效。以下是在IPv6中定义的字段:

  • 版本:该4比特字段用于标识IP版本号。IPv6将该字段设为6.注意到将该字段设置为4并不能创建一个合法的IPv4数据报。
  • 流量类型:该8比特字段与我们在IPv4中看到的TOS字段的含义相似。
  • 流标签:如上面讨论的,该20比特的字段用于标识一条数据报的流。
  • 有效载荷长度:该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量
  • 下一个首部:该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP或UDP)。该字段使用与IPv4首部中协议字段相同的值。
  • 跳限制:转发数据报的每台路由器将对该字段的值减1.如果跳限制计数到达0时,则该数据报将被丢弃
  • 源地址和目的地址:IPv6 128比特地址的各种格式在RFC 4291中进行了描述
  • 数据:这是IPv6数据报的有效载荷部分。当数据报到达目的地址时,该有效载荷就从IP数据报中移出,并交给在下一个首部字段中指定的协议处理

以上说明了IPv6数据报中包括的各字段的用途。图4.26中的IPv6数据报格式与图4.16中的IPv4数据报格式进行比较,我们可以发现,在IPv4数据报中出现的几个字段在IPv6数据报中已不复存在:

  • 分片/重新组装:IPv6不允许在中间路由器上进行分片与重新组装。这种操作只能在源与目的地上执行。如果路由器收到的IPv6数据报因太大而不能转发到出链路上的话,则路由器只需丢掉该数据报,并向发送方发回一个分组太大的ICMP差错报文即可。于是发送方能够使用较小长度的IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中,大大加快了网络中的IP转发速度。
  • 首部检验和:因为因特网层中的运输层(如TCP与UDP)和数据链路层(如以太网)协议执行了检验操作,IP设计者大概觉得在网路层中具有该项功能实属多余,可以将其去掉。再次强调的是,快速处理IP分组是关注的重点。由于IPv4首部中包含有一个TTL字段,所以在每台路由器上都需要重新计算IPv4首部检验和。就像分片与重新组装一样,在IPv4中这也是一项耗时的操作。
  • 选项:选项字段不再是标准IP首部的一部分了。但它并没有消失,而是可能出现在IPv6首部中由”下一个首部“指出的位置上。这就是说,就像TCP或UDP协议首部能够是IP分组中的”下一个首部“,选项字段也能是”下一个首部“。删除选项字段使得IP首部成为定长的40字节。

IP节点使用ICMP协议来报告差错情况,并向端系统提供有限的信息(如对一个ping报文的回显回答)。RFC 4443中定义了一种用于IPv6的新版ICMP。除了能识别现存的ICMP类型和编码定义外,由于IPv6新增功能的需要,ICMPv6还增加了新的类型和编码。其中包括”分组太大“类型与”未识别的IPv6选项“错误编码。另外,ICMPv6还包含了因特网管理协议(IGMP)。IGMP用于管理主机加入和离开多播组,它在IPv4中曾是一个与ICMP分开的独立协议。

4.2 从IPv4到IPv6的迁移

//待补充 249

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值