HTTP协议工作原理
- HTTP是一种无状态协议,即每个请求都是独立的,服务器不会记住之前的请求。这意味着每个请求都必须携带足够的信息来完成通信。
- HTTP协议是建立在TCP协议之上的,通过在应用层发送文本格式的请求和响应数据来实现通信。
- HTTP使用请求/响应模型:客户端发送请求给服务器,服务器接收请求并返回响应给客户端。
以下是各个HTTP协议版本的主要特点
版本 | 主要特点 | 优点 | 缺点 |
---|---|---|---|
HTTP/1.0 | 每个请求/响应需单独建立TCP连接,不支持持久连接 | - 简单易实现 - 能满足基本需求 | - 每个请求/响应需单独建立TCP连接 - 不支持持久连接,性能较低 |
HTTP/1.1 | 引入了持久连接机制,支持管道化请求、分块传输编码等优化性能的特性 | - 引入了持久连接,减少了延迟时间 - 支持管道化请求和分块传输编码,提高性能 | - 仍然存在并发请求限制 - 头部未压缩,导致头部信息过多 |
HTTP/2 | 使用二进制格式传输数据,支持头部压缩、多路复用、服务器推送等,提高网页加载速度 | - 使用二进制格式传输数据,提高效率 - 支持头部压缩,减少数据量 - 多路复用技术提高了并行传输效率 | - 需要加密,对服务器资源要求较高 - 部分网络设备不支持HTTP/2 |
HTTP/3 | 基于QUIC协议,采用UDP进行数据传输,提供快速握手和数据传输机制,进一步提高性能和安全性 | - 基于QUIC协议,提供更快的握手和数据传输机制 - 使用UDP协议,改进了传输速度和连接恢复速度 | - 尚处于发展阶段,可能存在兼容性问题 - 部署难度较大,需要支持QUIC协议的服务器和客户端 |
请求过程
-
建立连接:客户端向服务器发起TCP连接。
第一次握手(SYN):
客户端发送一个带有SYN(同步)标志的数据包给服务器,表示客户端请求建立连接,并指定自己的初始序列号。 这个数据包会携带客户端的初始化序列号Seq=client_isn。
第二次握手(SYN + ACK):
服务器收到客户端发来的SYN数据包后,会回复一个带有SYN和ACK(确认)标志的数据包给客户端,表示接收请求并同意建立连接。这个数据包除了携带服务器的初始化序列号外, 还会确认客户端的序列号,同时也会使服务器的序列号增1以防止重复。
第三次握手(ACK):
客户端收到服务器发来的SYN + ACK 数据包后,在这个过程中客户端向服务器发回一个确认的数据包,表示客户端接收到服务器的确认信息。 这个数据包中携带的确认号码(Ack)是服务器序列号的下一个,即Ack=server_isn + 1。
-
发送请求:客户端发送包含请求方法(GET、POST等)、目标URL、协议版本、请求头和请求体等信息的HTTP请求消息。
-
服务器处理请求:服务器接收到请求后,根据请求内容进行处理,可能包括访问数据库、调用后端服务等。
-
发送响应:服务器将处理结果构建成HTTP响应消息,包括状态码、响应头和响应体等信息。
-
关闭连接:服务器向客户端发送完整的响应后,可以选择关闭连接或保持连接以便后续请求。
客户端发送一个FIN(结束)包给服务器,表示客户端不再发送数据。
服务器收到客户端的FIN后,发送一个ACK给客户端,确认收到了关闭请求。
服务器发送一个FIN给客户端,表示服务器也准备关闭连接。
客户端收到服务器的FIN后,发送一个ACK给服务器,确认收到关闭请求并同意关闭连接。
响应过程
- 接收响应:客户端接收来自服务器的HTTP响应消息。
- 解析响应:客户端解析响应消息的内容,包括状态码、响应头和响应体等信息。
- 处理响应:客户端根据状态码和其他信息进行相应的处理,如渲染页面、处理数据等。
- 关闭连接:客户端根据需要可以选择关闭连接或保持连接以进行后续请求。