浏览器输入URL后回车
大致过程
- URL 解析
- DNS 查询
- TCP 连接
- 处理请求
- 接受响应
- 渲染页面
具体流程
URL解析
地址解析:先判断你这个是不是合法的URL
HSTS:hsts安全检查,有点难理解。详情见
其他操作:比如浏览器访问限制,例如996.icu
检查缓存:在进行DNS查询前,先访问浏览器的缓存是否有缓存该网页。
DNS查询
基本步骤:
浏览器缓存
浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。
操作系统缓存
操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。
路由器缓存
路由器也有自己的缓存。
ISP DNS 缓存
ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。
根域名服务器查询
在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:
根域名服务器
需要注意的点
- 递归方式:一路查下去中间不返回,得到最终结果才返回信息(浏览器到本地DNS服务器的过程)
- 迭代方式,就是本地DNS服务器到根域名服务器查询的方式。
- 什么是 DNS 劫持
- 前端 dns-prefetch 优化
TCP 连接
TCP/IP 分为四层,在发送数据时,每层都要对数据进行封装:
建立TCP连接
三次握手四次挥手建立起TCP/IP连接,然后发送HTTP请求
服务器处理请求
大致流程
下面流程是基于有httpd的模式,即有挂载在nginx
HTTPD
最常见的 HTTPD 有 Linux 上常用的 Apache 和 Nginx,以及 Windows 上的 IIS。
它会监听得到的请求,然后开启一个子进程去处理这个请求。
处理请求
接受 TCP 报文后,会对连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证:
- 验证是否配置虚拟主机
- 验证虚拟主机是否接受此方法
- 验证该用户可以使用该方法(根据 IP 地址、身份信息等)
重定向
假如服务器配置了 HTTP 重定向,就会返回一个 301
永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)。详情见这篇文章
URL 重写
然后会查看 URL 重写规则,如果请求的文件是真实存在的,比如图片、html、css、js文件等,则会直接把这个文件返回。
否则服务器会按照规则把请求重写到 一个 REST 风格的 URL 上。
然后根据动态语言的脚本,来决定调用什么类型的动态文件解释器来处理这个请求。
以 PHP 语言的 MVC 框架举例,它首先会初始化一些环境的参数,根据 URL 由上到下地去匹配路由,然后让路由所定义的方法去处理请求。
代码层面
在代码层面即使你所写的后端代码。Django的请求流程如下。
浏览器接受响应
浏览器接收响应基本是基于前端的内容。先忽略,详情见