一次完整的HTTP事务涉及从客户端发起请求到服务器响应完成的整个过程,主要包括以下几个步骤:
-
域名解析(DNS Lookup) :
- 客户端浏览器首先需要将URL中的域名转换为IP地址。这个过程通过DNS(域名系统)查询来实现。
- 如果本地缓存中没有该域名对应的IP地址,则会递归或迭代地向DNS服务器发出查询请求。
-
TCP连接建立(TCP Handshake) :
- 获取到服务器的IP地址后,客户端与服务器之间开始进行三次握手建立TCP连接,确保双方都能可靠通信。
- 这通常涉及到SYN、SYN-ACK和ACK三个数据包的交换。
-
HTTP请求发送:
- 建立好TCP连接后,客户端构造一个HTTP请求报文,包括请求行(方法、URI、HTTP版本)、头部信息(如User-Agent、Host、Accept等)和可能存在的请求体,并将其发送给服务器。
-
服务器处理请求:
- 服务器接收到HTTP请求后,根据请求行的方法(GET、POST、PUT、DELETE等)和URI来定位资源并执行相应操作。
- 服务器处理请求的过程中,可能会检查请求头里的条件请求字段,例如
If-Modified-Since和If-None-Match用于判断是否返回内容或返回304 Not Modified响应。
-
生成HTTP响应:
- 处理完成后,服务器构建HTTP响应报文,包括状态行(HTTP版本、状态码、状态描述)、响应头部(如Content-Type、Last-Modified、ETag等)和响应体(即实际要返回的内容,可能是HTML、JSON、图片或其他媒体类型)。
-
传输响应:
- 服务器将HTTP响应报文通过已建立的TCP连接发送给客户端。
-
关闭TCP连接或保持连接:
- 根据HTTP协议版本(比如HTTP/1.0默认每个请求结束后关闭连接,而HTTP/1.1支持持久连接,默认可以复用连接)以及请求和响应头中的Connection字段决定是否关闭连接。
-
客户端接收响应及后续处理:
- 客户端接收到HTTP响应后,解析响应报文,提取状态码和响应体内容。
- 对于HTML页面,浏览器开始解析HTML代码,并对其中引用的其他资源(CSS、JavaScript、图片等)发起新的HTTP请求。
- 浏览器根据HTML、CSS和JavaScript渲染并显示页面内容。
-
渲染页面:
- 当所有必要的资源下载完毕,浏览器按照DOM结构、CSS样式和脚本执行的结果将页面内容呈现给用户。