# 浏览器输入URL系列

在浏览器中输入一个 URL 连接,会发生什么?

这是一道常见的面试题,如何回答的标准且覆盖全面是本文关注的重点。

# 浏览器读取缓存

浏览器缓存机制 - by InfoQ 浪里行舟

  • 当浏览器根据缓存机制,能从本地读取有效缓存显示页面时,则优先读取本地缓存。
  • 若缓存信息失效,则需要进行 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