日新计划6月更文 Day 7
应用层是计算机网络七层中最上一层,也是前后端开发直接接触的一层。在应用层上有着各种我们非常熟悉的协议与服务,比如 HTTP、FTP、SSH、SMTP、DNS……
这里的“协议”是通信双方共同遵守的对通信语义、语法与时序的规范,它为网络通信的奠定了基础。
应用层通信双方通过发送与接收报文(Message)进行通信,使用 URL 进行定位。
HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种非常常见的基于 TCP 的应用层协议,服务端(Apache、Nginx、Caddy 等)默认使用 80 端口监听客户端的请求并进行响应。HTTP 具有半双工、无状态的特点,因此效率较高,但也带来了一些其他问题需要其他手段解决。
HTTP 通信由客户端向服务端发送的 请求报文(Request Message)开始,由服务端向客户端发送响应报文(Response Message)结束。
请求报文由请求行、请求头、空行和请求体组成,请求行包括请求方式、请求 URL、协议版本,请求头为多个 Key Value 对,如:
POST /login
Host: localhost:18080
Accept: application/json
{
"username": "admin",
"password": "123456"
}
响应报文包括状态行、响应头、空行和响应体,状态行包括 HTTP 版本、状态码与状态短语,如:
HTTP/1.1 200 OK
Content-Type: application/json
{
"code": "00000",
"message": "Request Success",
"data": {
"token": "xxxxx"
}
}
请求报文与响应报文使用 CR LF 换行
FTP
FTP(File Transfer Protocol,文件传输协议)「RFC 959」是一种古老的在计算机之间传输文件的协议 。FTP 服务端使用 21 端口监听来自客户端的通信请求,建立连接后使用该连接传输 ASCII 文本进行通信并使用 20 端口与客户端建立连接来传输文件。
现在谁还用 FTP 啊,临时向服务器传输文件用 SFTP 吧,OpenSSH 亲情附赠,无需过多配置,更简单更安全。
通常用户的客户端不是实时在线的,所以需要邮件服务器(Mail Server)“代替”用户进行邮件发送与接收,用户使用"用户代理"(User Agent)与为自己服务端邮件服务器通信完成邮件阅读、发送等操作。电子邮件地址采用用户名@邮件服务器的格式。
邮件服务器之间使用 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)「RFC 2821」进行邮件传递。SMTP 也是一种基于 TCP 的协议,各个服务器使用 25 端口等待来自 “client” 的邮件。
RFC 822 搞定了 E-mail 报文的格式:
To: foo@abc.com
From: bar@def,com
Subject: Hellp
Texts...
- 这里的报文是 UA 与 Mail Server 通信使用的格式
UA 与 Mail Server 之间可以使用 POP3、IMAP 甚至 HTTP 进行通信,POP3 不保存用户状态且要求客户端保存邮件内容(UA 下载后 Server 自动删除邮件),IMAP 则更加人性化,甚至允许用户在 Server 上管理自己的邮件。
DNS
DNS(Domain Name System,域名系统)提供域名与 IP 地址之间的解析服务,服务器使用 53 端口监听来自客户端的请求,双方基于 UDP 协议进行通信。
用于互联网非常复杂,DNS 也是有许多服务器分层组成的,查询过程是递归的:
- 访问
www.baidu.com,首先在本地 DNS 缓存寻找,找到后直接使用 - 若找不到,向配置的本地 DNS 服务器发送请求(如常见的 114 DNS)
- 本地域名服务器查询自己的缓存,命中则返回,否则将查询请求发送至 13 台根服务器(Root Name Server)
- 根服务器根据要查询的域名,向顶级域名服务器(TLD Server,Top-Level Domain Server)发送请求(本例中是管理
.com的服务器) - 顶级域名服务器依次向下查询,直至找到解析结果,向上返回至本地 DNS 服务器
- 成功查询后,途径的各个服务器都会缓存这次查询的结果