1.url解析与DNS解析
浏览器解析用户输入的URL,提取协议(HTTP\HTTPS)、域名、端口及路径等信息
浏览器首先检查本地DNS缓存和系统DNS缓存,若未命中,查询本地hosts文件
最后递归查询向本地DNS服务器发起请求,获取域名对应的IP地址
这里我想插入一段,讲讲本地DNS缓存、系统DNS缓存、Hosts文件、DNS服务器几者之间的关系
首先,不要觉得很复杂,其实本质就是为了根据域名拿IP地址,只是好几个地方缓存了,先这么简单理解。然后继续往下看。
本地DNS缓存是浏览器缓存,浏览器缓存会缓存最近访问的域名与IP的映射关系,来减少重复查询的延迟
但本地DNS缓存时间较短,比如chrome默认只有1分钟
用户输入URL后,浏览器首先检查自身缓存,若命中就直接使用IP地址
系统DNS缓存是操作系统缓存,操作系统也维护了独立的DNS缓存,用于存储域名解析结果,避免重复请求DNS服务器
若浏览器缓存未命中,操作系统会检查自身缓存,若命中直接返回IP地址
Hosts文件是本地手动配置的域名与IP的映射文件,路径一般为C:\Windows\System32\drivers\etc\hosts
修改后会强制清空操作系统DNS缓存
浏览器缓存和系统缓存均未命中时,操作系统会检查hosts文件,若命中,直接使用配置的IP地址
当本地、系统缓存及Hosts文件均未命中时,操作系统就会向配置的本地DNS服务器发起递归查询
2.TCP连接建立
三次握手:通过TCP协议与服务器建立可靠连接
连接复用:HTTP 1.1默认支持keep-alive, 复用TCP连接以减少握手开销
3.发送HTTP请求
浏览器构造HTTP请求,包含请求行(方法、URI、协议)、请求头(user-Agent、Host、Cookie)、请求体
4.服务器处理请求
如果是静态资源,直接返回文件
如果是动态资源,调用后端服务生成响应内容
构建响应内容,包含状态行(http/1.1 200 ok)、响应头(Content-type、重定向地址、缓存策略)、响应体
5.浏览器接收与渲染
浏览器解析响应头,根据状态码决定后续操作
浏览器进行资源加载和页面渲染
6.连接关闭与缓存
四次挥手关闭连接
DNS缓存,减少后续解析延迟
浏览器对静态资源副本进行缓存,通过ETag或last-Modified验证资源是否更新
讲讲协商缓存ETag和Last-Modified
浏览器在发送请求的时候,首先会检查强制缓存,如果缓存命中,则不需要发送请求。直接从缓存中获取资源数据,若强缓存失效,则发送请求进去协商缓存,服务器通过请求头Last-Modified或Etag字段进行检查,若200表示资源有更新,304则表示资源没变,直接取缓存即可。
若同时存在ETag和Last-Modified,服务器优先验证ETag。
ETag是基于资源内容hash,精确到字节级别,适用于对内容变化敏感的资源(比如JSON、js文件)
Last-Modified是基于修改时间,精确到秒级别,适用于文件、图片等不频繁更新的静态资源
总结
从浏览器输入一个url到服务器的流程如下:
- url解析与DNS解析
- TCP连接建立
- 发送HTTP请求
- 服务器处理请求
- 浏览器接收与渲染
- 连接关闭与缓存