一个完整的HTTP请求过程
一个完整的HTTP请求过程包含域名解析、TCP三次握手建立连接、HTTP请求与响应、TCP四次挥手关闭连接等关键步骤,具体如下:
1、域名解析
- 浏览器缓存检查:浏览器首先检查本地缓存中是否有对应域名的IP地址记录。
- 系统缓存与Hosts文件:若浏览器缓存无记录,则查询操作系统DNS缓存及Hosts文件(位于
C:\Windows\System32\drivers\etc
)。 - 本地DNS服务器查询:若Hosts文件无记录,则向本地DNS服务器发起请求。本地DNS服务器会先查询自身缓存,若无记录则向根DNS服务器发起迭代查询。
- 根DNS服务器与顶级域名服务器查询:根DNS服务器返回顶级域名服务器地址,本地DNS服务器再向顶级域名服务器查询,顶级域名服务器返回权威DNS服务器地址。
- 权威DNS服务器查询:本地DNS服务器向权威DNS服务器发起查询,权威DNS服务器返回对应的IP地址。
- 返回IP地址:本地DNS服务器将IP地址返回给客户端,并缓存该记录以备下次使用。
2、TCP三次握手建立连接
- 第一次握手(SYN):客户端向服务器发送SYN报文,包含客户端选择的初始序列号(ISN),客户端进入SYN_SENT状态。
- 第二次握手(SYN + ACK):服务器收到SYN报文后,返回SYN + ACK报文,包含服务器选择的初始序列号,并将客户端的ISN + 1作为ACK值,服务器进入SYN_RCVD状态。
- 第三次握手(ACK):客户端收到SYN + ACK报文后,发送ACK报文,将服务器的ISN + 1作为ACK值,客户端进入ESTABLISHED状态,服务器收到ACK报文后也进入ESTABLISHED状态,此时TCP连接建立成功。
客户端 => 服务端 => 客户端
3、HTTP请求与响应
- 客户端发送HTTP请求:客户端通过已建立的TCP连接向服务器发送HTTP请求报文,包含请求行(请求方法、URL、协议版本)、请求头、空行和请求体(可选)。
- 服务器处理请求并返回响应:服务器收到请求后,处理请求并返回HTTP响应报文,包含状态行(协议版本、状态码、状态码描述)、响应头、空行和响应体。
4、TCP四次挥手关闭连接
- 第一次挥手(FIN):客户端发送FIN报文,表示客户端不再发送数据,但仍可接收数据,客户端进入FIN_WAIT1状态。
- 第二次挥手(ACK):服务器收到FIN报文后,发送ACK报文,确认收到客户端的关闭请求,服务器进入CLOSE_WAIT状态,客户端收到ACK报文后进入FIN_WAIT2状态。
- 第三次挥手(FIN):服务器处理完数据后,发送FIN报文,表示服务器不再发送数据,但仍可接收数据,服务器进入LAST_ACK状态。
- 第四次挥手(ACK):客户端收到FIN报文后,发送ACK报文,确认收到服务器的关闭请求,客户端进入TIME_WAIT状态,等待2MSL(最大报文段生存时间)后进入CLOSED状态,服务器收到ACK报文后立即进入CLOSED状态。
客户端 => 服务端 => 客户端
服务端 => 客户端 => 服务端