应用层

应用程序通过什么样的应用层服务来使用网络提供的通信服务

1. 域名系统DNS

1.1 域名系统概述

  • 许多应用层软件经常直接使用域名系统 DNS (Domain Name System),但计算机的用户只是间接而不是直接使用域名系统

  • 因特网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 DNS
    从理论上将,整个互联网可以只是要一个域名服务器,是他装入互联网上的所有主机名,并回答所有对IP地址的查询,但是由于互联网的规模过大
    ① 这样的域名服务器肯定会因为超过负载而无法工作
    ② 一旦域名服务器出现故障,整个互联网就会瘫痪

  • 名字到 IP 地址的解析是由若干个域名服务器程序完成的。域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器

1.2 互联网的域名结构

  • 因特网采用了层次树状结构的命名方法

  • 任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名

  • 域名的结构由标号序列组成,各标号之间用点隔开:
    在这里插入图片描述
    在这里插入图片描述

1.3 域名服务器

从理论上讲可以让每一级的域名都有一个相对应的域名服务器,但是这样做会使域名服务器数量太多,所以DNS采用划分区的方法来解决问题

  • 一个服务器所负责管辖的(或有权限的)范围叫做区(zone)。
  • 各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。
  • 每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。
  • DNS 服务器的管辖范围不是以“域”为单位,而是以“区”为单位
    在这里插入图片描述
    上图b的DNS域名服务器的树状结构图如下
    在这里插入图片描述
    互联网上的DNS域名服务器是按照层次安排的,每一个域名服务器都只对域名体系内的一部分进行管辖

① 根域名服务器:

根域名服务器是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址。

不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助于根域名服务器。

在因特网上共有13 个不同 IP 地址的根域名服务器,它们的名字是用一个英文字母命名,从a 一直到 m(前13 个字母)

很多情况下根域名服务器并不是用来直接把待查询的域名转成IP地址,而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器进行查询

② 顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。
当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的 IP 地址

③ 权限域名服务器
这就是前面已经讲过的负责一个区的域名服务器
当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的 DNS 客户,下一步应当找哪一个权限域名服务器

④ 本地域名服务器
本地域名服务器对域名系统非常重要,本地域名服务器并不属于上图的域名服务器的层次结构

当一个主机发出 DNS 查询请求时,这个查询请求报文就发送给本地域名服务器

每一个因特网服务提供者 ISP,或一个大学,甚至一个大学里的系,都可以拥有一个本地域名服务器,
这种域名服务器有时也称为默认域名服务器

本地域名服务器离用户比较近,一般不超过几个路由器的距离,当所要查询的主机也属于同一个本地ISP时,该本地服务器立即就能将所查询的主机名转换成IP地址而不去询问其他的域名服务器

提高域名服务器的可靠性
DNS 域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器
当主域名服务器出故障时,辅助域名服务器可以保证 DNS 的查询工作不会中断
主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行。这样就保证了数据的一致性

1.4 域名解析的过程

主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文

本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
名字的高速缓存

每个域名服务器都维护一个高速缓存,存放最近用过的名字以及从何处获得名字映射信息的记录。

可大大减轻根域名服务器的负荷,使因特网上的 DNS 查询请求和回答报文的数量大为减少。

为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器,并处理超过合理时间的项(例如,每个项目只存放两天)。

当权限域名服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名转换的准确性

2. DHCP

动态主机配置协议 DHCP 提供了即插即用连网(plug-and-play networking)的机制

这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与

DHCP服务器必须是静态地址

DHCP是使用客户服务器方式
需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文(DHCPDISCOVER),这时该主机就成为 DHCP 客户。

本地网络上所有主机都能收到此广播报文,但只有 DHCP 服务器才回答此广播报文。

DHCP 服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的 IP 地址池(address pool)中取一个地址分配给该计算机。DHCP 服务器的回答报文叫做提供报文(DHCPOFFER)

租用期

DHCP 服务器分配给 DHCP 客户的 IP 地址的临时的,因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 协议称这段时间为租用期。
租用期的数值应由 DHCP 服务器自己决定。
DHCP 客户也可在自己发送的报文中(例如,发现报文)提出对租用期的要求

DHCP协议的工作过程
在这里插入图片描述
① DHCP 服务器被动打开 UDP 端口 67,等待客户端发来的报文。

② DHCP 客户从 UDP 端口 68发送 DHCP 发现报文(发送广播,目的地址全1,源地址全0 )

③ 凡收到 DHCP 发现报文的 DHCP 服务器都发出 DHCP 提供报文,因此 DHCP 客户可能收到多个 DHCP 提供报文

④ DHCP 客户从几个 DHCP 服务器中选择其中的一个,并向所选择的 DHCP 服务器发送 DHCP 请求报文

⑤ 被选择的 DHCP 服务器发送确认报文DHCPACK,进入已绑定状态,并可开始使用得到的临时 IP 地址了
DHCP 客户现在要根据服务器提供的租用期 T 设置两个计时器 T1 和 T2,它们的超时时间分别是 0.5T 和 0.875T。当超时时间到就要请求更新租用期

⑥ 租用期过了一半(T1 时间到),DHCP 发送请求报文 DHCPREQUEST 要求更新租用期

⑦ DHCP 服务器若同意,则发回确认报文DHCPACK。DHCP 客户得到了新的租用期,重新设置计时器

⑧ DHCP 服务器若不同意,则发回否认报文DHCPNACK。这时 DHCP 客户必须立即停止使用原来的 IP 地址,而必须重新申请 IP 地址(回到步骤2

若DHCP服务器不响应步骤6的请求报文DHCPREQUEST,则在租用期过了 87.5% 时,DHCP 客户必须重新发送请求报文 DHCPREQUEST(重复步骤6),然后又继续后面的步骤

⑨ DHCP 客户可随时提前终止服务器所提供的租用期,这时只需向 DHCP 服务器发送释放报文 DHCPRELEASE 即可

上面的是在一个网段放一个DHCP服务器,这样会造成浪费,可以使用DHCP中继代理跨网段进行分配

DHCP中继代理
并不是每个网络上都有 DHCP 服务器,这样会使 DHCP 服务器的数量太多。现在是每一个网络至少有一个 DHCP 中继代理,它配置了 DHCP 服务器的 IP 地址信息。

当 DHCP 中继代理收到主机发送的发现报文后,就以单播方式向 DHCP 服务器转发此报文,并等待其回答。收到 DHCP 服务器回答的提供报文后,DHCP 中继代理再将此提供报文发回给主机
在这里插入图片描述

3. 万维网

3.1 万维网概述

万维网 WWW (World Wide Web)并非某种特殊的计算机网络

万维网是一个大规模的、联机式的信息储藏所

万维网用链接的方法能非常方便地从因特网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息

这种访问方式称为“链接”

起初是用hao123.com这样的导航页
现在是用baidu这样的搜索引擎来进行关键字搜索找到自己感兴趣的链接
万维网提供分布式服务
在这里插入图片描述

3.2 超媒体与超文本

万维网是分布式的超媒体系统,他是超文本系统的扩充
超文本是指包含指向其他文档的链接(超链接)的文本,也就是说,一个超文本由多个信息源构成,而这些信息源可以分布在世界各地,利用一个链接可以使用户找到远在异地的另一个文档(页面)

超媒体与超文本的区别是文档内容不同。超文本文档仅包含文本信息,而超媒体文档还包含其他表示方式的信息,如图形、图像、声音、动画,甚至活动视频图像

3.3 万维网的工作方式

万维网以客户服务器方式工作

浏览器就是在用户计算机上的万维网客户程序。万维网文档所驻留的计算机则运行服务器程序,因此这个计算机也称为万维网服务器

客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档

在一个客户程序主窗口上显示出的万维网文档称为页面(page)

3.4 万维网需要解决的问题

① 怎么标志分布在整个互联网上的万维网文档 (URL)

使用统一资源定位符 URL (Uniform Resource Locator)来标志万维网上的各种文档。
使每一个文档在整个因特网的范围内具有唯一的标识符 URL

② 用什么样的协议来实现万维网上的各种链接 (HTTP)

在万维网客户程序与万维网服务器程序之间进行交互所使用的协议,是超文本传送协议 HTTP (HyperText Transfer Protocol)。
HTTP 是一个应用层协议,它使用 TCP 连接进行可靠的传送

③ 怎样使各种万维网文档都能在因特网上的各种计算机上显示出来,同时使用户清楚地知道在什么地方存在着超链 (HTML)

超文本标记语言 HTML (HyperText Markup Language)使得万维网页面的设计者可以很方便地用一个超链从本页面的某处链接到因特网上的任何一个万维网页面,并且能够在自己的计算机屏幕上将这些页面显示出来

④ 怎样使用户能够很方便地找到所需的信息 (搜索引擎)

为了在万维网上方便地查找信息,用户可使用各种的搜索工具(即搜索引擎)

3.5 URL

  • 统一资源定位符 URL 是对可以从因特网上得到的资源的位置和访问方法的一种简洁的表示。

  • URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。

  • 只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。

  • URL 相当于一个文件名在网络范围的扩展。因此 URL 是与因特网相连的机器上的任何可访问对象的一个指针

在这里插入图片描述
使用HTTP的URL

http://<主机>:<端口>/<路径>

① http这表示使用 HTTP 协议
② 冒号和两个斜线是规定的格式
③ 主机的域名
④ HTTP 的默认端口号是 80,通常可省略
⑤ 若再省略文件的<路径>项,则 URL 就指到因特网上的某个主页(home page)。

3.6 超文本传输协议HTTP

3.6.1 HTTP的操作过程

HTTP协议定义了浏览器(即万维网客户进程)怎么向万维网服务器请求万维网文档以及服务器怎么把文档传送给浏览器

从层次的角度看,HTTP 是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

在这里插入图片描述
(1) 浏览器分析超链指向页面的 URL。
(2) 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。
(3) 域名系统 DNS 解析出清华大学服务器的 IP 地址。
(4) 浏览器与服务器建立 TCP 连接
(5) 浏览器发出取文件命令:
GET /chn/yxsz/index.htm。
(6) 服务器给出响应,把文件 index.htm 发给浏览器。
(7) TCP 连接释放。
(8) 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本

3.6.2 HTTP的主要特性

1. HTTP 是面向事务的客户服务器协议

所谓事务就是说一些列的信息交换,而这一系列的信息交换是不可分割的整体,也就是说要么所有的信息交换都完成,要么一次交换都不进行

2. HTTP 1.0 协议是无状态的(stateless)

同一个客户第二次访问同一服务器上的页面时,服务器的响应与第一次访问时的相同,他并不知道这个客户以前来过
之所以这样设计是为了简化服务器的设计,使服务器更容易支持大量并发的HTTP请求

3. HTTP 协议本身也是无连接的,虽然它使用了面向连接的 TCP 向上提供的服务

虽然HTTP使用面向连接的TCP作为运输层协议,保证了数据的可靠传输,但是HTTP协议本身是无连接的,不用建立HTTP连接

3.6.3 持续连接

在这里插入图片描述
HTTP/1.0使用非持续连接

可以看到请求到一次万维网文档所需要的时间是该文档的传输时间+建立TCP连接的时间,在HTTP/10中会为每次请求都建立一个TCP连接,这种非持续连接不仅使请求时间变慢而且让服务器的负担很重

HTTP/1.1使用持续连接

万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求报文和响应报文

这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行

目前一些流行的浏览器(例如,IE 6.0)的默认设置就是使用 HTTP/1.1

① 非流水线方式:客户在收到前一个响应后才能发出下一个请求。这比非持续连接的两倍 RTT 的开销节省了建立 TCP 连接所需的一个 RTT 时间。但服务器在发送完一个对象后,其 TCP 连接就处于空闲状态,浪费了服务器资源

② 流水线方式:客户在收到 HTTP 的响应报文之前就能够接着发送新的请求报文。一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。使用流水线方式时,客户访问所有的对象只需花费一个 RTT时间,使 TCP 连接中的空闲时间减少,提高了下载文档效率

3.6.4 代理服务器

在这里插入图片描述
代理服务器(proxy server)又称为万维网高速缓存(Web cache),它代表浏览器发出 HTTP 请求。

万维网高速缓存把最近的一些请求和响应暂存在本地磁盘中。

当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按 URL 的地址再去因特网访问该资源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6.5 HTTP报文结构

HTTP
HTTP 有两类报文:
由于 HTTP 是面向正文的(text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的

3.6.5.1 请求报文

请求报文——从客户向服务器发送请求报文。

在这里插入图片描述
请求行
① “方法”是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的
请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST

② “URL”是所请求的资源的 URL

③ “版本”是 HTTP 的版本。

消息头
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

3.6.5.2 响应报文

响应报文——从服务器到客户的回答。
在这里插入图片描述
状态行
在这里插入图片描述
响应头
HTTP响应中的常用响应头(消息头)
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache

设置Location响应头,实现请求重定向

package gacl.http.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author gacl
 *
 */
public class ServletDemo01 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setStatus(302);//设置服务器的响应状态码
        /**
         *设置响应头,服务器通过 Location这个头,来告诉浏览器跳到哪里,这就是所谓的请求重定向
         */
        response.setHeader("Location", "/JavaWeb_HttpProtocol_Study_20140528/1.jsp");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }
}

当在浏览器中使用URL地址"http://localhost:8080/JavaWeb_HttpProtocol_Study_20140528/servlet/ServletDemo01"访问ServletDemo01时,就可以看到服务器作出响应后发送到浏览器的状态码和响应头信息,如下图所示
在这里插入图片描述
服务器返回一个302状态码告诉浏览器,你要的资源我没有,但是我通过Location响应头告诉你哪里有,而浏览器解析响应头Location后知道要跳转到/JavaWeb_HttpProtocol_Study_20140528/1.jsp页面,所以就会自动跳转到1.jsp
在这里插入图片描述
设置content-disposition响应头,让浏览器下载文件

package gacl.http.study;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo05 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 设置content-disposition响应头,让浏览器下载文件
         */
        response.setHeader("content-disposition", "attachment;filename=xxx.jpg");
        InputStream in = this.getServletContext().getResourceAsStream("/img/1.jpg");
        byte buffer[] = new byte[1024];
        int len = 0;
        OutputStream out = response.getOutputStream();
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

}

3.6.6 在服务器上存放用户的信息

HTTP是无状态的,这样虽然简化了服务器的设计,但是时间工作中,一些万维网站点还是希望能识别用户
Session和Cookie

4. 电子邮件

4.1 电子邮件概述

在这里插入图片描述
用户代理 UA 就是用户与电子邮件系统的接口,是电子邮件客户端软件
邮件服务器的功能是发送和接收邮件,同时还要向发信人报告邮件传送的情况(已交付、被拒绝、丢失等)
邮件服务器按照客户服务器方式工作。邮件服务器需要使用发送和读取两个不同的协议

SMTP和POP3都使用TCP连接可靠传输
① 发件人调用 PC 机中的用户代理撰写和编辑要发送的邮件。
② 发件人的用户代理把邮件用 SMTP 协议发给发送方邮件服务器,
③ SMTP 服务器把邮件临时存放在邮件缓存队列中,等待发送。
④ 发送方邮件服务器的 SMTP 客户与接收方邮件服务器的 SMTP 服务器建立 TCP 连接,然后就把邮件缓存队列中的邮件依次发送出去
⑤ 运行在接收方邮件服务器中的SMTP服务器进 程收到邮件后,把邮件放入收件人的用户邮箱中,等待收件人进行读取。
⑥ 收件人在打算收信时,就运行 PC 机中的用户代理,使用 POP3(或 IMAP)协议读取发送给自己的邮件。
请注意,POP3 服务器和 POP3 客户之间的通信是由 POP3 客户发起的

为什么需要单独的邮箱服务器,而不让邮箱服务器在用户计算机运行
因为邮箱服务器需要24小时不间断运行

xyz@abc.com
①abc.com是邮件服务器的域名
② xyz是这个邮件服务器中的收件人的用户名

4.2 简单邮件传送协议SMTP

  • SMTP 所规定的就是在两个相互通信的 SMTP 进程之间应如何交换信息。
  • 由于 SMTP 使用客户服务器方式,因此负责发送邮件的 SMTP 进程就是 SMTP 客户,而负责接收邮件的 SMTP 进程就是 SMTP 服务器。
  • SMTP 规定了 14 条命令和 21 种应答信息。每条命令用 4 个字母组成,而每一种应答信息一般只有一行信息,由一个 3 位数字的代码开始,后面附上(也可不附上)很简单的文字说明
  1. 连接建立:连接是在发送主机的 SMTP 客户和接收主机的 SMTP 服务器之间建立的。SMTP不使用中间的邮件服务器。
  2. 邮件传送
  3. 连接释放:邮件发送完毕后,SMTP 应释放 TCP 连接

4.3 邮件读取协议POP3 和 IMAP

POP3的最大特点是只要用户从POP3服务器读取了邮件,POP3服务器就把该邮件删除

IMAP 是一个联机协议。当用户 PC 机上的 IMAP 客户程序打开 IMAP 服务器的邮箱时,用户就可看到邮件的首部。若用户需要打开某个邮件,则该邮件才传到用户的计算机上

4.4 基于万维网的电子邮件

不需要安装用户代理软件UA
在这里插入图片描述

  • 电子邮件从 A 发送到网易邮件服务器是使用 HTTP 协议。
  • 两个邮件服务器之间的传送使用 SMTP。
  • 邮件从新浪邮件服务器传送到 B 是使用 HTTP 协议

5. 应用进程跨越网络的通信

如果有一些特定的应用需要互联网的支持,但是这些应用又不能直接使用已经标准化的互联网应用协议,那我们应该做哪些工作

TCP/IP协议软件驻留在操作系统中,应用程序通过套接字API与操作系统交换,使用系统调用函数并请求起服务
在这里插入图片描述
套接字的作用
当应用进程需要使用网络进行通信时就发出系统调用,请求操作系统为其创建“套接字”,以便把网络通信所需要的系统资源分配给该应用进程。
操作系统为这些资源的总和用一个叫做套接字描述符的号码来表示,并把此号码返回给应用进程。应用进程所进行的网络操作都必须使用这个号码。
通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作系统回收与该“号码”相关的所有资源

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值