HTTP 是应用层协议,定义客户端与服务器如何交换请求和响应。浏览器访问网页时,实际过程可能受到缓存、代理、连接复用和所用协议版本影响,但可以通过几个基本阶段理解整条链路。
解析地址与寻找服务器
URL 通常包含协议、主机、端口、路径、查询参数和片段等部分,其中并非每一部分都必须显式出现。浏览器需要把域名解析成可用于网络通信的地址,这通常通过 DNS 完成。解析结果可能来自浏览器、操作系统或其他网络组件的缓存,不一定每次都发起新的查询。
建立安全的通信条件
获得目标地址后,客户端需要根据采用的 HTTP 版本和传输方式建立或复用连接。传统的 HTTP 通信常建立在 TCP 之上;也存在基于 QUIC 的方式。使用 HTTPS 时还需要建立受 TLS 保护的安全会话,验证服务器证书,并协商加密通信所需的信息。
TLS 能够保护传输内容的机密性和完整性,并帮助客户端验证连接的服务器身份,但它不等同于对网站全部内容的可信背书。
发送请求
HTTP 请求包含方法、目标和头字段,也可能带有消息体。GET 常用于获取资源,POST 常用于提交数据或触发处理。头字段可以携带客户端可接受的内容类型、缓存条件、身份凭据等元数据。
GET /notes HTTP/1.1
Host: example.com
Accept: text/html 示例展示的是一种文本形式,实际传输表示取决于所使用的 HTTP 版本。请求方法表达语义,但服务器仍需正确实现访问控制和数据处理,不能仅凭方法名称判断操作是否安全。
接收响应
响应包含状态码、头字段和可选的消息体。状态码按类别表达处理结果:一百段表示信息性响应,二百段通常表示成功,三百段与重定向有关,四百段表示客户端一侧的请求问题,五百段表示服务器处理失败。具体含义仍应查看完整状态码,而不能只看类别。
响应头可以描述内容类型、缓存策略、压缩方式等。浏览器根据 Content-Type 等信息决定如何处理响应内容。
解析并呈现页面
收到 HTML 后,浏览器解析它并构建 DOM;解析 CSS 形成样式相关结构,再计算布局和绘制结果。页面中引用的样式、脚本和其他资源可能触发额外请求。脚本执行还可能改变 DOM 或发起新的网络访问。
“打开一个网页”不是单次请求的同义词。一个页面通常由主文档及其引用的多个资源共同组成。
排查访问问题时,可以沿这条路径逐层观察:地址是否正确、域名能否解析、连接是否建立、证书是否有效、请求与响应状态是什么,以及浏览器是否正确解析资源。分层检查比笼统地判断“网络坏了”更容易找到原因。