应用层
基本概念
为了向用户提供端到端的服务,应用层针对不同的服务类型及其特点制定了对应的应用层协议。针对不同应用层协议的功能,人们将其划分为了以下三种:
- 基础设施类:例如域名系统 (Domain Name System, DNS)、动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP);
- 应用架构类:
- 客户端-服务器架构 (Client-Server, C/S),例如远程登陆协议 (Telecommunication Network, TELNET)、电子邮件协议 (SMTP/POP3/IMAP)、超文本传输协议 (HTTP)、文件传输协议 (File Transfer Protocol, FTP) 等;
- 对等架构 (Peer-to-Peer, P2P),即 P2P 协议;
- 混合架构 (C/S & P2P);
- 网络管理类:简单网络管理协议 (Simple Network Management Protocol, SNMP)。
DHCP 协议
每一个客户端在联网时都需要一个 IP 地址、子网掩码、默认路由器的 IP 地址、域名服务器的 IP 地址。这些信息通常存储在一个配置文件中,计算机在引导过程中可以对这个文件进行存取。
动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP) 提供了自动获取上述信息的机制。具体地,DHCP 基于 C/S 架构,自动为主机分配 IP 地址及其他的重要参数,客户端端口默认 68,服务端端口默认 67,使用 UDP 协议进行传输。
如上两图所示:
- 主机广播请求:主机 A 首先基于 MAC 地址向同一个局域网中的所有终端广播寻找 DHCP 服务器的地址,一般都是找路由器,当然路由器也可以继续使用 UDP 传输协议去互联网找对应的 DHCP 服务器地址;
- DHCP 服务器单播响应:DHCP 服务器收到 DHCPDISCOVER 之后就基于 ARP 协议根据 IP 地址找 MAC 地址把各种配置信息单播发送给主机 A,之后 A 就具备了上网的功能了。
DNS 协议
为了解决 IP 地址难以记忆的问题,域名系统 (Domain Name System, DNS) 被设计了出来,其核心就是存储字符串(域名)到 IP 地址的映射。
这样的映射被存储在了全球各个域名服务器上,考虑到请求压力,域名服务器以分布式地方式进行组织,例如分为根域名服务器、顶级域名服务器、二级域名服务器、本地域名服务器等,用户在获取一个域名的 IP 地址时,应用进程首先在本地的 53 号端口封装 DNS 请求报文(基于 UDP 协议),然后基于 DNS 协议向本地域名服务器发起请求,本地域名服务器得到查询结果后,将对应 IP 地址放在应答报文中返回给应用进程。
查询方式有两种:
- 递归查询:本地域名服务器如果没存储对应的域名 IP 映射,就以客户端的身份继续请求更高等级的域名服务器直到找到,然后逐层返回结果;
- 迭代查询:本地域名服务器如果每存储对应的域名 IP 映射,就把更高一级的域名服务器 IP 返回应用进程,应用进程重复刚才的请求查询更高一级的域名服务器直到找到。这种方式也是目前流行的方式。
举一个查询的例子,如下图所示:
在实际查询时,一般会优先选择距离最近的域名服务器,同时为了降低查询次数,各级域名服务器以及本地主机都会缓存一个域名到 IP 的映射(即 DNS 缓存)。例如我查询本地的 DNS 缓存:
FTP 协议
考虑到不同系统的文件组织方式不同,文件传输协议 (File Transfer Protocol, FTP) 被设计了出来。其核心思想就一个,利用从属进程完成可靠数据传输。
如上图所示,解释了 FTP 协议的整个过程,具体地:
- FTP 服务器采用 C/S 架构,服务器持续在 21 端口上运行 FTP 控制进程,等待连接;
- FTP 客户端与服务器通过控制进程连接后,启用数据传输进程(与控制进程为从属关系)进行数据传输;
- 传输结束后服务器终止数据传输进程,保持控制进程。
当然从属进程的设计初衷是为了提升连接的并发性,同时也起到了资源隔离的作用。比如一个服务器可以使用一个控制进程快速连接多个客户端,而不会被缓慢的数据传输降低连接效率,同时如果一个传输进程崩溃了也不会影响到连接进程或者其他传输进程。
TELNET 协议
为了进行远程登陆,远程登陆协议 (Telecommunication Network, TELNET) 被设计了出来。其核心概念是引入了网络虚拟终端 NVT (Network Virtual Terminal, NVT),NVT 定义了一组通用字符集,屏蔽了不同计算机系统对键盘输入差异性的同时,也定义了客户进程与远程服务器进程之间的交互过程,保证了不同硬件、软件与数据格式的终端与主机之间通信的兼容性。
与 FTP 协议类似,TELNET 同样使用 C/S 架构的 TCP 从属进程连接模式,服务器端默认启用 23 端口监听 TELNET 连接。后因为安全问题逐渐被安全终端 (Secure Shell, SSH) 替代。
如上图所示,本地终端输入的字符首先由本地 TELNET 客户进程转换为 NVT 格式,通过网络将 NVT 格式的字符传输到远程主机,远程 TELNET 服务器进程再将 NVT 格式的字符转换为远程主机能够识别和处理的字符格式。
HTTP 协议
为了更快速的响应小文件,超文本传输协议 (HyperText Transfer Protocol, HTTP) 被设计了出来,其使用 HTML 文本来统一内容,客户端基于 HTML 解释器(例如浏览器)进行解析供人类查看。工作流程如下图所示:
HTTP 协议在传输层通常使用 TCP 协议,服务器端默认启用 80 端口监听 HTTP 连接。
HTTP 为无状态协议,服务器端不保留之前请求的状态信息,尽管这降低了效率,但是不用维护历史信息也不用在客户端或服务器出现故障时保持状态的一致性,使得实现更简单。其中:
- HTTP/1.0 (1996):非持久连接;
- HTTP/1.1 (1999):支持长连接和流水线机制,缓存策略优化、部分资源请求及断点续传;
- HTTPS (HTTP + SSL/TLS, 2008):增加 SSL/TLS 层,在 TCP 之上提供安全机制;
- HTTP/2.0 (2015、2020):增加二进制格式、TCP 多路复用、头压缩、服务端推送等功能,提高带宽利用率、降低延迟。
假设请求了一个含有两个图片 URL 的网页,HTTP/1.0、HTTP/1.1、HTTP/1.1-Pipeline 工作流程如下图所示:
HTTP 请求报文中包含了对文档对象的操作方法,部分操作如下表所示:
方法/操作 | 含义 |
---|---|
GET | 请求读取由 URL 所标志的信息 |
POST | 给添加信息(例如注释) |
OPTION | 请求一些选项的信息 |
HEAD | 请求读取由 URL 所标志的信息的首部 |
PUT | 在指明的 URL 下存储一个文档 |
DELETE | 删除指明的 URL 所标志的资源 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | 用于代理服务器 |
HTTP 响应报文中包含了服务器的响应状态,用状态码来表示,主要有以下几类状态码:
- 1xx 表示通知信息的,如请求收到了或正在进行处理;
- 2xx 表示成功,如接受或知道了;
- 3xx 表示重定向,表示要完成请求还必须采取进一步的行动;
- 4xx 表示客户的差错,如请求中有错误的语法或不能完成;
- 5xx 表示服务器的差错,如服务器失效无法完成请求。
典型状态码如下:
- 200 OK。请求成功,被请求的对象包含在该响应的数据部分;
- 301 Moved Permanently。请求的对象被移走,新的位置在响应中通过 Location: 给出;
- 400 Bad Request。服务器不能解释请求报文;
- 404 Not Found。服务器中找不到请求的文档;
- 505 HTTP Version Not Supported。服务器不支持相应的 HTTP 版本。
SMTP/POP/IMAP 协议
为了提供通信功能,电子邮件协议被设计了出来。与 HTTP 请求-响应的及时通信模型不同,电子邮件是基于存储-转发的异步架构进行的。因此一个电子邮件的系统主要由用户代理和消息传输代理两部分组成:
- 用户代理 (User Agent, UA),又称为邮件代理。实现编辑、发送、阅读和管理电子邮件,通过 SMTP 协议和 MIME 扩展来完成;
- 传输代理 (Message Transfer Agent, MTA),又称为邮件服务器。起“邮局”作用,实现接收用户邮件,根据邮件目的地址传送到接收方的邮件服务器,并将邮件存放在用户邮箱内,通过 POP 协议或 IMAP 协议来完成。
电子邮件的通信过程如上图所示,具体地:
- 发送方利用邮件客户端(如 Outlook)撰写信件;
- 用户代理程序将邮件通过 SMTP 协议发给邮件服务器;
- 邮件服务器利用 SMTP 协议在邮件服务器之间传递邮件;
- 邮件到达目的邮件服务器,目的邮件服务器将邮件放入接收方的信箱中;
- 接收方利用 POP3 协议或 IMAP4 协议从邮件服务器中取信,并利用邮件客户端阅读信件。
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是目前互联网上通用的电子邮件传输协议。采用 TCP 连接,服务端口为 25。SMTP 协议主要定义了邮件格式以及邮件服务器之间如何通过 TCP 连接进行邮件的传输。邮件服务器之间采用存储-转发的工作方式,某个邮件服务器收到一封邮件时,它产生一个副本,然后尽可能地将它转发出去。邮件服务器在下一个邮件服务器确认已经收到它转发的邮件后将副本删去。
由于 SMTP 协议只能支持文本的传输,不能再满足电子邮件日益增长的功能需求,所以之后开发出多用途互联网邮件扩充 (Multipurpose Internet Mail Extensions, MIME) 作为 SMTP 的扩展来弥补 SMTP 协议的不足(注意 MIME 本身并不是邮件传输协议)。MIME 增加了对图像、声音、视频、可执行文件等数据类型的支持,具体地:
- 发件方:MIME 将非文本内容转为 Base64 编码,并添加
Content-Type
等头部信息;SMTP 协议将 MIME 格式化后的文本传递给邮件服务器; - 收件方:SMTP 服务器将邮件传递给收件人邮箱。邮件客户端解析 MIME 格式,还原出原始附件和正文。
邮局协议 (Post Office Protocol, POP) 是一个简单的邮件读取协议。由于用户代理和邮箱可能不在同一计算机上,所以用户代理需要和邮件服务器建立连接,将邮件从邮件服务器读取到本地。POP 协议在此过程中需要对用户的登录名和口令进行验证。目前常用的是 POP3 协议,同样采用 TCP 连接,服务端口为 110。POP 协议支持离线访问方式,即一次性全部下载邮件,也支持保留模式和删除模式两种工作模式。
互联网消息访问协议 (Internet Message Access Protocol, IMAP) 的功能与 POP 协议相似, 区别在于 POP3 协议是在脱机状态下运行,而 IMAP 协议是在联机状态下运行。IMAP 协议能够分步骤地下载用户邮件,同时在电子邮件服务器中保留副本。