# 浏览器输入URL系列
在浏览器中输入一个 URL 连接,会发生什么?
这是一道常见的面试题,如何回答的标准且覆盖全面是本文关注的重点。
# 浏览器读取缓存
- 当浏览器根据缓存机制,能从本地读取有效缓存显示页面时,则优先读取本地缓存。
- 若缓存信息失效,则需要进行 HTTP 请求获取新数据。
- 即使从服务器请求到有效数据,若返回状态码为
304
则依旧使用本地缓存并更新缓存信息。
# DNS解析
- 缓存失效或无缓存,则准备进行 HTTP 请求
- 查找本地 hosts 文件,检查是否存在对应域名和IP关系
- 再去 DNS 服务器查找,从本地 DNS 服务器查询
- 转发到根域名服务器进行递归+迭代查询
- 本地服务器向根域名服务器查询一般使用
迭代查询
:根域名服务器提供所知道的顶级域名服务器,顶级域名服务器提供知道的权限域名服务器 递归查询
:客户端向本地DNS服务器查询- 期间一旦找到对应的IP地址即立即作为响应报文发给客户端
# IP 地址解析
ARP 地址解析协议:实现由 IP 地址到 MAC 地址的转换
每个主机都有一个 APR 高速缓存
,里面有本局域网上的个主机和路由器的IP地址到MAC地址的映射表
# 建立 TCP 连接
直到服务器的 MAC 地址后,开始进行 TCP 连接
# 三次握手
- 第一次:客户端发送带有 SYN 标志的数据包,并生成一个序号 x,即:
SYN = 1, seq = x
, 进入 SYN_SEND - 第二次:服务端接收到客户端发送的数据包,并生成一个对应的数据包返回给客户端,内容包括:
SYN = 1, ACK = 1, seq = y, ack = x + 1
,并变为SYN_RCVD状态 - 第三次:客户端接收到服务端的响应数据包,进入 ESTABLISHED 状态,生成数据包:
ACK = 1, ack = y + 1
, 服务端收到确认信息后即进入 ESTABLISHED 状态
第三次握手可以传递数据,若不传递数据,则不消耗序号。
# HTTP 请求
TCP连接建立之后,即可处理HTTP请求
请求报文包括:通用首部、请求首部、实体首部
# 服务响应
服务器接收到 HTTP 请求,进行端口转发处理请求,操作数据库等操作后,返回对应结果
# 协商缓存
响应中包含 304 状态吗,则表示资源文件未变化,使用浏览器原有缓存并更新缓存有效信息
# 关闭 TCP 连接
四次握手
- 第一次:客户端发起断开连接请求:
FIN = 1, seq = x
,进入 FIN_WAIT_1 状态,客户端不再发送请求,但可以接受数据 - 第二次:服务端接收到请求数据包,返回:
ACK = 1, ack = x + 1
, 并进入 CLOSE_WAIT 状态,客户端收到后进入 FIN_WAIT_2 状态 - 第三次:服务端等待最后的响应数据包发送,使用最后的序号,返回:
FIN = 1, seq = y
, 并进入 LAST_ACK 状态,服务端不再发送数据 - 第四次:客户端接收到服务器的关闭请求,返回:
ACK = 1, ack = y + 1
, 等待2个最大报文时间后进入 CLOSED 状态,客户端无法发送数据,服务端收到关闭响应后直接进入 CLOSED 状态,服务端无法接受数据
# 浏览器解析HTML
todo
# 布局渲染
todo
← 图片加载优化 性能优化 - 动画性能 →