# 键入网址到回车发生什么
30 秒速记
- 主线:解析
URL→DNS拿IP→TCP三次握手 →TLS握手(HTTPS)→ 发请求 → 收响应 → 渲染 DNS查找顺序:浏览器缓存 → 系统缓存 /hosts→ 本地DNS服务器递归查询- 每一步都可能被缓存短路:强缓存命中连请求都不发,连接复用省掉握手,
DNS缓存省掉解析 - 现实链路中间还有
CDN、代理、网关,但理论上可以简化成「请求方 ↔ 应答方」两点 DNS成功 ≠ 能访问,端口、证书、服务端任何一环都能断
回车之后,浏览器要先拿到 IP、建好连接,才能按 HTTP 格式把请求发出去。 具体就是:先看缓存里有没有这个域名的 IP,没有就问 DNS;拿到 IP 后 TCP 三次握手,HTTPS 再做一次 TLS 握手;然后发请求行和头部,服务器处理完回状态码和内容,浏览器拿去解析渲染。实际中每一步都有缓存,资源还在强缓存有效期内就直接从本地读,连网络都不碰;连接还开着就复用,省掉握手。面试我会把缓存短路这层讲出来,这是区分背流程和真理解的地方。
HTTP协议基于底层的TCP/IP协议,所以必须要用IP地址建立连接- 如果不知道
IP地址,就要用DNS协议去解析得到IP地址,否则就会连接失败 - 建立
TCP连接后会顺序收发数据,请求方和应答方都必须依据HTTP规范构建和解析报文 - 为了减少响应时间,整个过程中的每一个环节都会有缓存,能够实现“短路”操作
- 虽然现实中的
HTTP传输过程非常复杂,但理论上仍然可以简化成实验里的“两点”模型

原理拆解: 浏览器先解析网址,得到协议、主机、端口和路径。若目标是域名,系统需从浏览器缓存、操作系统缓存或 DNS 查询中取得 IP;随后选择可达地址建立连接。传统 HTTP/1.1 和 HTTP/2 通常依赖 TCP,使用 HTTPS 时还要在其上完成 TLS 握手。连接可用后,浏览器发送包含请求方法、路径和头字段的报文,服务器处理并返回状态码、响应头与响应体。
具体例子: 访问 https://example.com/a 时,若域名和连接都未缓存,链路至少包含域名解析、TCP 建连、TLS 握手和 HTTP 交换。若已有可复用连接,便可跳过重新建连;若浏览器缓存中的响应仍可直接使用,则可能连请求都不发送。缓存因此不是单一节点,而是能在解析、连接复用、代理和内容获取等不同阶段形成短路。
边界与排查: DNS 成功不代表页面一定可达,目标端口拒绝连接、证书校验失败或服务器返回错误状态都可能中断后续流程;输入 IP 也未必能替代域名,因为虚拟主机选择和证书校验仍可能依赖主机名。验证时可在浏览器开发者工具的网络面板检查请求是否来自缓存、连接耗时和响应状态,并用 curl -v https://example.com/a 观察解析、连接、TLS 与 HTTP 响应阶段。若面板没有网络请求,应先排查缓存或页面脚本;若停在连接阶段,则应从 DNS、端口可达性和证书链逐层定位。
面试官追问
追问 1你说先查 DNS 再建连接,可 Network 面板里这个资源根本没发请求,为什么?
命中了强缓存。Cache-Control: max-age 还没过期,浏览器直接从 memory cache 或 disk cache 拿,Size 列显示 (disk cache),整个网络流程都被跳过了。
追问 2怎么看出一次请求的耗时花在哪个阶段?
Network 面板点开请求看 Timing:DNS Lookup、Initial connection、SSL、Waiting for server response(TTFB)、Content Download 分得很清楚。命令行可以用 curl -w '%{time_namelookup} %{time_connect} %{time_appconnect} %{time_starttransfer}\n' -o /dev/null -s URL。
追问 3HTTP 改成 HTTPS 后首屏慢了一点,多出来的是哪一步?
多了 TLS 握手,TLS 1.2 要 2 个往返,TLS 1.3 是 1 个。可以开 TLS 1.3、会话复用、OCSP Stapling 把它压下来,再加 HSTS 省掉 http 跳 https 那次重定向。
追问 4要给首屏提速,第三方域名的连接能提前建吗?
能。<link rel="preconnect" href="https://cdn.example.com"> 让浏览器提前做 DNS + TCP + TLS,真正请求时直接发;只想提前解析就用 dns-prefetch。别给所有域名都加,没用上的连接是浪费。
