《图解TCP/IP》笔记

《图解TCP/IP》笔记

本文主要包括OSI7层模型,数据链路层相关讲解,IP知识介绍,TCP/UDP知识介绍。
适合Java后端开发等专业学习。
图片来自《图解TCP/IP 第五版》。

网络基础知识

OSI七层协议

分层的原因

  • 层与层之间由统一的接口,"统一"这个词通过协议来保证。因此不同人只要负责好不同层上的应用开发,并遵循协议即可。

分层

  • 应用层
    针对特定应用的协议,比如HTTP

  • 表示层
    设备固有数据格式和网络标准数据格式的转换,比如字符集。

  • 会话层
    通信管理。负责建立和断开通信连接。

  • 传输层
    管理两个节点之间的数据传输,负责可靠传输。TCP。

  • 网络层
    地址管理与路由选择。即从网络地址A到网络地址B。IP。

  • 数据链路层
    互联设备之间传送和识别数据帧。

  • 物理层
    高低电平,网线规格等。

    应用层到物理层,一层一层的添加协议头和该层内容。

具体解释

  • 应用层 传递内容+协议内容,这个方便理解。
  • 表示层 将某个计算机特定的数据格式转化为网络通用的标准数据格式。较为常见的例子是,我用的email客户点的编码格式是UTF-8,但是你用的确实GBK。为了让我们能通信,就需要统一转换,或者标志编码以进行编码、解码工作。
  • 会话层 传递数据的两端主机采用何种顺序传输数据,可以一次连接发送多个,也可以多次连接发送多个。会话层规定了连接方法。会话层不具有传输数据的功能。
  • 传输层 主机A确保与主机B之间的通信并准备发送数据——建立连接。确认连接、断开连接、确保数据到达。确保数据传输的可靠性是传输层的一个重要作用,然而事实上,将数据传输给对端是由网络层完成的。也就是说传输层只在逻辑上保证连接,网络层在物理上保证连接。
  • 网络层 在网络互通的环境中,将数据从发送端主机发送到接收端主机。
  • 数据链路层 数据链路层和网络层是包含的关系,或者说是宏观与微观的关系。网络层中每两个直接连接的主机都是由数据链路层负责,而整个的通讯由网络层控制。网络层负责将整个数据发送给最终目标地址,数据链路层只负责奋发一个分段内的数据。所以交换机是数据链路层,路由器是网路层。
  • 物理层 物理介质之间连接,比如说485,232。相互直连的设备间通过MAC地址连接。

传输方式的分类

  1. 面向有连接型
  • 通信结束前后必须建立和断开连接。闭环方式。
  1. 面向无连接型
  • 发就完了。开环方式。
  1. 电路交换
  • 一条电路、两台机器。通信会独占电路,不利于并发,本质上就是单线程。
  1. 分组交换。
  • 本质上和CPU时间片是一个逻辑。将数据拆分成数据包,所有的计算机一起收发数据,然后将数据发给不同地址。

TCP/IP基础知识

TCP/IP的标准化

TCP/IP实际指的是利用IP进行通信时所必须用到的协议群的统称。

TCP/IP的分层模型

OIS的分层是基于通信协议必要的功能是什么,而TCP/IP强调的是在计算机上实现协议应该开发哪种程序。

  • 应用层
  • 传输层
    让应用程序之间实现通信。
  • 网络层
    IP协议,基于IP地址转发分包数据。此功能通常由操作系统实现。
  • 链路层
    硬件的驱动程序

发送数据包流程——
1.应用层处理,生成数据(应用层),编码(表示层)并建立TCP连接(传输层)。数据包在此时增加HTTP协议头。2.TCP模块处理,建立连接,发送数据已经断开连接,并通过协议确保传输可靠。数据包在此时需要增加TCP协议头,包含端源和目标端口号,序号,校验号。3.IP模块处理。数据包增加源及目标端IP地址。数据包交给路由器处理。4.网络接口(以太网驱动)的处理。数据包增添以太网首部,包括源和目标的MAC地址。

每个包首都至少包含两个信息:1.发送端和接收端地址。2.上一层的协议类型。

数据链路

  1. MAC地址,唯一
  2. 共享介质型网络
    多个设备共享同一个通信介质,比如多台电脑共用一个载波信道
    • 争用方式 每个人都能发送数据,但是先到先发,容易发生冲突。带冲突检测方法的可以预判,然后提前放弃,等待一段时间再发起请求
    • 令牌传递方式 只有获得令牌才能发送数据
  3. 非共享介质网络
    利用交换机,形成一对一通讯。

IP协议

路由控制

本质就是转发,通过路由控制表,将一个主机的信息转发到目标主机。中途会有很多数据链路的连接工作。

数据链路的抽象化

不同数据链路的最大区别是,他们又各自的传输单位。

为解决这个问题,IP进行分片处理。即将较大的IP包分成多个较小的IP包,等到了目的地之后再汇总起来,这样可以胡烈数据链路上不同设备的传输单位限制。

IP属于面向无连接型,但是TCP保证可靠性。

IP地址的基础知识

  1. 32为正整数,192.168.0.1
  2. IP地址=网络地址+主机地址。网络地址在数据链路的每个段分配不同的值,保证互相连接的每个段地址不相重复。相同段内必须有相同的网络地址。同一网段的主机地址是唯一的。
  3. 广播。将主机地址全改为1。即对于192.168.0.1,掩码为255.255.255.0的广播地址为192.168.0.255
    • 本地广播 在本网络内的广播。广播地址为192.168.0.255,其他网段看不到,本网段内都能看到
    • 直接广播 不同网络之间。广播地址为192.168.1.255,192.168.1.0网段全能看到,自己网段看不到。
  4. 多播。1对N的传递方式。多播采用D类地址,即1110::=224:::。
  5. 子网掩码。子网掩码&ip地址为网络地址,即网段。
  6. 全局地址和私有地址。NAT技术,外网。

路由控制

数据链路是同一个网段内机器的连接方式。路由是不同网段之间的连接方式。

本质上就是IP数据包的转发过程。经过一个个驿站(路由器),最后到达。

  • 默认路由,表示我什么都可以转发,任意一个地址都能与之匹配。相当于是switch case里面的default选项。掩码位数为0.
  • 主机路由。掩码位数为32,表示要基于主机网卡上配置的IP地址本身,而不是基于改地址的网络地址部分进行路由。
  • 环回路由。127.0.0.1
  • 路由表的聚合。将小网段组成大网段,比如192.168.2.0/25到192.168.2.128/25本质上就是192.168.2.0/24。

IP分割处理与再构成处理

IP分片的弊端:加重路由器的处理复合(因为需要自己进行分片)、一旦分片丢失,整个IP数据报废。
解决方案:路径MTU发现技术。探测出整个传输路径上最小的MTU,然后按照这个MTU发送数据。

IP首部

源ip地址+目的IP地址+传输层协议+其他(TTL、版本等)

IP协议相关技术

仅凭IP无法完成通信

  • 域名而不是IP地址、DNS
  • 数据链路层不使用IP而是使用MAC地址、ARP

DNS (Domain Name System)

查找浏览器缓存->查本机hosts文件->发送至LDNS服务器(本地域名服务器)->Root Server域名服务器请求解析->返回一个可供查询的主域名服务器(com\cn\org\…)->本地域名服务器向上一步返回的服务器查询->上上步返回的服务器向Name Server发送请求(注册域名的服务器)->Name Server找到IP和域名的对应关系,发送给本地服务器->本地服务器缓存,发送至浏览器->浏览器缓存,系统缓存入host

ARP (Address Resolution Protocol)

在底层的数据链路层,进行实际通信时有必要了解每个IP地址所对应的MAC地址。ARP就是这样一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接受数据分包的网络设备对应的MAC地址。如果不在同一个链路(即网段),可以用过ARP查找下一跳路由器的MAC地址。

借助ARP请求与ARP响应两种类型的包。

发送主机发送的ARP包中包含自己的MAC,IP地址,目标的IP地址。这个ARP包会被广播出去,所有接收到的主机都会与自己的IP进行比较。如果IP相同,就响应一个ARP数据包,定向发送给发送主机,内容包括自己的MAC和IP地址。为了防止不必要的网络流浪,可以将MAC地址缓存。发送和接收的主机都会缓存一段时间的MAC-IP对应关系表。

  • IP负责不同网段之间的转发。
  • MAC负责同网段之间的转发。

ICMP (Internet Control Message Protocol)

构建IP网络时需要特别注意两点:1. 确认网络是否正常工作。2.遇到异常时的问题诊断。

功能

  • 确认IP包是否成功送达

  • 通知在发送过程中IP被废弃的具体原因

  • 改善网络设置

ICMP消息

  • 通知出错原因的错误消息

  • 用于诊断的查询消息

    • 类型3 ICMP目标不可达消息.路由表中没有该主机信息,或者该主机没有联网

    • 类型5 ICMP重定向消息 路由器发现发送端主机使用了次优路径发送数据,将会返回一个ICMP重定向。这个消息中包括了最合适的路由信息和源数据。

    • 类型11 ICMP超时消息 TTL字段,Time to Live。每经过一个路由器就递减,当减少为0时,IP包会被丢弃。防止在路由控制发生问题时出现循环发送的情况。traceroute命令就是通过将TTL设计为1、2、3、…n,然后发送若干个UDP包,返回错误信息,从中提取路由器IP。

    • 类型0、8 ICMP回送消息 用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功送达。类型8要求回显,类型0接收应答。Ping命令就是利用这个消息实现的。

      ping的原理:Ping命令使用ICMP协议,发送icmp回送请求给目的主机,这样目的主机就必须返回icmp应答消息给发送主机。

    • 类型4 原点抑制消息 告知线路拥堵情况。

    • 类型9、10 路由器探索消息 用于发现与自己相连的网段中的路由器。

    • 类型17、18 用于主机/路由器想要了解子网掩码的情况

DHCP (Dynamic Host Configuration Protocol、动态主机配置协议)

自动设置IP地址,统一管理IP地址分配。

  • DHCP服务器(通常由路由器充当) 在分配IP底地址前发送ICMP回送请求包,确认没有返回应答,说明ping不通主机
  • DHCP客户端,针对从DHCP那里获得的IP地址发送ARP请求包,确认没有返回应答
  • 如果以上两点满足其一,说明这个IP是可以使用的。

NAT(Network Address Translator)

NAT用于在本地网络地址中使用私有地址,在连接互联网时转而使用全局IP地址的技术。

TCP与UDP

IP能保证数据从主机A送往主机B,但是送往主机B的哪个应用,则需要传输层的端口来表示。至于这个数据表示什么意思,就需要应用层的协议来解释。

  • TCP 面向连接、可靠的流协议。流指的是不间断的数据结构。当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。
    • 顺序控制、重发控制
    • 流控制、拥塞控制
  • UDP 不可靠的数据报协议。可以确保发送消息的大小,但是不保证消息一定会到达。

端口号

程序地址

UDP (User Datagram Protocol、用户数据报协议)

发就完事儿了。

TCP (Transmission Control Protocol、传输控制协议)

  • 特点及目的

    IP数据报实现可靠性传输,需要考虑很多事情,比如数据的破坏,丢包,重复以及分片顺序混乱。为此,TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

  • 通过序列号与确认应答提高可靠性

    发送端的数据达到接收主机,会返回ACK表示已收到消息。NACK表示否认确认应答。如果一段时间未收到ACK,则数据重发。

    产生了新问题——如果目的主机已经收到数据,并且返回ACK。但是ACK在风中凌乱,没能到达源主机,然后源主机又蠢蠢的再发一遍,此时目的主机就会收到第二份数据。如果这种情况较为普遍,就会造成有大量重复数据。因此需要一种机制,能够识别是否已经接受了数据。

    序列号!!!

    返回值为ACK和下一个应该接受的序列号。

  • 重发超时如何确定

    很真实的一个问题。到底多久没有回应我才应该再次发出信号呢?超时时间一般以0.5的整数倍计算,最短为1秒。最初的数据包为6s。确认应答时间以2、4、8这样的指数函数延长。达到一定次数后将停止通信,并判断通信异常。

  • 连接管理
    通信结束时会进行断开连接的处理,FIN包。
    一个连接的建立于断开,正常过程至少需要7个包才能完成。

    • 三次握手

      三次握手的难点全在为什么要握手最后一次?A:"喂,你在家吗?"B:“我在”。这就是两次握手,讲道理已经可以说话了,为什么A在说话之前还要对B补充一句"我听到你说话了”。换而言之,为什么B需要知道A听没听到B回应的我在?这才是核心问题。

      好,那就按照我的逻辑走,两次握手。注意!仔细看图,client已经established的时候,server可还没有established呢。换而言之,其实是可能存在client认为已经建立了连接,但是server还没有建立连接的可能的。

      1. 在这个基础上,我们考虑一下两次握手。A在收到B的ACK+SYN之后,就很明白自己是能发能收的,因此将自己设置为establised状态。此时他也很清楚的直到B是能发能收的,所以给B直接发数据。那B呢?当A发送数据的时候,B必然是establised状态的,不然无法接收数据。所以B只能在给A发送ACK+SYN的时候设置为establised状态。问题来了,当B给A发送ACK+SYN的时候,甚至连A都不清楚自己能不能接收。因此这是一组矛盾。那B能不能在接收到数据的时候再设置为establised状态呢?显然是可以的,不过这就划归成了三次握手了。因为B接收到数据的时候会接收到ACK指令,因此直接切换到establised状态。

        解释一下,当B收到A的数据的时候,ACK必然为1,因此在接受数据的同时自然切换到establised状态。以上是从确认客户端和服务器端收发状态的角度出发考虑的。

      2. 从Socket编程的角度,就是从accept阻塞状态变成IO阻塞状态。最后一个ACK就是为了在无数据传输的情况下,从accept阻塞状态中跳出来。

      3. 从序列号的角度而言,最后一个ACK是为了确保A收到了B的序列号。

      4. 为了防止之前随风而逝的SYN信号又传了回来,导致建立了先前的连接。而三次握手只是B会不断地给A发SYN+ACK,A不理睬B,B也没有建立连接,因此还是阻塞在accept中。如果是二次握手,那么tcp的连接已经建立了。

    • 四次挥手

      A:我想关了。(表明A从此不再说话,即不再发data,但是可以发状态字)
      B:但是你稍微等一等,我还有点东西想发给你。
      B:我发完了,你关吧。
      A:好的我关了,你也关吧。

      第一次FIN表明主动方停止发送数据,FIN_WAIT1表明在等待被动方回应。被动方进入CLOSE_WAIT状态表示还有数据要处理或发送,且主动方此时并未丧失接收数据能力,因此继续接受,进入FIN_WAIT2。当被动方发送完毕后,发送FIN告知被动方停止发送。主动方接收到后表示ojbk,你先关吧。注意,有人认为被动方发送FIN后自己就可以关了,但是如果主动方没有接收到消息,那主动方将一直傻傻的等待。又有人认为,那让被动方有等待2MSL的策略不就行了?确保主动方一定能接收到。但是你想确保主动方能接收到,就必须要接收到主动方的ACK,因此必然要四次握手。

      为什么主动方一定要等待2MSL(最大生命时间)呢?因为害怕被动方没收到消息,如果2MSL时间内,被动方都没有重发FIN,说明被动方已经关闭。回到刚才的问题,为什么不把这个机制放在第三次握手上么?即,被动方发FIN给主动方,等待2MSL。你想想看,在等待的过程里,什么也不会发生,因为他们两个的上一次同学也是被动方发给主动方的,因此主动方不会重发什么消息。

  • TCP以段位单位发送数据

    建立TCP连接的同时,也可以确定发送数据包的单位。我们也可以称其为最大消息长度(MSS,Maximum Segment Size)。TCP传输大量数据时,以MSS的大小将数据进行分割发送,进行重发的时候也是以MSS为单位。MSS是三次握手时,在两端主机之间被计算出来的,两端主机在发出建立连接的请求时,会在TCP首部写入MSS选项,告知对方资金及的接口能够适应的MSS的大小,会在两者之间选择较小的投入使用。

  • 利用窗口控制提高速度

    TCP以1个段为单位,每发一个端进行一次确认应答的处理,但是这样存在缺点。即:为每个包进行确认应答的操作,包的往返时间越长,网络的吞吐量越差。因此TCP引入了窗口的概念,即发送的单位不再是段,而是以窗口为单位发送数据。一个窗口内的端可以再没有收到应答的情况下直接发送,从而减少了等待的时间。

    窗口是什么?本质上就是一个区间,这个区间有哪些作用呢?1、窗口的大小决定了每次无需等待回应而可以继续发送数据的最大值。2、窗口用来缓存,如果有数据需要重发,可以从窗口中取值进行重发。每当收到ACK的时候,窗口就向后移动,这也被称为滑动窗口控制。目的是减少缓冲区大小,相应的增大了无需等待即可发送的数据量大小。

  • 窗口控制与重发控制

    • ACK信号丢失。在窗口控制下,即使某些确认应答丢失了,也无需重发。比如A发送1000到8000的数据,没收到2001的回馈,但是收到了序列号为8001的回馈,就说明2001已经收到了,不然不会发回8001的ACK。
    • 发送数据报丢失。接收端主机会连续发送三次“我想要1001序列号的数据”,于是发送端就重新发送1001的数据过去。这个解决的痛点是,尽管发送的单位是窗,但是仍能以更小单位的段重发。比超时重发更加高效,称为告诉重发控制。
  • 流控制

    流控制其实就是回答了一个问题,窗口大小由谁来指定呢?答案:由接收端来指定。接收端在回复发送端的TCP首部中会告诉他我能接收的数据量大小,发送端从而调节自己的窗口大小。有一种情况,如果说接收端无法接收更多数据,此时发送端就不再发送数据过去,但是会就间隔时间发送一个窗口探测的数据段,来询问是否可以继续发送。

  • 拥塞控制

    让发送方能通过拥塞窗口感受到网络拥塞的程度,来限制其能相连接发送流量的速率。

    • 慢启动
      通过窗口控制,TCP可以连续发送大量数据包,但是如果通信刚开始就发送大量数据包则会存在问题。因为网络环境是共享的,如果网络已经比较拥堵了,这个时候你再发一个较大量的数据,极有可能导致整个网络的瘫痪。为了解决这个问题,采用慢启动算法得出数值,对发送数据量进行控制。

    • 拥塞避免
      为了调节发送端发送数据的量,定义了一个叫拥塞窗口的概念。慢启动的时候,拥塞窗口初始值为1(也可以为别的,MSS越大,建议这个越小),每收到一次ACK,窗口大小就+1,可以想象,这是指数级的。1,2,4,。。。。。为了避免指数爆炸,因此当超过某个阈值时,会变为线性增长,每个轮次只增加1,或者乘一个比例。当出现超时重发,重新开始慢启动,慢启动阈值为当前的一半。

    • 快重传和快恢复
      以上说的是采用慢启动+超时重发的情况,上文还说过一个重发控制,指的是连续发送三次“我想要1001序列号的数据”。采用慢启动+高速重发控制=快恢复。当发生发送端的数据丢包,接收端会立即发送三次重发指令,此时发送端立即重传数据(快重传),拥塞窗口降低为当前一半,
      拥塞窗口值下降为当前值的一半,窗口大小设置为慢启动阈值+3(快恢复)。

  • 提高网络利用率的规范

    • Nagle算法

      相当于是个缓冲区,不立即发送,而是等数据量到了某种程度才发送。即满足以下两个条件。

      • 已发送的数据都已经收到确认应答时。
      • 可以发送最大端长度(MSS)的数据时。
    • 延迟确认应答

      接收数据的主机如果每次都立刻回复确认应答的话,可能会返回一个较小的窗口,那是因为刚接收到数据,缓冲区已经接近饱和了。当发送端接到这个小窗口的通知后,就会降低传输量,从而降低网络利用率。因此接收端在收到数据之后并不立即返回确认应答,而是延迟一段时间。

      • 在没有收到2*最大端长度的数据位置不做确认应答。即抓一放一。
      • 最大延迟0.5s发送确认应答,一般为0.2s。

      事实上,因为采用了滑动窗口的控制机制,因此回复少一些也无所谓。

    • 捎带应答

      应用层协议,比如HTTP数据发送到对端时,对端通常会返回一个回执。即一个request对应一个response,这个response中可以将TCP的确认应答和回执数据通过一个包发送。即我本来就要给你发送消息的,既然如此,我一个包里就既有消息又有ACK了,岂不美哉?这种机制一定要配合延迟应答,否则接收数据立刻就确认的话,客户机无法准备要发送的数据。request一来我瞬间就要给你response也太过分了吧?

  • UDP首部

    • 源端口号
    • 目的端口号
    • 包长度
    • 校验和
    • 数据部分
  • TCP首部

    • 源端,目的端
    • 序列号 确认应答号
    • 窗口大小
    • 控制字
    • 其他

牛客网面经题目选

  1. TCP拥塞控制原理及采用方法
  • 基本思想:拥塞窗口。方法:慢启动,拥塞避免,快重传,快恢复。
  1. TCP流量控制如何实现,什么是滑动窗口
  • 窗口的概念(不用等到回应可直接发送,从以段为单位变成以窗为单位),滑动窗口的概念(接收到了就后移,没接收到就重发),接收端可以发送消息,告知自己的接收窗口大小,这里可以扯一句延迟确认应答。如果为0,有探测信号。
  1. TCP的拥塞控制,快回传,ip的报文丢弃?

  2. TCP断开连接的一方会进入到哪几个状态

  3. TCP粘包

    因为TCP本来就是面向字节流的,所以不存在什么粘包不粘包的,因为本来就没有包。发生了所谓了粘包问题,是因为应用层协议没设计好,可以设计带固定长度的包,或者消息头中带有长度。实际做项目的时候遇到过这个问题,是用串口读取传感器的值。串口不是一个包一个包传的,而是字节流的形式,因此我们需要根据协议取出固定长度的值。

  4. TCP/IP结构有几层

  5. 聊一聊三次握手,四次挥手的全过程,并且能画出来

  6. TCP如何保证可靠传输

  • 首先是面向连接,通过三次握手和四次挥手进行连接的建立于关闭。然后有校验和,序列号,确认应答,重发控制,连接管理,窗口控制。
    校验和保证单个数据包数据没错误。确认应答保证接收方确确实实能收到。序列号保证当接收端的ACK信号哪怕丢失,也可以通过序列号回复我最近一次收到的序列号,这样差几个ACK也无所谓。重发控制保证了数据的完整性,包括超时重发和高速重发。以段为单位发送会造成网络拥堵,因此采用窗口与滑动窗口控制。通过流量控制设置窗口,通过拥塞控制防止阻塞。此外还有一些类似延迟应答,发送缓冲区,捎带应答等措施。
  1. 讲讲tcp与IP协议的区别

  2. 什么情况下TCP会断开连接

  3. TCP与UDP区别

  • 面向连接、可靠 不面向连接、不可靠
  • 字节流模式 数据报模式
  • 首部数据大 首部数据小
  • 文件传输,邮件等准确性要求高,或者有连接要求的场景 语音,视频等速度要快,但是接受丢包
  1. TCP包含IP么?TCP的数据包格式

  2. TCP受DDOS攻击和SYN洪水攻击时,影响的是三次握手中的哪一步

  • A向B发请求,B也回应了,但是A进行第三次握手,就是半连接。DDOS和SYN FLOOD导致半连接队列被沾满。大量的SYN包但是缺少最后一步的ACK回复。解决方法:1.发现半连接和不活动连接变多时候,就释放系统资源。2.延迟创建TCP Control BLOCK(一组五元组,源IP,port,目的IP,port,协议),直到收到最后一个ACK才创建。即撤销Syn_RECV状态,改为用缓存。
  1. 从输入网址到页面显示,发生了什么

  2. 说说arp协议,nat协议,局域网是怎么通信的?

  3. 给定一个ip地址比如221.130.111.109/30,指出这个IP地址的网络号,主机号,以及子网数。这个地址属于那一类ip地址(A,B,C)类。

  • 掩码数量30,可用位数2,2^2=4,4-2=2.即子网数为2个。为什么要-2呢?因为0和255都不能用,0表示IP地址不可获知,255表示广播。
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值