IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络——应用层 -> 正文阅读

[网络协议]计算机网络——应用层

1.应用层协议原理

1.1 网络应用程序体系结构

有两个主流的体系结构:客户-服务器结构,P2P体系结构

  • 客户-服务器

    服务器:特点:总是打开的,如Web应用程序中的服务器

    ? ???有固定的、周知的地址–IP地址

    客户:客户之间不直接通信,如Web应用程序中的浏览器

    举例:Web、FTP、Telnet、电子邮件

  • P2P体系结构

    主机之间直接通信,被称为对等方

    特点:不必通过专门的服务器;

    ? ???自扩展性:一个对等方可以向其他对等方发送文件

    举例:文件共享,迅雷、因特网电话视频会议

    补充:有些混合体系结构有用到两种,例如服务器用于追踪用户IP,但用户间仍用P2P通信

1.2 进程通信

我们关注的是不同主机上的进程间的通信,它们通过交换报文通信

  • 客户和服务器进程

?网络应用程序由成对的进程组成,在一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器(P2P结构中也有标识客户和服务器)。

  • 进程如何和网络连接?–套接字

    • 套接字是同一台主机内应用层与运输层之间的接口。

    • 由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口

    • 应用程序开发者对于运输层的控制仅限于∶①选择运输层协议;②也许能设定几个运输层参数,如最大缓存和最大报文段长度等。

  • 进程如何找到对方的地址?

    ?为了标识该接收进程,需要定义两种信息:

    ?①主机的地址(IP地址);②在目的主机中指定接收进程的标识符(端口号)。

    ?端口号:一些流行的应用有特定的端口号。例如,Web 服务器用端口号 80来标识。邮件服务器进程(使用SMTP 协议)用端口号25来标识。用于所有因特网标准协议的周知端口号的列表能够在 http∶//www.iana.org 处找到。

1.3 应用程序可以用的运输服务

? ?前面讲过套接字是应用程序进程和运输层协议之间的接口。在发送端的应用程序将报文推进该套接字。在该套接字的另一侧,运输层协议负责从接收进程的套接字得到该报文。对应用程序服务有以下要求:可靠数据传输、吞吐量、定时和安全性。

  • 可靠数据传输

    ? ?如果一个协议提供确保数据的交付服务,就是可靠数据交付,即:保证发送端的数据正确、完全地交付给该接收端

    ? ?运输层能够潜在地提供可靠数据传输服务。

    ? ?容忍丢失的应用(loss-tolerant application)接受一些数据到不了,如交谈式音频/视频。

  • 吞吐量

    ?可用吞吐量就是发送进程能够向接收进程交付比特的速率。

    ? ?运输层协议能够以某种特定的速率提供确?保的可用吞吐量。使用这种服务,该应用程序能够请求r比特/秒的确保吞吐量,并且该运输协议能够确保可用吞吐量总是为至少r比特/秒。

    ? ?带宽敏感的应用:具有吞吐量要求的应用程序

    ? ?弹性应用:能够根据当时可用的带宽或多或少地利用可供使用的吞吐量。如:电子邮件、文件传输以及 Web传送。

  • 定时

    ? ?定时保证能够以多种形式实现。一个保证的例子如:发送方注入进套接字中的每个比特到达接收方的套接字不迟于100ms。

    ? ?运输层协议也能提供定时保证

    ? ?实时应用举例:因特网电话、虚拟环境、电话会议和多方游戏。在因特网电话中,较长的时延会导致会话中出现不自然的停顿。

  • 安全性

    ?运输协议能够为应用程序提供一种或多种安全性服务。

    在这里插入图片描述

1.4 因特网提供的运输服务

1.3中是计算机网络可以提供的,但不是因特网络提供的,下面将讨论因特网提供的具体运输服务。有两个运输层协议:TCP UDP

  • TCP服务

    ?可以提供面向连接的服务和可靠的数据传送服务。

    • 面向连接的服务:传输开始前,TCP通过握手过程提醒客户和服务器做好准备。在握手阶段后,一个 TCP连接建立了。这条连接是全双工的,结束报文发送时,必须拆除该连接

    • 可靠的数据传送服务:通信进程能够依靠 TCP。无差错、按一定顺序交付所有发?送的数据。

    • TCP协议还具有拥塞控制机制

  • UDP服务

    ?UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务,不可靠数据传送服务,没有拥塞控制机制

  • 安全问题

    ? ?无论TCP 还是 UDP都没有提供任何加密机制,这就是说发送进程传进其套接字的数据,与经网络传送到目的进程的数据相同。

    ? ?为此因特网界已经研制了TCP 的加强版本,称为安全套接字层(Secure Sockets Layer,SSL),提供了包括加密、数据完整性和端点鉴别。SSL 不是与TCP和 UDP 在相同层次上的第三种因特网运输协议,而是一种对TCP的加强,这种强化是在应用层上实现的。

  • 不提供的服务

    ?吞吐量或定时保证这些服务目前的因特网运输协议并没有提供。

  • 使用场景举例:这些应用选择 TCP 的最主要原因是 TCP提供了可靠数据传输服务,确保所有数据最终到达目的地;选择UDP是为了设法避开 TCP的拥塞控制机制和分组开销。

    在这里插入图片描述

1.5 应用层协议

应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别地应用层协议定义了∶

  • 交换的报文类型,例如请求报文和响应报文。
  • 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的。
  • 字段的语义,即这些字段中的信息的含义。
  • 确定一个进程何时以及如何发送报文,对报文进行响应的规则。

? ?在本章中我们详细讨论5种重要的应用∶Web、文件传输、电子邮件、目录服务、流式视频和 P2P。

2. Web和HTTP

本节内容:

HTTP报文的格式

当发送和接收这些报文时Web客户和服务器所采取的动作

Web 应用程序基础设施,包括缓存、cookie 和后端数据库

2.1 Web和HTTP概述

  • 关于Web

    • 使用的协议:HTTP(超文本传输协议),是Web的核心

    • Web 页面(Web page)(也叫文档)是由对象组成的,对象(object)只是一个文件,通过一个URL 地址寻址,储存在服务端。

    • URL:每个 URL 地址由两部分组成∶存放对象的服务器主机名和对象的路径名。例如,URL 地址 http∶//www.someSchool.edu/someDepartment/pic-ture.gif,其中的 www.someSchool.edu 就是主机名,/someDepartment/picture.gif 就是路径名。

  • 关于HTTP协议

    • 由两个程序实现∶一个客户程序和一个服务器程序,二者通过交换HTTP报文进行会话。

      ? ?客户程序:Web浏览器(例如Internet Explorer 和 Firefox)

      ? ?服务器程序:Web 服务器(Web server)。如Apache 和 Microsoft Internet Information Server(微软互联网信息服务器)

    • HTTP定义了Web客户向Web 服务器请求 Web 页面的方式,以及服务器向客户传送Web 页面的方式。

    • 请求过程

      ?如图,当用户请求一个 Web 页面(如点击一个超链接)时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP响应报文进行响应。

      在这里插入图片描述

    • 使用的运输协议:TCP作为它的支撑运输协议。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问 TCP,一且客户向它的套接字接口发送了一个请求报文,该报文就脱离了客户控制并进入TCP 的控制

      ?这里我们看到了分层体系结构最大的优点,即 HTTP协议不用担心数据丢失,也不关注TCP从网络的数据丢失和乱序故障中恢复的细节

    • 无状态协议:服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息。假如某个特定的客户在短短的几秒内两次请求同一个对象,服务端依然会做响应。

2.2 非持续性连接和持续连接

  • 背景:客户向服务器发出一系列请求并且服务器对每个请求进行响应,这种情况下应该用什么方式连接客户和服务器呢?

  • 定义:

    ?现假设运输层使用的协议是TCP。

    ?非持续性连接:每个请求/响应对是经一个单独的 TCP连接发送

    ?持续性连接:所有的请求及其响应经相同的 TCP连接发送

    ?HTTP能够支持这两种方式,在默认情况下使用持续连接。

  • 采用非持续连接的 HTTP

    ? ?当客户向服务器请求一个Web页面,会经历哪些步骤呢?

    ? ?现在假设请求的页面含有一个HTML基本文件和10个JPEG图形,并且这 11 个对象位于同一台服务器上。HTML 文件的 URL为http∶//www.someSchool.edu/someDepartment/home.index。经历的过程如下:

    1. 发起连接:HTTP客户进程在端口号80发起一个到服务器 www.someSchool. edu 的 TCP连接,该端口号是 HTTP的默认端口。在客户和服务器上分别有一个套接字与该连接相关联。
    2. 客户端发送请求报文:HTTP客户经它的套接字向该服务器发送一个HTTP 请求报文。请求报文中包含了路径名/someDepartment/home.index
    3. 服务器发送响应报文:HTTP 服务器进程经它的套接字接收该请求报文,从其存储器(RAM或磁盘)中检索出对象 www.someSchool.edu/someDepartment/home.index,在一个 HTTP响应报文中封装对象,并通过其套接字向客户发送响应报文。
    4. 服务器断开连接:HTTP服务器进程通知 TCP断开该 TCP连接。
    5. 客户端得到文件:HTTP客户接收响应报文,TCP连接关闭。该报文指出封装的对象是一个HTML 文件,客户从响应报文中提取出该文件,检查该HTML 文件,得到对10个JPEG图形的引用。
    6. 重复?:对每个引用的JPEG图形对象重复前4个步骤。

    ? ?上面步骤说明了非持续连接的使用,其中每个TCP连接在服务器发送一个对象后关闭,即该连接并不为其他的对象而持续下来。

    • 客户请求到HTML文件花费的时间是多少呢?

      ? ?请求文件?往返时间(Round-Trip Time,RTT):该时间是指一个短分组从客户到服务器再返回客户所花费的时间。

      ? ?如图是请求并接收一个HTML文件所需的时间估算:三次握手中前两个部分所耗费的时间占用了一个RTT。
      ? ?客户结合三次握手的第三部分(确认)向该 TCP连接发送一个HTTP 请求报文。

      ? ?一旦该请求报文到达服务器,服务器就在该 TCP连接上发送HTML文件。

      ? ?该HTTP请求/响应用去了另一个 RTT。

      ? ?因此,粗略地讲,总的响应时间就是两个 RTT加上服务器传输HTML 文件的时间。

      在这里插入图片描述

    • 缺点:

      1. 必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配 TCP的缓冲区和保持 TCP 变量,这给Web服务器带来了严重的负担。
      2. 每一个对象经受两倍 RTT的交付时延。
  • 采用持续连接的 HTTP

    ? ?持续连接的情况下:在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。上例中的 HTML 基本文件加上10个图形可以用单个持续TCP连接进行传送。

    ? ?一般来说,如果一条连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP 服务器就关闭该连接。

    ? ?HTTP 的默认模式是使用带流水线的持续连接。

2.3 HTTP报文格式

HTTP 报文有两种∶请求报文和响应报文。下面讨论这两种报文。

  • HTTP请求报文
    例子:

    GET /somedir/page.html HTTP/1.1 
    Host:www.Someschool.edu 
    Connection: close 
    User-agent: Mozilla/5.0 
    Accept-language: fr
    
    • 每行由一个回车和换行符结束。最后一行后再附加一个回车换行符。

    • 第一行叫作请求行(request line),其后继的行叫作首部行(header line)。

    • 请求行有3个字段∶方法字段、URL字段和HTTP版本字段

      ?方法字段可以有:GET、POST、HEAD、PUT和 DELETE。

      ?GET:指浏览器请求一个对象。在本例中,该浏览器正在请求对象/somedir/page.html。

      ?HEAD方法类似于GET方法。当服务器收到一个使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象。

      ?PUT方法允许用户上传对象到指定的 Web 服务器上指定的路径(目录)。

      ?DELETE 方法允许用户或者应用程序删除Web 服务器上的对象。

    • 首部行 Hostwww.someschool.edu 指明了对象所在的主机。注意,虽然创建了连接,但此项不可少。因为可能是到代理服务器的链接而不是直接到主机。

    • 首部行Connection:close 首部行:浏览器告诉服务器不要麻烦地使用持续连接

    • 首部行User-agent∶指明用户代理,即向服务器发送请求的浏览器的类型。这里浏览器类型是Mozilla/5.0,即 Firefox 浏览器。这个首部行是有用的,因为服务器可以有效地为不同类型的用户代理实际发送相同对象的不同版本。

    • 首部行Accept-language∶首部行表示用户想得到该对象的法语版本

    格式图:

    在这里插入图片描述

    • 实体体(entity body):使用GET方法时实体体为空,而使用 POST 方法时才使用该实体体。

      例子:

      ? ?当用户提交表单时,HTTP客户常常使用 POST 方法,例如当用户向搜索引擎提供搜索关键词时。实体体使用POST报文时,用户仍可以向服务器请求一个Web 页面,但Web 页面的特定内容依赖于用户在表单字段中输入的内容。

  • HTTP响应报文
    例子:

    HTTP/1.1 200 OK 
    Connection:close
    Date:Tue,18 Aug 2015 15:44:04 GMT 
    Server: Apache/2.2.3(CentOS)
    Last-Modified: Tue,18 Aug 2015 15:11:03 GMT 
    Content-Length: 6821 
    Content-Type:text/html
    (data data data data data ...)
    

    有三个部分∶一个初始状态行(status line),6个首部行(header line),然后是实体体(entity body)。

    • 状态行:有3个字段,协议版本字段、状态码和相应状态信息。在这个例子中,状态行指示服务器正在使用 HTTP/1.1,并且一切正常(即服务器已经找到并正在发送所请求的对象)。

      ?常见的状态码和相关的短语包括∶
      ??200 OK∶请求成功,信息在返回的响应报文中。

      ? ??301 Moved Permanently∶请求的对象已经被永久转移了,新的 URL定义在响应报文的Location首部行中。客户软件将自动获取新的 URL。

      ? ??400 Bad Request;一个通用差错代码,指示该请求不能被服务器理解。

      ? ??404 Not Found∶被请求的文档不在服务器上。

      ? ??505 HTTP Version Not Supported∶服务器不支持请求报文使用的 HTTP 协议版本。

    • 首部行

      ?Connection:close 告诉客户发送完报文后将关闭该 TCP连接。

      ?Date∶首部行指示服务器产生并发送该响应报文的日期和时间。这个时间是指服务器从它的文件系统中检索到该对象,将该对象插入响应报文,并发送该响应报文的时间。

      ?Server:指示该报文是由一台 Apache Web 服务器产生的,

    ? Last-Modified∶指示了对象创建或者最后修改的日期和时间。

    ?Content-Length∶指示了被发送对象中的字节数。

    ?Content-Type∶表示实体体中的对象是HTML 文本。

    • 实体体部分:它包含了所请求的对象本身(表示为 data data data data data …)。

    格式图:

    在这里插入图片描述

2.4 用户与服务器的交互:cookie

  • 作用:而一个 Web 站点通常希望能够识别用户,可能是因为服务器希望限制用户的访问,或者因为它希望把内容与用户身份联系起来。cookie允许站点对用户进行跟踪。

  • cookie技术有4个组件:图中可见

    ①在 HTTP响应报文中的一个cookie首部行

    ②在 HTTP请求报文中的一个cookie 首部行

    ③在用户端系统中保留有一个 cookie 文件,并由用户的浏览器进行管理

    ④位于Web 站点的一个后端数据库。

    在这里插入图片描述

  • 例子:

    1. 主机正在上网,已经访问过eBay 站点,可以看到浏览器管理的cookie 文件已经有了用于eBay的表项,因为 Susan过去访问过该站点。而现在第一次访问Amazon站点。

    2. 当请求报文到达Amazon Web 服务器时,该Web 站点将产生一个唯一识别码,并以此作为索引在它的后端数据库中产生一个表项。

    3. 接下来 Amazon Web服务器用一个包含 Set-cookie首部的 HTTP响应报文对主机的浏览器进行响应,其中 Set-cookie首部含有该识别码。例如,该首部行可能是Set-cookie:1678

    4. 当浏览器收到了该 HTTP 响应报文时,它会看到该 Set-cookie首部,然后在cookie 文件中添加一行,该行包含服务器的主机名和在 Set-cookie首部中的识别码

    5. 之后主机每请求一个Web 页面,其浏览器就会查询该cookie 文件并抽取识别码,并放到 HTTP 请求报文中包括识别码的 cookie 首部行中。发往该 Amazon 服务器的每个HTTP 请求报文都包括Cookie1678

    6. 在这种方式下,Amazon 服务器可以跟踪 Susan 在 Amazon 站点的活动。

2.5 Web缓存

  • 定义:Web 缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始Web服务器来满足 HTTP请求的网络实体。

  • Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。

    ?Web缓存器通常由ISP购买并安装。

    ?可以配置用户的浏览器,使得用户的所有 HTTP 请求首先指向Web 缓存器。如图:

    在这里插入图片描述

  • 举例:

    假设浏览浏览器正在请求对象 http∶/www. someschool.edu/campus.gif,将会发生如下情况∶

    1. 浏览器创建一个到Web 缓存器?代理服务器的TCP连接,发送一个HTTP请求。

    2. Web缓存器进行检查,看看本地是否存储了该对象副本。

      如果有,Web 缓存器就向客户浏览器用HTTP 响应报文返回该对象。

    3. 如果 Web缓存器中没有该对象,它就打开一个与该对象的初始服务器(即www.someschool.edu)的 TCP连接。Web 缓存器发送一个 HTTP请求,在收到该请求后,初始服务器向该Web 缓存器发送具有该对象的HTTP响应。

    4. 当Web 缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用 HITTP响应报文发送该副本

      注意:Web 缓存器既是服务器又是客户

  • 使用代理服务器的原因:

    1. Web缓存器可以大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与Web 缓存器之间的瓶颈带宽时,通常客户与 Web 缓存器之间有一个高速连接

    2. Web 缓存器能够大大减少一个机构的接入链路到因特网的通信量。通过减少通信量,该机构(如一家公司或者一所大学)就不必急于增加带宽,因此降低了费用。

    3. Web 缓存器能从整体上大大减低因特网上的 Web?流量,从而改善了所有应用的性能。

  • 使用/不适用web缓存器的对比:

    1. 不使用web缓存器,如图。机构网络向因特网发送请求,局域网的链路速率比接入链路速率大很多,这有啥问题呢?

      ? 我们要计算时延,可以通过流量强度来说明问题(概述中4.1提到的)。

      ? 流量强度=到达的速率/传输速率(发出比特的速率)。由于接入链路速率比较低,所以可以想到,当请求很多对象时,从因特网到局域网边缘路由器的流量强度接近1(分母小)。流量强度接近1,时延无限大

      ? 而从边缘路由器到因特网路由器,由于局域网链路速率大,所以流量强度计算中分母大,流量强度小,这方面的时延很小。

      ? 响应时延大意味着用户很久才能得到请求的对象。解决:可以增大接入链路速率,这个太贵了。

      在这里插入图片描述

    2. 使用web缓存器:

      机构主机可以很快地和机构缓存器得到请求对象,但是可能缓存器没有所要的请求,但这也减少了通过接入链路请求,流量强度减少,时延大大减少。

      在这里插入图片描述

2.6 条件GET方法

  • web缓存器的存在的问题?

    ? 存放在缓存器中的对象副本可能是陈旧的,保存在服务器中的对象可能已经被修改了。

    ? HTTP协议有一种机制,允许缓存器证实它的对象是最新的。这种机制就是条件GET方法。

  • 什么是条件GET请求报文?

    ①请求报文使用GET 方法

    ②并且请求报文中包含一个"If-Modified-Since:"首部行。

    例子:

    1. 一个代理缓存器(proxy cache)代表一个浏览器,向某Web服务器发送一个请求报文∶

      GET/fruit/kiwi.qif HTTP/1.1 
      Host: www.exotiquecuisine.com
      

      其次,该Web 服务器向缓存器发送具有被请求的对象的响应报文∶

      HTTP/1.1 200 OK
      Date: Sat,3 Oct 2015 15:39:29 
      Server: Apache/1.3.0(Unix)
      Last-Modified: Wed,9 Sep 2015 09:23:24 
      Content-Type: image/gif
      (data data data data data ...)
      

      缓存器在存储该对象时也存储了最后修改日期。

    2. 一个星期后,另一个用户经过该缓存器请求同一个对象,该缓存器通过发送一个条件 GET执行最新检查。具体来说,该缓存器发送∶

      GET /fruit/kiwi,gif HTTP/1.1 
      Host: www.exotiquecuisine.com
      If-modified-since: Wed,9 Sep 2015 09:23:24
      

      值得注意的是If-Modified-Since∶首部行的值正好等于一星期前服务器发送的响应报文中的Last-Modified;首部行的值。

      该条件GET报文告诉服务器若对象被修改了才发送该对象。

    3. 假设没有被修改,Web 服务器向该缓存器发送一个响应报文∶

      HTTP/1.1 304 Not Modified
      Date:Sat,10 Oct 2015 15:39:29 
      Server:Apache/1.3.0 (Unix)
      (empty entity body)
      
      • 报文中没有包含所请求的对象。
      • 注意:状态行中为304 Not Modified,它告诉缓存器可以使用该对象,能向请求的浏览器转发缓存的副本。

3.因特网中的电子邮件

  • 因特网电子邮件系统的总体情况:

    在这里插入图片描述

    如图有 3 个主要组成部分∶用户代理(user agent)、邮件服务器(mail server)和简单邮件传输协议(SMT)

  • 用户代理允许用户阅读、回复、转发、保存和撰写报文,如微软的 Outlook 和 Apple Mail 是用户代理。

  • 邮件服务器形成了电子邮件体系结构的核心。

    • 邮件是怎么被发送的?

      ? 一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,邮件放在邮件服务器的外出报文队列中,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。每个接收方(如 Bob)在其中的某个邮件服务器上有一个邮箱(mailbox)。Bob 的邮箱管理和维护着发送给他的报文。当 Bob 要在他的邮箱中读取该报文时,包含他邮箱的邮件服务器(使用用户名和口令)来鉴别 Bob

    • Bob邮箱发生故障怎么办?

      ? 如果 Alice 的服务器不能将邮件交付给 Bob 的服务器,例如Bob的邮件服务器没有开机。Alice的邮件服务器在一个报文队列(message queue)中保持该报文并在以后尝试再次发送。如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方(Alice)。

  • SMTP是因特网电子邮件中主要的应用层协议。

    ? 使用TCP 可靠数据传输服务

    ? SMTP 也有两个部分∶运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端

3.1 SMTP

  • 定义:SMTP 用于从发送方的邮件服务器发送报文到接收方的邮件服务器

  • SMTP的基本操作:假设 Alice 想给 Bob发送一封简单的 ASCII报文。
    1)写报文:Alice 调用她的邮件代理程序并提供 Bob的邮件地址,撰写报文,然后指示用户代理发送该报文。
    2)发报文:Alice 的用户代理把报文发给她的邮件服务器,在那里该报文被放在报文队列中。

    3)建立连接:运行在 Alice 的邮件服务器上的 SMTP客户端发现了报文队列中的这个报文,它就创建一个到运行在 Bob 的邮件服务器上的 SMTP服务器的TCP 连接
    4)开始发送:在经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送 Alice 的报文。

    5)在 Bob 的邮件服务器上,SMTP 的服务器端接收该报文。Bob的邮件服务器然后将该报文放入 Bob的邮箱中。
    6)在 Bob 方便的时候,他调用用户代理阅读该报文。

    在这里插入图片描述

  • SMTP客户?,主机名crepes.fr 和 SMTP服务器(S),主机名 hamburger.edu 之间交换报文文本的例子:

    ? 以C∶开头的 ASCIⅡ码文本行正是客户交给其TCP套接字的那些行,以S∶开头的 ASCII码则是服务器发送给其TCP套接字的那些行。一旦创建了TCP连接,就开始了下列过程:

    S: 220 hamburger.edu 
    C: HELO crepes.fr  //命令HELO
    S: 250 Hello crepes.fr,pleased to meet you 
    C:MAIL FROM:<alice@crepes. fr>  //对每个报文,该客户用一个新的 MAIL FROM 开始,用一个独立的句点指示该邮件的结束,并且仅当所有邮件发送完后才发送QUIT。
    S: 250 alice@crepes,fr ... Sender ok 
    C: RCPT TO:<bob@hamburger.edu>  //命令RCPT TO
    S: 250 bob@hamburger.edu ... Recipient ok 
    C: DATA //命令DATA
    S: 354 Enter mail,end with"." on a line by itself 
    C: Do you like ketchup?
    C: How about pickles?
    C: .  //通过发送一个只包含一个句点的行,向服务器指示该报文结束了。(按照 ASCIⅡ码的表示方法,每个报文以 CRLF.CRLF结束,其中的 CR 和LF分别表示回车和换行。)
    S: 250 Message accepted for delivery 
    C: QUIT //命令QUIT
    S: 221 hamburger.edu closing connection
    

    客户发送了五个命令:HELO、MAIL FROM、RCPT TO、DATA以及 QUIT 。

3.2 与HTTP对比

  • 相同点

    这两个协议都用于从一台主机向另一台主机传送文件

    进行文件传送时,持续的 HTTP和 SMTP都使用持续连接

  • 区别

    1. HTTP 主要是一个拉协议(pull protocol),即在方便的时候,某些人在 Web 服务器上装载信息。用户使用HTTP 从该服务器拉取这些信息。

      SMTP 基本上是一个推协议(push protocol),即发送邮件服务器把文件推向接收邮件服务器。特别是,这个 TCP 连接是由要发送该文件的机器发起的。

    2. SMTP 要求每个报文(包括它们的体)采用7 比特ASCII码格式。如果某报文包含了非7比特 ASCIⅡI字符或二进制数据(如图形文件),则该报文必须按照7 比特ASCI 码进行编码。HTTP数据则不受这种限制。

    3. 第三个重要区别是如何处理一个既包含文本又包含图形(也可能是其他媒体类型)的文档。HTTP 把每个对象封装到它自己的 HTTP响应报文中,而 SMTP则把所有报文对象放在一个报文之中。

3.3 邮件报文格式

  • 首部行:

    ? 环境信息包括在一系列首部行中,首部行和该报文的体用空行(即回车换行)进行分隔。

    ? 每个首部必须含有一个From:首部行和一个To∶首部行,也许包含一个 Subject:首部行以及其他可选的首部行。

  • 注意:这些首部行不同于3.1节所学到的 SMTP命令,那些命令是 SMTP握手协议的一部分。本节中考察的首部行则是邮件报文自身的一部分

  • 报文首部例子:

    From: alice@crepes.fr 
    To:bob0hamburger.edu
    Subject: Searching for the meaning of life.
    一个空白行
    以 ACSII格式表示的报文体
    

3.4 邮件访问协议

  • 我们来看看邮件报文到达Bob邮件服务器后的事情

    1. 当报文到达邮件服务器后就被放入了 Bob的邮箱中:前面讲过有某一个邮件服务器管理邮箱,邮箱不在端系统上。

    2. 假定 Bob是通过端系统运行的客户程序来阅读电子邮件,这里的端系统可能是办公室的 PC、便携机或者是智能手机。那么接收方在其本地 PC 上运行用户代理程序

    3. 现在考虑接收方邮件服务器应该放在哪里呢?

      • 首先,如果运行在端系统上,Alice 的邮件服务器就能直接与 Bob的PC(端系统)进行对话了。

        ? 但由于邮件服务器管理用户的邮箱,并且运行SMTP的客户端和服务器端,为了能够及时接收任何时间到达的新邮件,邮件服务器要一直开启,所以Bob的PC(端系统)必须一直保持在线。这对于许多因特网用户而言是不现实的。

      • 解决:通常情况下,本地 PC上运行一个用户代理程序,而它访问邮箱,邮箱存储在总是保持开机的共享邮件服务器上。该邮件服务器与其他用户共享,并且通常由用户的 ISP进行维护(如大学或公司)。

  • 总结:邮件报文经历了什么发送路径呢?

    ? SMTP被设计成将电子邮件从一台主机推到另一台主机。但通常Alice 的用户代理和 Bob 的邮件服务器之间并没有一个直接的 SMTP 对话。

    ? 如图,Alice 的用户代理用SMTP将电子邮件报文推入她的邮件服务器,接着她的邮件服务器(作为一个 SMTP客户)再用SMTP将该邮件中继到 Bob 的邮件服务器

    在这里插入图片描述

    • 为什么Alice需要邮件服务器呢?

      ? 因为Alice 的用户代理将没有任何办法到达一个不可达的目的地接收服务器。通过首先将邮件存放在自己的邮件服务器中,Alice的邮件服务器可以重复地尝试向 Bob 的邮件服务器发送该报文,并且如果 Alice 的邮件服务器关机,她则能向系统管理员进行申告。

      ? 所以我们知道了为什么接收方和发送方都需要邮件服务器。

  • 接收方如何通过用户代理获得位于他的某 ISP的邮件服务器上的邮件呢?

    1. 注意:Bob 的用户代理不能使用 SMTP得到报文,因为取报文是一个拉操作,而 SMTP 协议是一个推协议。

    2. 所以需要一个特殊的邮件访问协议,该协议将 Bob 邮件服务器上的报文传送给他的本地 PC

      目前邮件访问协议:

      • 第三版的邮局协议(Post Office Protocol—Version 3,POP3)

        用来将邮件从接收方的邮件服务器传送到接收方的用户代理

      • 因特网邮件访问协议(Internet Mail Access Protocol,IMAP)

        用来将邮件从发送方的邮件服务器传输到接收方的邮件服务器,也用来将邮件从发送方的用户代理传送到发送方的邮件服务器

      • HTTP

3.4.1 POP3

  • POP3啥时候开始工作?

    ? 当用户代理(是接收方的,作为客户)打开了一个到邮件服务器(也是接收方的,作为服务器)端口110上的TCP 连接后,POP3就开始工作了。

  • POP3工作过程:随着建立 TCP 连接,有三个工作过程——特许(authorization)、事务处理以及更新。

    1. 特许阶段:

      用户代理发送(以明文形式)用户名和口令以鉴别用户。

      这个阶段有两个主要的命令

      ? user <user name >pass <password>。举例假设邮件服务器的名字为 mailServer:

      telnet mailServer 110 //用户代理连接到邮件服务器POP3,端口是110
      +0K POP3 server ready //邮件服务器回答,下面有说回答的种类
      user bob //user命令
      +OK 
      pass hungry //pass命令
      +OK user successfulily 1ogged on //成功登录
      
    2. 事务处理阶段:

      • 用户代理取回报文。同时用户代理还能对报文做删除标记,取消报文删除标记,以及获取邮件的统计信息

      • 用户代理发出一些命令,服务器对每个命令做出回答。回答可能有两种∶

      ? +OK(有时后面还跟有服务器到客户的数据),被服务器用来指示前面的命令是正常的;

      ? -ERR,被服务器用来指示前面的命令出现了某些差错。

      • 事务处理过程:

        使用 POP3 的用户代理通常被用户配置为"下载并删除"或者"下载并保留"方式。POP3用户代理发出的命令序列取决于这两种方式。

        1. 下载并删除:用户代理发出 list、retr和dele命令。事务处理过程将类似于如下过程∶

          C: list //客户端请求邮件服务器列出所有存储的报文的长度
          S:1 498 
          S:2 912 
          s:. 
          C:retr 1 //从邮件服务器取回邮件
          S:(blah blah....
          S:..............
          S:.........blah)
          S:. 
          C:dele 1 //删除每封邮件
          C:retr 2 
          s:(blah blah.... 
          S:..............
          S:...blah)
          S:.
          C:dele 2 
          C:quit
          S:+OK POP3 server signing off
          

          存在的问题:

          ? 邮件接收方 Bob 可能是移动的,可能从多个端系统比如办公室的 PC、家里的 PC访问邮件。

          ? 下载并删除:将收到的报文划分在不同的端系统上。比如若Bob最先是在他办公室的PC上收取了一条邮件,那么晚上当他在家里时,通过他的便携机将不能再收取该邮件。

          ? 下载并保留:用户代理下载某邮件后,该邮件仍保留在邮件服务器上。

    3. 更新阶段:

      ? 它出现在客户发出了quit 命令之后,目的是结束该 POP3 会话。这时,该邮件服务器删除那些被标记为删除的报文。

3.4.2 IMAP

  • POP3的缺点:

    ? 一旦 Bob将邮件下载到本地主机后,他就能建立邮件文件夹,并将下载的邮件放入该文件夹中。然后 Bob 可以删除报文,在文件夹之间移动报文,并查询报文。

    ? 但是这种文件夹和报文存放在本地主机上的方式,会给移动用户带来问题,因为他想从任何一台机器上对所有报文进行访问,使用POP3是不可能做到这一点的。

  • IMAP协议可以解决这个问题。

    • IMAP服务器把每个报文与一个文件夹联系起来:

      ? 当报文第一次到达服务器时,它与收件人的 INBOX文件夹相关联。收件人能够移动邮件到自己的文件夹、能够阅读邮件、删除邮件等。

      ? IMAP协议为用户提供了创建文件夹、移动邮件到其他文件夹的命令。

    • IMAP还为用户提供了在远程文件夹中查询邮件的命令

    • IMAP还允许用户代理获取报文某些部分。比如只一个报文的报文首部。

3.4.3 基于Web的电子邮件

使用这种服务,用户代理就是普通的浏览器,用户和他远程邮箱之间的通信则通过HTTP进行。而邮件服务器之间还是使用的SMTP。

4.DNS

2.4.1 DNS提供的服务

  • 概述:

    域名系统(Domain Name System,DNS)的主要任务:进行主机名到IP 地址转换

    原因:人喜欢主机名标识,路由器喜欢定长的、有着层次结构的IP 地址

    DNS是:

    ? ①一个由分层的DNS 服务器(DNS server)实现的分布式数据库;

    ? ②一个使得主机能够查询分布式数据库的应用层协议

    DNS 协议运行在 UDP之上,使用53号端口。

  • 为什么DNS是应用层协议?他和其他应用层协议有什么区别?

    是应用层协议的原因在于:

    ? ①使用客户-服务器模式运行在通信的端系统之间;

    ? ②在通信的端系统之间通过下面的端到端运输协议来传送DNS报文。

    和其他协议的区别在于:

    ? DNS 不是一个直接和用户打交道的应用。

  • **工作过程:**DNS通常是由其他应用层协议所使用的。例子:考虑一个浏览器请求 URL www.someschool.edu/index.html 页面,用户主机必须获得 www.someschool. edu的IP地址。DNS工作如下:

    1. 同一台用户主机上运行着 DNS应用的客户端。
    2. 浏览器从上述 URL中抽取出主机名 www.someschool edu,并将这台主机名传给DNS应用的客户端。
    3. DNS客户向 DNS 服务器发送一个包含主机名的请求。DNS客户最终会收到一份回答报文,其中含有对应于该主机名的IP地址。
    4. 然后浏览器向位于该 IP 地址 80 端口的HTTP 服务器进程发起一个TCP连接。
  • DNS还能提供哪些服务?

    前面得知DNS能进行主机名到IP地址的转换,DNS还能提供以下服务:

    • 主机别名。

      ? 有着复杂主机名的主机能拥有一个或者多个别名。例如relayl.west-coast. enterprise. com 也称为规范主机名。主机别名(当存在时)比主机规范名更加容易记忆。应用程序可以调用 DNS 来获得主机别名对应的规范主机名以及主机的IP地址。

    • 邮件服务器别名。

      ? 邮件服务器的主机名可能比较复杂,电子邮件应用程序可以调用DNS对提供的主机名别名进行解析,以获得该主机的规范主机名及其IP地址。MX 记录(参见后面)允许邮件服务器和 Web 服务器使用相同主机别名。

    • 负载分配。

      ? DNS也用于在冗余的服务器(如冗余的 Web 服务器)之间进行负载分配。

      ? 由于这些冗余的 Web 服务器,一个IP地址集合与同一个规范主机名相联系。

      ? 当客户对映射到某地址集合的名字发出一个DNS请求时,该服务器用IP 地址的整个集合进行响应,但在每个回答中循环这些地址次序,这样就能在这些冗余的 Web 服务器之间循环,从而分配了负载。

2.4.2 DNS工作机理概述

  1. 应用程序调用DNS的客户端,指明需要被转换的主机名。

  2. 用户主机上的 DNS 接收到后,向网络中发送一个 DNS查询报文。所有请求和回答报文使用UDP数据报经端口 53发送。

  3. 用户主机上的 DNS接收到一个回答报文,把这个结果传递到调用DNS的应用程序。

  • DNS 的一种简单设计是在因特网上只使用一个 DNS服务器,该服务器包含所有的映射。这种集中式设计的问题包括∶

    • 单点故障。如果该 DNS 服务器崩溃,整个因特网随之瘫痪。
    • 通信容量。单个DNS服务器不得不处理所有的 DNS 查询。
    • 远距离的集中式数据库。单个 DNS 服务器不可能"邻近"所有查询客户,这将导致严重的时延。
    • 维护。单个 DNS 服务器将不得不为所有的因特网主机保留记录,还不得不为解决每个新添加的主机而频繁更新。

    因此,DNS 采用了分布式的设计方案

    1. 分布式、层次数据库

    ? DNS服务器分布在全球各处,有3种类型的 DNS服务器∶根 DNS 服务器、顶级域(Top-Level Domain,TLD)DNS 服务器和权威 DNS服务器。其层次结构如图:

    image-20211117212426487

    假定一个DNS客户要决定主机名 www.amazon.com 的IP地址

    客户首先与根服务器之一联系,它将返回顶级域名 com 的 TLD服务器的IP 地址。

    该客户则与这些TLD 服务器之一联系,它将为 amazon.com返回权威服务器的 IP 地址。

    该客户与 amazon.com 权威服务器之一联系,它为主机名 www.amazon.com 返回其IP地址。

    • 根 DNS 服务器。有400多个根名字服务器遍及全世界。这些根名字服务器由13个不同的组织管理。根名字服务器的全部清单连同管理它们的组织及其IP 地址可以在 【Root Servers 2016】 中找到。根名字服务器提供TLD服务器的IP 地址。

    • **顶级域(DNS)服务器。**对于每个顶级域(如 com、org、net、edu和 gov)和所有国家的顶级域(如uk、fr、ca和jp),都有TLD服务器(或服务器集群)。TLD服务器提供了权威 DNS 服务器的IP地址。

    • 权威 DNS服务器。一个组织机构的权威 DNS服务器收藏了一些DNS记录,这些记录是机构公共可访问主机名和ip地址的映射记录。一个组织机构可以实现它自己的权威 DNS服务器以保存这些记录,也可以支付费用,让这些记录存储在某个服务提供商的权威 DNS服务器中。

    • 本地DNS服务器。严格说来,一个本地 DNS服务器并不属于该服务器的层次结构。每个ISP都有一台本地 DNS服务器(也叫默认名字服务器)。当主机与某个ISP连接时,该ISP提供一个主机的IP 地址。该主机有一台或多台其本地 DNS服务器的IP地址。

      ? 主机的本地DNS 服务器通常"邻近"本主机。当主机发出DNS请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS服务器层次结构中。

    • 例子:我们来看一个简单的例子,假设主机cse.nyu.edu想知道主机 gaia.cs.umass.edu 的IP地址。

      ? cse. nyu.edu 主机的本地 DNS 服务器dns.nyu.edu

      ? gaia.cs.umass.edu权威DNS服务器dns.umass.edu

      1. 主机 cse.nyu.edu 首先向它的本地DNS 服务器dns.nyu.edu发送一个 DNS查询报文。该报文含有被转换的主机名gaia.cs.umass.edu

      2. 本地 DNS 服务器将该报文转发到根 DNS 服务器。该根 DNS 服务器注意到其 edu 前缀并向本地 DNS服务器返回负责 edu的TLD的IP地址列表

      在这里插入图片描述

      1. 本地 DNS服务器则再次向这些 TLD服务器之一发送查询报文。该TLD服务器注意到umass. edu前缀,并用权威DNS服务器的IP地址进行响应,该权威 DNS 服务器是负责dns.umass edu
      2. 本地 DNS 服务器直接向 dns.umass. edu重发查询报文,dns. umass. edugaia.cs.umass. edu 的IP地址进行响应。

      注意

      1. 共发送了8份 DNS报文。

      2. 有可能TLD服务器只是知道中间的某个 DNS服务器,该中间 DNS服务器依次才能知道用于该主机的权威 DNS服务器。

      3. 图2-18 所示的例子利用了递归查询(recursive query)和迭代查询(iterative query)

        ? 递归查询:从 cse.nyu.edudns.nyu.edu 发出的查询,因为该查询以自己的名义请求dns.nyu.edu来获得该映射。【实践中通常采用】

        ? 迭代查询:后继的3个查询,因为所有的回答都是直接返回给 dns.nyu.edu

        ? 图2-19显示了一条 DNS查询链,其中的所有查询都是递归的:

        在这里插入图片描述

    1. DNS 缓存
      目的:为了改善时延性能并减少在因特网上到处传输的 DNS报文数量

      ? 原理:在一个请求链中,当某 DNS 服务器接收一个 DNS 回答时,它能将映射缓存在本地存储器中。例如,在图 2-18 中,每当本地 DNS 服务器 dns.nyu.edu 从某个DNS服务器接收到一个回答,它能够缓存包含在该回答中的任何信息。

      ? DNS 服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。

      ? 本地 DNS服务器也能够缓存 TLD 服务器的IP地址,因而允许本地 DNS绕过查询链中的根 DNS服务器。

2.4.3 DNS记录和报文

  • 资源记录:

    ? DNS 服务器存储了资源记录(Resource Record,RR),RR 提供了主机名到IP地址的映射。每个 DNS回答报文包含了一条或多条资源记录。

    ? 资源记录是一个包含了下列字段的4元组∶(Name,Value,Type,TTL)

    • TTL 是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。

    • Type决定了Name 和 Value 的值:

      • 如果 Type=A,则 Name是主机名,Value 是该主机名对应的IP地址。这条RR提供了标准的主机名到 IP 地址的映射

      ? 例如(relay1. bar. foo.com,145.37.93.126,A)就是一条类型A记录。

      • 如果Type =NS,则Name 是个域(如 foo. com),而 Value 是个知道如何获得该域中主机 IP地址的权威 DNS 服务器的主机名。这个记录用于沿着查询链来路由 DNS 查询。例如(foo.com,dns. foo. com,NS)就是一条类型为 NS的记录。

      • 如果 Type =CNAME,则 Value 是别名为 Name 的主机对应的规范主机名。该记录
        能够向查询的主机提供一个主机名对应的规范主机名。例如(foo,com.relay1. bar.foo.com,CNAME)就是一条 CNAME类型的记录。

      • 如果 Type = MX,则Value 是个别名为 Name 的邮件服务器的规范主机名。为了获得邮件服务器的规范主机名,DNS客户应当请求一条 MX记录;而为了获得其他服务器的规范主机名,DNS客户应当请求CNAME 记录。

    • 用于某特定主机名的权威 DNS 服务器有一条包含用于该主机名的类型A记录。

      如果服务器不是用于某主机名的权威服务器,那么将包含一条类型NS记录,该记录对应干包含主机名的域;它还将句括一条类型A 记录,该记录提供了在 NS记录的 Value 字段中的 DNS服务器的IP 地址。

  • DNS报文
    DNS 查询和回答报文有相同的格式:

    在这里插入图片描述

    • 前12个字节是首部区域:

      第一个字段(标识符)是一个16比特的数,用于标识该查询。它会被复制到回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。

      标志字段中:1 比特的"查询/回答"标志位指出报文是查询报文(0)还是回答报文(1)。

      ? 1 比特的"希望递归"标志位。

      ? 1比特的"递归可用"标志位:若该DNS服务器支持递归查询,它的回答报文中会此对置位。

      还有4个有关数量的字段,这些字段指出了在首部后的4类数据区域出现的数量。

    • 问题区域包括:

      ①名字字段:正在被查询的主机名字;

      ②类型字段:有关该名字的正被询问的问题类型,例如主机地址是与一个名字相关联(类型A)还是与某个名字的邮件服务器相关联(类型 MX)

    • 回答区域:对最初请求的名字的资源记录。

      在回答报文的回答区域中可以包含多条 RR,因此一个主机名能够有多个IP地址

    • 权威区域包含了其他权威服务器的记录。

    • 附加区域包含了其他有帮助的记录。例如:对一个MX请求的回答报文的回答区域包含了一条资源记录,该记录提供了邮件服务器的规范主机名。该附加区域包含一个类型A记录,该记录提供了用于该邮件服务器的规范主机名的IP 地址。

  • 在 DNS数据库中插人记录

    ? 上面的讨论是关于如何从 DNS数据库中取数据,本节讨论数据最初是怎么进入数据库中的:

    1. 当你向某些注册登记机构注册域名 networkutopia. com 时,需要向该机构提供你的基本和辅助权威 DNS服务器的名字和 IP地址(假定名字和IP地址是:dns1.networkutopia.com212.212.212.1dns2.networkutopia. com212.212.212.2)。

    2. 对这两个权威DNS服务器,该注册登记机构确保将一个类型 NS 和一个类型 A 的记录输入TLD com 服务器。下列两条资源记录被插入该 DNS系统中∶

    	(networkutopia.com,dnsl.networkutopia.com,NS)
    
    	(dns1.networkutopia.com,212.212.212.1,A)
    
    1. 你还必须确保用于Web 服务器 www.networkutopia.com类型A 资源记录

      用于邮件服务器 mail.networkutopia.com 的类型 MX 资源记录被输入你的权威 DNS 服务器中。

    2. 一旦完成所有这些步骤,人们将能够访问你的Web 站点,并向你公司的雇员发送电子邮件。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 08:28:41  更:2021-11-25 08:30:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:17:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码