应用层协议
一、HTTP/HTTPS
1. 概况
HTTP 是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口。使用 TCP 作为传输层协议。HTTP 是一个无状态的协议,HTTP 服务器不会保存关于客户的任何信息。HTTP 有两种连接模式,一种是持续连接,一种非持续连接。非持续连接指的是服务器必须为每一个请求的对象建立和维护一个全新的连接。持续连接下,TCP 连接默认不关闭,可以被多个请求复用。采用持续连接的好处是可以避免每次建立 TCP连接三次握手时所花费的时间。在 HTTP1.0 以前使用的非持续的连接,但是可以在请求时,加上 Connection: keep-alive 来要求服务器不要关闭 TCP 连接。HTTP1.1 以后默认采用的是持续的连接。目前对于同一个域,大多数浏览器支持同时建立 6 个持久连接。
2. HTTP报文
1)请求报文
HTTP请求报文包括:请求行、请求头、空行 和 实体主体 。
请求行包含:方法字段、URL 字段和 HTTP 版本字段。
方法字段:
- GET 方法只被用于向服务器获取数据。
- POST 方法用于将实体提交到指定的资源,通常会造成服务器资源的修改。
- HEAD 方法与 GET 方法类似,但是在返回的响应中,不包含响应体。
- PUT 方法用于上传文件到服务器,DELETE 方法用于删除服务器上的对象。
请求方法更多表达的是语义上的区别,并不是说 POST 能做的事情,GET 就不能做了,主要看如何选择。更多方法可参看文档。
2)响应报文
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
HTTP 响应报文包括:状态行、响应头、空行 和 实体主体
状态行包含:协议版本字段、状态码 和 状态信息。
3. 请求/响应头
有两种类型:请求首部、通用首部和实体首部;响应首部、通用首部和实体首部。通用首部和实体首部在请求报文和响应报文中都可以设置,区别在于请求首部和响应首部。
常见的请求首部有 Accept 可接收媒体资源的类型、Accept-Charset 可接收的字符集、Host 请求的主机名。
常见的响应首部有 ETag 资源的匹配信息,Location 客户端重定向的 URI。
常见的通用首部有 Cache-Control 控制缓存策略、Connection 管理持久连接。
常见的实体首部有 Content-Length 实体主体的大小、Expires 实体主体的过期时间、Last-Modified 资源的最后修改时间。
4. HTTP版本
HTTP/1.1:
- 使用持久连接,多个请求可复用同一个 TCP 连接。
- 服务器只有处理完一个请求的响应后,才会进行下一个请求的处理,容易造成排队的情况,称为“队头堵塞”。队头堵塞会导致持久连接在达到最大数量时,剩余的资源要等其他资源请求完后才能发起请求。为了避免这个问题,一个是减少请求数,一个是同时打开多个持久连接。这就是我们对网站优化时,使用雪碧图、合并脚本的原因。
HTTP/2 :
- 彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”,可分为头信息帧和数据帧。帧的概念是它实现多路复用的基础。
- 每个请求或回应的所有数据包,称为一个数据流。数据包发送的时候,都必须标记数据流 ID ,用来区分它属于哪个数据流,因为同一个连接里面连续的数据包,可能属于不同的请求。
- 引入了头信息压缩机制,头信息压缩后发送,并且客户端和服务器维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就只发送索引号,提高速度。
- 允许服务器未经请求,主动向客户端推送静态资源,注意区别 WebSocket 等等。
- 因为用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。由于多个数据流使用同一个 TCP 连接,遵守同一个流量状态控制和拥塞控制。只要一个数据流遭遇到拥塞,剩下的数据流就没法发出去。出现该问题是由于其使用 TCP 协议,与协议本身的实现其实没多大关系。
HTTP/3 :
- 由于 TCP 本身存在的一些限制,Google 就开发了一个基于 UDP 协议的 QUIC 协议,并且使用在了 HTTP/3 上。 QUIC协议在 UDP 协议上实现了多路复用、有序交付、重传等等功能。
5. 状态码
常见的状态有
200-请求成功、202-服务器端已经收到请求消息,但是尚未进行处理
301-永久移动、302-临时移动、304-所请求的资源未修改
400-客户端请求的语法错误、404-请求的资源不存在
500-服务器内部错误
一般 1XX 代表服务器接收到请求、2XX 代表成功、3XX 代表重定向、4XX 代表客户端错误、5XX 代表服务器端错误。
6. TLS/SSL 协议
用于 HTTPS 的加密。
TLS 握手过程:
- 第一步,客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数、以及客户端支持的加密方法。
- 第二步,服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数。
- 第三步,客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服务器。并且还会提供一个前面所有内容的 hash 值,用来供服务器检验。
- 第四步,服务器使用自己的私钥,来解密客户端发送过来的随机数。并提供前面所有内容的 hash 值来供客户端检验。
- 第五步,客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥来加密信息。
7. 参考
https://www.cnblogs.com/myseries/p/11239662.html
http://www.ruanyifeng.com/blog/2016/08/http.html
二、DNS
1. 概况
DNS 协议提供主机名到 IP 地址的转换服务,即Domain Name System,域名系统。DNS 协议运行在 UDP 协议之上,使用 53 号端口。
2. 层级结构
举例来说,www.example.com
真正的域名是www.example.com.root
,简写为www.example.com.
。因为,根域名.root
对于所有域名都是一样的,所以平时是省略的。
根域名的下一级,叫做”顶级域名”(top-level domain,缩写为TLD),比如.com
、.net
;再下一级叫做 次级域名(second-level domain,缩写为SLD),比如www.example.com
里面的.example
,这一级域名是用户可以注册的;再下一级是主机名(host),比如www.example.com
里面的www
,又称为 三级域名,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
主机名.次级域名.顶级域名.根域名
# 即
host.sld.tld.root
3. 查询过程
- 将请求发送到本地 DNS 服务器中,本地 DNS 服务器会判断是否存在该域名的缓存,如果不存在,则向根域名服务器发送一个请求。
- 从“根域名服务器”查到“顶级域名服务器”的 NS(Name Server) 记录和 A 记录( IP 地址)。
- 从“顶级域名服务器”查到“次级域名服务器”的 NS 记录和 A 记录( IP 地址)。
- 从“次级域名服务器”查出“主机名”的 IP 地址。
一般我们向本地 DNS 服务器发送请求的方式就是递归查询,因为我们只需要发出一次请求,然后本地 DNS 服务器返回给我们最终的请求结果。而本地 DNS 服务器向其他域名服务器请求的过程是迭代查询,因为每一次域名服务器只返回单次查询的结果,下一级的查询由本地 DNS 服务器自己进行。
4. DNS 记录和报文
DNS 服务器中以资源记录的形式存储信息,每一个 DNS 响应报文一般包含多条资源记录。一条资源记录的具体的格式为
(Name,Value,Type,TTL)
其中 TTL (Time To Live)是资源记录的生存时间,它定义了资源记录能够被其他的 DNS 服务器缓存多长时间。
常用的一共有四种 Type 的值,分别是 A、NS、CNAME 和 MX ,不同 Type 的值,对应资源记录代表的意义不同。
- 如果 Type = A,则 Name 是主机名,Value 是主机名对应的 IP 地址。因此一条记录为 A 的资源记录,提供了标准的主机名到 IP 地址的映射。
- 如果 Type = NS,则 Name 是个域名,Value 是负责该域名的 DNS 服务器的主机名。这个记录主要用于 DNS 链式查询时,返回下一级需要查询的 DNS 服务器的信息。
- 如果 Type = CNAME,则 Name 为别名,Value 为该主机的规范主机名。该条记录用于向查询的主机返回一个主机名对应的规范主机名,从而告诉查询主机去查询这个主机名的 IP 地址。主机别名主要是为了通过给一些复杂的主机名提供一个便于记忆的简单的别名。
- 如果 Type = MX,则 Name 为邮件服务器的别名,Value 为邮件服务器的规范主机名。它的作用和 CNAME 是一样的,都是为了解决规范主机名不利于记忆的缺点。
5. 参考
http://www.ruanyifeng.com/blog/2016/06/dns.html
http://www.ruanyifeng.com/blog/2018/05/root-domain.html
三、其他协议
- 文件传输协议(File Transfer Protocol,FTP):用于实现交互式文件传输功能。
- 简单邮件传送协议(Simple Mail Transfer Protocol, SMTP):用于实现电子邮箱传送功能。
- 简单网络管理协议(simple Network Management Protocol,SNMP):用于管理与监视网络设备。
- 远程登录协议(Telnet):用于实现远程登录功能。
- 邮局协议版本3(Post Office Protocol - Version 3,POP3):只下载邮件,服务器端并不删除。
- 交互邮件访问协议(Internet Mail Access Protocol,IMAP):从邮件服务器上获取邮件的信息。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!