HTTP/1.0 短连接全过程图
阶段一:建立 TCP 连接 (三次握手)
在发送任何 HTTP 数据之前,客户端和服务器必须先建立一个可靠的 TCP 连接。这个过程被称为“三次握手”。
- 第一次握手 (SYN) :客户端向服务器发送一个
SYN报文,表示“我想和你建立连接”。 - 第二次握手 (SYN/ACK) :服务器收到
SYN后,会回复一个SYN/ACK报文,表示“好的,我同意建立连接”。 - 第三次握手 (ACK) :客户端收到服务器的同意后,再回复一个
ACK报文。至此,TCP 连接建立成功,双方可以开始传输数据。
阶段二:HTTP 请求与响应
TCP 连接建立后,真正的 HTTP 通信才开始。
- 发送 HTTP 请求:客户端通过这个已经建立的连接,向服务器发送一个完整的 HTTP 请求报文(例如
GET /index.html)。 - 返回 HTTP 响应:服务器接收到请求,进行处理,然后通过同一个连接将 HTTP 响应报文(包含状态行、响应头和响应体,如 HTML 文件内容)返回给客户端。
阶段三:断开 TCP 连接 (四次挥手)
一旦这次 HTTP 请求-响应完成,TCP 连接就会被立即断开。这个过程被称为“四次挥手”。
- 第一次挥手 (FIN) :通常是客户端先发起关闭,发送一个
FIN报文,表示“我的数据发完了,准备关闭连接”。 - 第二次挥手 (ACK) :服务器收到
FIN后,先回复一个ACK报文,表示“收到你的关闭请求”。此时,从客户端到服务器的连接已经关闭,但服务器可能还有数据要发送。 - 第三次挥手 (FIN) :当服务器也处理完所有数据后,会向客户端发送一个
FIN报文,表示“我也准备好了,可以关闭连接了”。 - 第四次挥手 (ACK) :客户端收到服务器的
FIN后,回复一个ACK报文。至此,整个 TCP 连接被完全关闭。
想象一下,你要访问一个包含 10 张图片的网页。在 HTTP/1.0 的短连接模式下,浏览器需要:
- 为 HTML 文件本身,执行一次完整的“三次握手 -> 请求响应 -> 四次挥手”。
- 然后,再为 每一张 图片,重复执行一次完整的“三次握手 -> 请求响应 -> 四次挥手”。
这意味着,为了加载一个网页,网络需要经历 11 次连接建立和断开的过程。而建立和断开连接(握手和挥手)本身就需要消耗时间和网络资源(总共 7 个数据包),这造成了巨大的性能浪费。
正是为了解决这个问题,HTTP/1.1 才引入了 长连接(持久连接/Keep-Alive) ,允许在一个 TCP 连接上发送多个 HTTP 请求和响应,从而极大地提升了网页加载速度。