当前位置:首页 > 休闲

浏览器与web服务器之间的交换过程

你在地址栏敲下 `example.com` 按下回车,浏览浏览器做的器w器第一件事不是去找那个网站,而是服务先问操作系统:这域名对应的 IP 是多少?这一步叫 DNS 解析。如果本机缓存、间的交换路由器缓存、过程ISP 的浏览 DNS 服务器都没有记录,就得一路问到根域名服务器。器w器整个过程通常在几十毫秒内完成,服务但它是间的交换后面所有事情的前提——没有 IP,浏览器根本不知道把请求往哪儿发。过程

拿到 IP 之后,浏览浏览器通过 TCP 三次握手和服务器建立连接。器w器你发 SYN,服务服务器回 SYN+ACK,间的交换你再回 ACK。过程三次,不多不少。为什么不是两次?因为服务器需要确认你的接收能力也正常,光它自己能发还不够。如果是 HTTPS,TCP 建好之后还要来一轮 TLS 握手,协商加密套件、交换密钥、验证证书。这轮握手比 TCP 那轮复杂得多,也是为什么 HTTPS 比 HTTP 慢一点——不过 HTTP/2 和 TLS 1.3 已经把差距缩得很小了。

连接就绪,浏览器开始发 HTTP 请求。一个典型的 GET 请求长这样:

GET /index.html HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 ... Accept: text/html Cookie: session_id=abc123

请求行、请求头、空行、请求体(GET 通常没有体)。服务器收到后开始解析:你要哪个路径、带没带 Cookie、Accept 什么格式。然后它去找对应的资源。如果是静态文件,nginx 之类的服务器直接从磁盘读出来返回;如果是动态请求,比如 `/api/user/profile`,那就得转给后端的应用服务器,应用服务器再查数据库、拼装数据、生成响应。

响应回来的时候,浏览器先看状态码。200 是正常,301/302 是重定向,404 是找不到,500 是服务器自己出错了。状态码后面跟着响应头,里面有几个关键信息:`Content-Type` 告诉浏览器这是 HTML 还是 JSON 还是图片,`Content-Length` 说明内容多大,`Cache-Control` 决定这次响应能不能缓存、缓存多久。响应体就是实际内容了——HTML 文本、JSON 数据、二进制图片,看 Content-Type 行事。

浏览器拿到 HTML 后开始解析,边解析边构建 DOM 树。遇到 `` 标签就去下载 CSS,遇到 `