计算机网络第七版·第二章 应用层
思维导图: https://www.mubu.com/doc/2Rh6HHN-f8A
一. 应用层协议原理
1.1 网络应用程序体系结构
应用程序是一个广义的概念,指的是任何能在计算机或其他设备上运行的软件程序。它可以独立运行,不依赖于网络连接。
网络应用程序是必须通过网络才能实现其核心功能的应用程序。它通常由运行在不同设备上的多个进程(例如,客户端和服务器)组成,这些进程通过网络相互通信来完成任务。
应用程序体系结构由应用程序研发者设计, 规定了如何在各种端系统上组织该应用程序 。
- 客户-服务器(Client-Server)体系结构:有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。在客户-服务器体系结构中,客户相互之间不直接通信。
- 对等(P2P)体系结构:这种模型则允许不同的设备(对等方)之间直接通信和共享资源,而无需依赖中心化的服务器。
1.2 进程通信
在网络环境中,进行通信的是进程(运行在端系统中的一个程序)。
- 当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信
- 在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信
1.客户和服务器进程
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文:
- 客户(Client):发起通信的进程。
- 服务器(Server):等待通信建立的进程。
2.进程与计算机网络之问的接口
进程通过一个称为 套接字 (socket)的软件接口向网络发送报文和从网络接收报文 。
套接字是同一台主机内应用层与运输层之间的接口,是应用程序和网络之间的 API。
应用程序开发者可以控制套接字的应用层部分,但对传输层的控制有限,主要是选择传输层协议(如 TCP)并设置一些参数。
3.进程寻址
为了确保报文能准确到达目的地,接收进程需要两个关键信息:
- 主机地址:在互联网中,由IP 地址唯一标识。
- 端口号(Port Number):用于在目标主机上指定接收报文的特定进程。例如,Web 服务器使用端口号 80,邮件服务器使用端口号 25。
1.3 可供应用程序使用的运输服务
应用程序在通过网络进行通信时,需要选择合适的运输层协议。这些协议通过套接字为应用程序提供服务,我们大体能够从四个方面对应用程序服务要求进行分类:可靠数据传输 、 吞吐量、定时和安全性 。
1.可靠数据传输
- 定义:确保应用程序发送的所有数据都能无差错、完整地交付给接收方。
- 需求:对数据丢失不容忍的应用,如电子邮件、文件传输、Web文档传输和金融交易。
- 非可靠传输:某些应用,如实时多媒体(音频/视频),可以容忍少量数据丢失,因此不需要可靠数据传输服务。
2.吞吐量
- 定义:发送进程向接收进程交付比特的速率。
- 运输层协议能够以某种特定的速率提供确保的可用吞吐量 。 使用这种服务,该应用程序能够请求r比特/ 秒的确保吞吐量,并且该运输协议能够确保可用吞吐量总是为至少r比特/秒。
- 带宽敏感应用:这类应用对吞吐量有特定的、有保障的速率要求,如在线视频会议(需要保持恒定的数据速率以避免卡顿)。
- 弹性应用:这类应用可以根据当前可用的带宽进行调整,吞吐量越高越好,但没有固定的速率要求。例如,文件下载和网页浏览。
3.定时
- 定义:确保数据在严格的时间限制内从发送方到达接收方。
- 需求:交互式实时应用,如网络电话、多人在线游戏和视频会议。较长的延迟会导致体验下降或失去真实感。
4.安全性
- 定义:运输层协议可以提供加密、解密等安全服务,以保护通信数据的机密性和完整性。
- 功能:在发送端对数据进行加密,在接收端进行解密,以防止数据在传输过程中被窃取或篡改。
1.4 因特网提供的运输服务
至此,我们已经考虑了计算机网络能够提供的通用运输服务。现在我们要更为具体地考察由因特网提供的运输服务类型 。因特网为应用程序提供两个运输层协议,即 UDP 和 TCP 。
1.TCP 服务
TCP(传输控制协议)主要提供以下服务:
- 面向连接:在数据传输前,客户端和服务器之间会进行“握手”来建立连接。这个连接是双向的,允许双方同时收发数据。通信结束后,需要断开连接。
- 可靠数据传输:TCP 确保所有数据都会无差错、按顺序地到达接收方,不会丢失或重复。
- 拥塞控制:当网络出现拥塞时,TCP 会降低数据发送速率,以避免加剧网络堵塞,并试图公平地分配网络带宽。
需要可靠传输的应用,如文件传输、电子邮件和网页浏览,通常会选择 TCP。
2.UDP 服务
UDP(用户数据报协议)是一种轻量级、无连接的协议,它只提供最基础的服务:
- 无连接:在通信前无需进行握手,直接发送数据。
- 不可靠数据传输:UDP 不保证数据报文能到达接收方,也不保证到达的顺序。
- 无拥塞控制:UDP 不会限制发送方的速率,这使得它能以尽可能快的速度向网络注入数据,但可能会导致网络拥塞。
UDP 主要适用于那些能容忍数据丢失但对时间敏感的应用,例如网络电话、视频会议和在线游戏。
1.5 应用层协议
应用层协议定义了运行在不同端系统上的应用程序如何相互传递报文。
一个应用层协议主要定义以下几个方面:
- 报文类型:例如,区分请求报文和响应报文。
- 报文语法:规定报文的结构,包括各个字段的排列和描述方式。
- 字段语义:解释报文中每个字段的具体含义。
- 通信规则:明确何时发送报文以及如何对报文进行响应。
二. Web和HTTP
2.1 HTTP概况
HTTP(超文本传输协议)是万维网(Web)的核心应用层协议,它定义了Web客户端(通常是浏览器)和Web服务器之间如何通过交换报文来通信。
核心概念
- Web 页面:由多个对象组成。一个对象就是一个文件,例如 HTML 文件、图片或视频。一个 Web 页面通常包含一个基本 HTML 文件和它引用的其他对象。
- URL:每个对象都有一个唯一的 URL 地址,它由主机名(存放对象的服务器)和路径名(对象在服务器上的位置)两部分组成。
- 客户端与服务器:
- 客户端:由 Web 浏览器实现,负责向服务器发送请求报文。
- 服务器:存储 Web 对象,接收客户端请求并发送响应报文。
HTTP 的工作方式
- 基于 TCP:HTTP 使用 TCP 作为其底层的传输协议,这意味着它能利用 TCP 提供的可靠数据传输服务。HTTP 不必担心数据丢失或乱序,因为这些问题都由 TCP 负责处理。
- 请求-响应模式:当用户在浏览器中请求一个网页时,浏览器会:
- 首先与服务器建立 TCP 连接。
- 然后通过这个连接发送 HTTP 请求报文。
- 服务器接收请求后,会发送包含所请求对象的 HTTP 响应报文。
- 无状态协议:HTTP 协议是无状态的。这意味着服务器不会保存任何关于之前客户端请求的状态信息。即使同一个客户端在短时间内多次请求同一个对象,服务器也会像第一次请求一样处理,重新发送对象。
2.2 非持续连接和持续连接
HTTP 协议有两种主要的连接方式,它们决定了客户端和服务器如何处理一系列的请求和响应:非持续连接和持续连接。
1.非持续连接
- 工作原理:对于每一个请求-响应事务(例如,获取一个网页对象),都会建立一个新的 TCP 连接。服务器发送完响应报文后,会立即关闭该连接。
- 过程示例:
- 性能开销:
- 时间开销:每次连接都需要进行一次 TCP“三次握手”,这会增加额外的往返时间(RTT)。获取一个对象通常需要两个 RTT(一个用于建立连接,另一个用于请求和接收数据),再加上数据传输时间。
- 服务器资源开销:频繁地建立和关闭连接会消耗服务器的资源(如缓冲区和变量),给服务器带来较大负担。
2.持续连接
- 工作原理:服务器在发送响应后会保持 TCP 连接处于打开状态。客户端可以利用这个相同的连接,发送后续的请求和接收响应,直到一段时间不活动后(可配置的超时),服务器才会关闭连接。
- 优点:
- 减少开销:避免了为每个对象重复进行 TCP 连接的建立和关闭过程,从而减少了服务器的资源消耗。
- 提高效率:节省了大量的 RTT 时间。多个对象可以通过单个连接快速传输,甚至可以采用“流水线”方式,即客户端可以连续发送请求,而无需等待上一个请求的响应。
- 应用:HTTP/1.1 及其更高版本的默认模式就是持续连接。HTTP/2 进一步优化了这一点,允许在同一连接中并发交错地发送多个请求和响应。
2.3 HTTP报文格式
1.HTTP 请求报文GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
通用格式:一个 HTTP 请求报文由三部分组成:
- 请求行(Request Line):报文的第一行。
- 首部行(Header Lines):紧跟在请求行之后,可以有多行。
- 实体体(Entity Body):在首部行之后,用一个空行分隔。
- 请求行包含三个字段:
- 方法字段:定义了客户端想要执行的操作。常见方法有:
GET
:请求获取指定 URL 的对象。这是最常用的方法。POST
:用于提交表单数据,数据通常包含在报文的实体体中。HEAD
:与GET
类似,但服务器只返回响应报文的首部,不返回实体体,常用于调试。PUT
:用于向服务器上传对象。DELETE
:用于删除服务器上的对象。
- URL 字段:指定了请求对象的路径。
- HTTP 版本字段:指明客户端使用的 HTTP 版本,如
HTTP/1.1
。
- 方法字段:定义了客户端想要执行的操作。常见方法有:
- 首部行提供了关于请求的附加信息,例如:
Host:
:指定了请求对象所在的主机名。Connection:
:指示是否使用持续连接,close
表示请求服务器在发送完响应后关闭连接。User-agent:
:识别发出请求的浏览器类型。Accept-language:
:表示客户端希望接收的对象语言版本。
2.HTTP 响应报文HTTP/1.l 200 OK
Connection: close
Date: Tue,18 Aug 2015 15:44:04GMT
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 ... )
通用格式:一个 HTTP 响应报文也由三部分组成:
- 状态行(Status Line):报文的第一行。
- 首部行(Header Lines):紧跟在状态行之后,可以有多行。
- 实体体(Entity Body):在首部行之后,用一个空行分隔。
- 状态行包含三个字段:
- HTTP 版本:服务器使用的 HTTP 协议版本。
- 状态码:一个三位数字,表示请求的结果。
- 状态信息:对状态码的简短描述。
- 常见状态码:
200 OK
:请求成功,响应实体体中包含请求的对象。301 Moved Permanently
:请求的对象已永久移动到新的 URL。400 Bad Request
:服务器无法理解请求报文。404 Not Found
:请求的对象在服务器上不存在。505 HTTP Version Not Supported
:服务器不支持客户端使用的 HTTP 版本。
- 首部行提供了关于响应的附加信息,例如:
Date:
:服务器生成并发送此响应报文的日期和时间。Server:
:标识服务器的类型,如Apache
。Last-Modified:
:指示对象在服务器上最后被修改的日期和时间,常用于缓存机制。Content-Length:
:被发送对象的大小(字节数)。Content-Type:
:实体体中对象的类型,如text/html
。
- 实体体:如果请求成功,实体体中将包含客户端请求的实际对象(例如 HTML 文件内容)。
2.4 用户与服务器的交互 : cookie
虽然 HTTP 本身是无状态的,但为了让服务器能够识别和跟踪特定用户,Web 站点广泛使用了 cookie 技术。Cookie 允许服务器在无状态的 HTTP 协议之上,建立一个有状态的用户会话层。
Cookie 的四个组成部分
一个完整的 Cookie 体系包含以下四个关键部分:
- HTTP 响应报文中的
Set-cookie:
首部行:服务器生成一个唯一的识别码,并通过这个首部发送给用户的浏览器。 - 用户端系统的 Cookie 文件:浏览器接收到识别码后,会将其存储在一个本地文件中。
- HTTP 请求报文中的
Cookie
首部行:当用户再次访问该网站时,浏览器会从本地文件中读取识别码,并在每个发送给服务器的请求报文中附带上这个Cookie
首部。 - Web 站点的后端数据库:服务器使用这个识别码作为索引,在数据库中存储和检索与该用户相关的状态信息,例如购物车内容、浏览历史等。
Cookie 的工作流程
以一个用户首次访问 Amazon 网站为例: - 用户(Susan)首次访问 Amazon,服务器会为她生成一个唯一的识别码(例如
1678
)。 - 服务器在响应报文中包含
Set-cookie: 1678
这个首部行,发送给 Susan 的浏览器。 - 浏览器将
amazon.com
和1678
写入本地的 Cookie 文件。 - 此后,当 Susan 再次向 Amazon 发送请求时,浏览器会自动在请求报文中加上
Cookie: 1678
。 - Amazon 服务器通过这个识别码,就能在后端数据库中找到 Susan 的相关信息,从而实现追踪她的浏览行为、提供购物车服务,甚至实现“一键购物”等个性化功能。
争议与隐私
虽然 cookie 为用户带来了便利,但其使用也存在争议。通过将 cookie 与用户提供的个人信息(如姓名、邮箱等)关联起来,Web 站点可以建立详细的用户画像,这些信息可能会被出售给第三方,引发了对用户隐私的担忧。
2.5 Web缓存
Web 缓存器(或代理服务器)是一种网络实体,它代表初始 Web 服务器来处理 HTTP 请求。它在本地存储最近请求过的对象的副本,以提高性能和节省带宽。
1.工作原理
当用户的浏览器被配置为使用 Web 缓存器时,其工作流程如下:
- 请求发送:浏览器首先向 Web 缓存器发送对某个对象的 HTTP 请求。
- 缓存命中:如果缓存器本地有该对象的副本,它会立即将副本发送给浏览器。
- 缓存未命中:如果缓存器没有该对象,它会作为客户端,向对象的初始服务器发送请求。
- 接收与存储:初始服务器将对象发送给缓存器。缓存器在将对象发送给浏览器之前,会在本地存储一份副本。
Web 缓存器通常由 ISP 购买并安装。例如, 一所大学可能在它的校园网上安装一台缓存器,并且将所有校园网上的用户浏览器配置为指向它 。
2.主要优势
部署 Web 缓存器主要有两大好处:
- 减少响应时间:如果用户请求的对象在缓存器中,它可以立即响应,大大缩短了用户获取对象的时间,尤其是在用户与初始服务器之间的网络连接较慢时。
- 减少网络流量:缓存器能拦截大量请求,从而减少一个机构(如大学或公司)通往互联网的接入链路的流量。这不仅降低了机构的带宽成本,也减轻了整个互联网的流量压力。
3.HTTP 条件 GET:解决缓存陈旧问题
为了解决 Web 缓存器中对象副本可能过时的问题,HTTP 协议提供了一种名为条件 GET的机制。通过这种机制,缓存器可以在不重新下载整个对象的情况下,验证其本地副本是否仍然是最新的。
- 条件 GET 的定义
- 一个 HTTP 请求报文被称为“条件 GET”,需满足两个条件:
- 报文方法为
GET
。 - 报文中包含一个特殊的首部行:
If-Modified-Since:
。
- 报文方法为
- 一个 HTTP 请求报文被称为“条件 GET”,需满足两个条件:
- 工作流程
条件 GET 的工作流程如下:- 首次请求:
- 客户端(通过缓存器)首次向服务器请求一个对象。
- 服务器返回该对象,并在响应报文中包含
Last-Modified:
首部,指明对象的最后修改时间。 - 缓存器将该对象及其最后修改时间一同存储。
- 后续请求(缓存验证):
- 当另一个用户请求同一个对象时,缓存器会检查其本地副本。
- 缓存器发送一个条件 GET 报文,其中
If-Modified-Since:
首部的值就是之前服务器提供的Last-Modified:
时间。这个报文的作用是询问服务器:“如果这个对象自从这个时间之后没有被修改过,就不要再发给我了。”
- 服务器响应:
- 未修改:如果服务器上的对象没有被修改,它会返回一个状态码为
304 Not Modified
的响应报文,并且实体体为空。这告诉缓存器,它的本地副本仍然有效。 - 已修改:如果服务器上的对象已经被修改,它会像首次请求一样,返回一个状态码为
200 OK
的完整响应报文,其中包含新的对象。
- 未修改:如果服务器上的对象没有被修改,它会返回一个状态码为
- 首次请求:
三.因特网中的电子邮件
因特网电子邮件是一种广泛使用的异步通信方式,它快速、廉价且易于分发。其核心系统由三个主要组件构成:用户代理、邮件服务器和简单邮件传输协议(SMTP)。
异步通信方式是指发送方和接收方不需要同时在线就能进行通信。
1.主要组成部分
- 用户代理(User Agent):这是用户用来管理和收发邮件的客户端程序,例如微软的 Outlook 。当用户撰写完邮件后,用户代理会将邮件发送到用户的邮件服务器。
- 邮件服务器(Mail Server):这是电子邮件系统的核心。每个用户都有一个位于某个邮件服务器上的邮箱,用于存储和维护发给他们的邮件。当发送方邮件服务器无法立即交付邮件时,它会把邮件保存在报文队列中,并定期重试发送。
- 简单邮件传输协议(SMTP):这是因特网电子邮件的主要应用层协议。SMTP 使用 TCP 提供的可靠数据传输服务,负责将邮件从发送方的邮件服务器传输到接收方的邮件服务器。在邮件传输过程中,一台邮件服务器既可以作为 SMTP 客户端(发送邮件时),也可以作为 SMTP 服务器(接收邮件时)。
2.邮件传输流程
整个电子邮件的传输过程可以概括为:
- 撰写与发送:发送方的用户代理将邮件发送给其邮件服务器,邮件被放入外出报文队列。
- 服务器间传输:发送方的邮件服务器使用 SMTP 将邮件发送给接收方的邮件服务器。
- 接收与存储:接收方的邮件服务器接收邮件,并将其存入接收方的邮箱中。
- 读取:接收方使用其用户代理,从其邮件服务器的邮箱中获取并读取邮件。
3.1 SMTP
SMTP (Simple Mail Transfer Protocol) 是因特网电子邮件系统的核心应用层协议,定义于 RFC 5321。它主要负责将邮件从发送方的邮件服务器传输到接收方的邮件服务器。
1.基本特性
- 历史悠久:SMTP 协议的历史比 HTTP 还要长,因此带有一些时代的烙印。
- 7 比特 ASCII 限制:SMTP 最初的设计限制所有邮件报文内容必须是简单的 7 比特 ASCII 码。在多媒体时代,这意味着二进制数据(如图片、视频)在传输前需要先编码成 ASCII 文本,传输后再解码,这增加了复杂性。
- 依赖 TCP:SMTP 使用 TCP 协议,因此能够利用其提供的可靠数据传输服务,确保邮件能够无差错地送达目标服务器。
- 持续连接:SMTP 使用持续连接,允许发送服务器通过同一个 TCP 连接向接收服务器发送多封邮件,从而提高效率。
2.Alice向Bob发送一条报文
1) Alice 调用她的邮件代理程序并提供 Bob 的邮件地址(例如 bob@ someschool. edu) , 撰写报文,然后指示用户代理发送该报文。
2) Alice 的用户代理把报文发给她的邮件服务器,在那里该报文被放在报文队列中 。
3)运行在 Alice 的邮件服务器上的 SMTP 客户端发现了报文队列中的这个报文,它就 创建一个到运行在 Bob 的邮件服务器上的 SMTP 服务器的 TCP 连接 。
4) 在经过一些初始 SMTP 握手后,SMTP 客户通过该 TCP 连接发送 Alice 的报文。
5) 在 Bob 的邮件服务器上,SMTP 的服务器端接收该报文。Bob 的邮件服务器然后将 该报文放入 Bob 的邮箱中。
6) 在 Bob 方便的时候,他调用用户代理阅读该报文 。
3.邮件传输流程
SMTP 在两个邮件服务器之间直接建立连接,而不是通过中间服务器。传输过程涉及客户端(发送服务器)和服务器端(接收服务器)之间的一系列“对话”和“握手”:
1.建立连接:发送方的 SMTP 客户端在默认的 25 号端口与接收方的 SMTP 服务器建立 TCP 连接。
2.握手:客户端和服务器通过一系列命令(如 HELO
、MAIL FROM
、RCPT TO
)进行自我介绍,并确定发送方和接收方的地址。
3.发送数据:客户端使用 DATA
命令开始发送邮件报文。报文内容结束后,客户端发送一个只包含一个句点的行来表示邮件结束。
4. **接收与存储**:接收方服务器接收报文,并将其放入目标用户的邮箱。
5.**关闭连接**:邮件发送完毕后,客户端发送 `QUIT` 命令,关闭 TCP 连接。
如果接收服务器离线,发送服务器会把邮件保存在队列中,定期重试发送,直到成功为止。如果多次重试仍失败,邮件最终会被删除,并通知发送方。
3.2 与HTTP的对比
虽然 SMTP 和 HTTP 都用于在主机间传输文件,但它们在工作方式上有几个关键区别:
- 推 vs. 拉:
- HTTP 主要是拉协议(Pull Protocol):客户端(浏览器)主动发起 TCP 连接,从服务器“拉取”所需的文件。
- SMTP 主要是推协议(Push Protocol):发送方邮件服务器主动发起 TCP 连接,将邮件文件“推”给接收方邮件服务器。
- 数据格式限制:
- SMTP 协议要求所有邮件报文(包括正文)必须是7 比特 ASCII 码格式。这意味着非 ASCII 字符或二进制数据在传输前需要进行编码。
- HTTP 则没有这种格式限制,可以直接传输任何类型的数据。
- 多对象处理:
- 首部行(Header Lines):位于报文体之前,由 RFC 5322 定义。这些首部行提供关于邮件的元信息。
- 每一行都由一个关键字、一个冒号和其值组成,例如
From:
、To:
和Subject:
。 - 邮件报文必须包含
From:
和To:
首部行。 - 这些首部行是邮件内容的一部分,与 SMTP 传输过程中的命令(如
MAIL FROM
)是分开的。
- 每一行都由一个关键字、一个冒号和其值组成,例如
- 报文体(Message Body):紧跟在首部行后的一个空行(回车换行符)之后。
- 报文体以 ASCII 格式表示,包含实际的邮件内容。
3.4 邮件访问协议
在现代电子邮件系统中,SMTP 协议负责将邮件从发送方的邮件服务器“推送”到接收方的邮件服务器。然而,接收方用户如何从服务器上“拉取”邮件到自己的设备(如 PC、手机)上,则需要依赖专门的邮件访问协议。目前主流的邮件访问协议有 POP3、IMAP 和基于 Web 的 HTTP。
1.POP3 (Post Office Protocol, Version 3)
- 工作方式:POP3 是一个非常简单的协议,它将邮件从服务器下载到本地设备。
- 会话阶段:
- 特许(Authorization):用户通过明文用户名和密码进行身份验证。
- 事务处理(Transaction):用户可以列出、取回或标记要删除的邮件。
- 更新(Update):用户发送
QUIT
命令后,服务器会删除所有被标记为删除的邮件。
- 两种模式:
- 下载并删除:邮件被下载到本地后,服务器上的副本会被删除。这种方式不适合多设备访问,因为邮件只存在于一台设备上。
- 下载并保留:邮件被下载后,服务器上的副本仍然保留。这允许用户从多台设备上访问同一封邮件。
- 特点:POP3 协议是无状态的,它不保存会话期间的状态信息,简化了服务器的实现。
2.IMAP (Internet Mail Access Protocol)
- 工作方式:IMAP 比 POP3 更复杂、功能更强大。它允许用户在远程邮件服务器上直接管理邮件,而不是将其全部下载到本地。
- 主要优势:
- 远程文件夹管理:IMAP 支持在服务器上创建、删除和管理邮件文件夹,方便用户从任何设备访问统一的邮件组织结构。
- 状态维护:IMAP 服务器会保存用户会话的状态信息,例如哪些邮件被标记为已读、邮件所在文件夹等。
- 部分邮件获取:用户可以选择只下载邮件的特定部分(如只下载邮件首部),这在网络带宽较低的情况下非常有用。
3.基于 Web 的电子邮件 (Web-based Email)
- 工作方式:许多流行的电子邮件服务(如 Gmail、Outlook.com)允许用户通过 Web 浏览器来收发邮件。
- 协议:在这种模式下,用户代理就是浏览器。用户与远程邮箱之间的通信使用的是 HTTP 协议,而不是 POP3 或 IMAP。
- 端到端流程:
- 当用户(如 Alice)通过浏览器发送邮件时,邮件通过 HTTP 传输到她的邮件服务器。
- 当用户(如 Bob)通过浏览器读取邮件时,邮件通过 HTTP 从他的邮件服务器传输到他的浏览器。
- 但在不同邮件服务器之间传输邮件时,仍然使用的是 SMTP 协议。
四.DNS:因特网的目录服务
因特网上的主机也有不同的标识方法,每种方法都有其适用场景。
- 主机名(Hostname):
- 特点:主机名如
www.google.com
,是人们乐于使用的、易于记忆的字母数字字符串。 - 用途:主要用于方便人类用户访问网站。
- 缺点:主机名通常不包含主机在因特网中的具体位置信息,且长度不固定,这使得路由器难以直接处理。
- 特点:主机名如
- IP 地址(IP Address):
- 特点:IP 地址是一个由 4 个字节组成的数字串(如
121.7.106.83
),每个字节用句点分隔,取值范围为 0 到 255。 - 用途:主要用于因特网中的路由器识别和寻址主机。IP 地址具有严格的层次结构,从左到右依次提供关于主机位置的越来越具体的信息,这类似于邮政地址的结构。
- 优点:IP 地址的固定长度和分层结构使其非常适合路由器的自动化处理。
- 特点:IP 地址是一个由 4 个字节组成的数字串(如
4.1 DNS 提供的服务
DNS(域名系统)是一种核心的因特网服务,旨在解决人类习惯使用的主机名与路由器所需的IP 地址之间的矛盾。它主要由一个分布式数据库和一套应用层协议组成。
DNS协议运行在UDP上。
DNS 的核心功能:主机名到 IP 地址的转换
- 用户代理发起请求:当用户在浏览器中输入一个主机名(如
www.someschool.edu
),浏览器会调用 DNS 客户端。 - DNS 客户端查询:DNS 客户端向 DNS 服务器发送一个包含该主机名的请求。
- DNS 服务器响应:DNS 服务器查找该主机名对应的 IP 地址,并将其返回给客户端。
- 建立连接:浏览器接收到 IP 地址后,便可以向该地址的 Web 服务器发起 TCP 连接,从而获取所需内容。
这个过程会引入额外的时延,但由于 IP 地址通常被缓存在附近的 DNS 服务器中,可以有效减少延迟和网络流量。
DNS 提供的其他重要服务
除了核心的地址转换功能,DNS 还提供了以下服务:
- 主机别名(Host Aliasing):DNS 允许复杂的主机名(如
relay1.west-coast.enterprise.com
)拥有更易于记忆的别名(如enterprise.com
)。DNS 服务器能将别名解析为对应的规范主机名及其 IP 地址。 - 邮件服务器别名(Mail Server Aliasing):与主机别名类似,DNS 允许邮件服务器使用简单的别名(如
yahoo.com
),并将其解析为复杂的规范主机名和 IP 地址。这使得用户能使用简洁的电子邮件地址(如bob@yahoo.com
)。 - 负载分配(Load Distribution):对于流量巨大的网站,DNS 可以将请求在多台冗余服务器之间进行分配。当 DNS 收到对某个主机名的请求时,它会返回一个包含所有服务器 IP 地址的列表,并通过循环的方式改变列表的顺序。由于客户端通常会连接列表中的第一个 IP 地址,DNS 从而实现了服务器间的负载均衡。
4.2 DNS工作原理概述
DNS(域名系统)的客户端是应用程序,它将人类易记的主机名转换为路由器需要的IP 地址。这个看似简单的过程背后,是一个复杂但高效的分布式、层次化的服务器系统。
1.集中式设计的弊端
如果使用一个单一的集中式 DNS 服务器,将面临以下不可扩展的问题:
- 单点故障:一旦服务器崩溃,整个互联网的主机名解析都会瘫痪。
- 巨大的流量:单个服务器无法处理全球亿万主机的所有查询请求。
- 高时延:查询者与服务器之间的地理距离过远会导致严重的网络延迟。
- 难以维护:集中式数据库会变得极其庞大,并且需要频繁更新以应对新主机的加入。
为了解决这些问题,DNS 采用了分布式设计。
2.分布式、层次化的 DNS 服务器
DNS 服务器被组织成一个层次结构,主要分为四类:
- 根 DNS 服务器(Root DNS Server):位于层次结构的顶端,全球有 400 多个,由 13 个组织管理。它们不存储所有主机的 IP 地址,只知道顶级域(TLD)DNS 服务器的地址。
- 顶级域(TLD)DNS 服务器:负责处理特定顶级域(如
.com
、.org
、.edu
)的查询。它们知道这些域内权威 DNS 服务器的地址。 - 权威 DNS 服务器(Authoritative DNS Server):某个组织(如大学或公司)的权威服务器,负责存储该组织所有主机的 IP 地址映射。
- 本地 DNS 服务器(Local DNS Server):严格来说不属于层次结构,但对 DNS 查询至关重要。每个 ISP 都有一个本地 DNS 服务器,充当主机的代理。当主机发出 DNS 查询时,首先会发送给本地 DNS 服务器。
3.查询过程与类型
一个典型的查询过程(从主机到权威服务器)如下:
- 主机向本地 DNS 服务器发送查询。
- 本地 DNS 服务器向根 DNS 服务器查询,根服务器返回 TLD 服务器地址。
- 本地 DNS 服务器向TLD 服务器查询,TLD 服务器返回权威 DNS 服务器地址。
- 本地 DNS 服务器向权威 DNS 服务器查询,权威服务器返回最终的 IP 地址。
- 本地 DNS 服务器将 IP 地址返回给主机。
查询类型:
- 递归查询(Recursive Query):查询主机(客户端)向 DNS 服务器发出查询,并要求该服务器代表它完成整个查询过程。
- 迭代查询(Iterative Query):查询主机向 DNS 服务器发出查询,如果该服务器不知道答案,则返回另一个服务器的地址,由查询主机再次向新服务器发起查询。
实践中,从主机到本地 DNS 服务器的查询通常是递归的,而本地 DNS 服务器向其他 DNS 服务器的查询则是迭代的。
4.DNS 缓存
为了减少延迟和网络流量,DNS 系统广泛使用缓存技术。任何 DNS 服务器在接收到查询回答后,都会将主机名到 IP 地址的映射关系缓存在本地。在一段时间内,如果再有对同一主机名的查询,该服务器可以直接从缓存中返回结果,而无需再次进行冗长的查询过程。由于缓存的存在,大部分 DNS 查询都可以绕过根服务器,从而大大提高了效率。
五.P2P文件分发
- 客户-服务器的弊端:服务器必须为每个用户单独发送一份完整的文件副本。这给服务器带来巨大负担,并消耗大量上行带宽,容易成为性能和扩展性的瓶颈。
- P2P的优势:每个对等方在下载文件片段的同时,能立即将自己已拥有的片段重新分发给其他对等方。这种方式利用所有用户的资源来共同分担分发任务,极大地减轻了原始服务器的压力和带宽消耗。