浏览器输入URL后回车

大致过程

  1. URL 解析
  2. DNS 查询
  3. TCP 连接
  4. 处理请求
  5. 接受响应
  6. 渲染页面

具体流程

URL解析

地址解析:先判断你这个是不是合法的URL

HSTS:hsts安全检查,有点难理解。详情见

其他操作:比如浏览器访问限制,例如996.icu

检查缓存:在进行DNS查询前,先访问浏览器的缓存是否有缓存该网页。

DNS查询

基本步骤

浏览器缓存

浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。

操作系统缓存

操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。

路由器缓存

路由器也有自己的缓存。

ISP DNS 缓存

ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。

根域名服务器查询

在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:

img

​ 根域名服务器

需要注意的点

  1. 递归方式:一路查下去中间不返回,得到最终结果才返回信息(浏览器到本地DNS服务器的过程)
  2. 迭代方式,就是本地DNS服务器到根域名服务器查询的方式。
  3. 什么是 DNS 劫持
  4. 前端 dns-prefetch 优化

TCP 连接

TCP/IP 分为四层,在发送数据时,每层都要对数据进行封装:

img

建立TCP连接

三次握手四次挥手建立起TCP/IP连接,然后发送HTTP请求

服务器处理请求

大致流程

下面流程是基于有httpd的模式,即有挂载在nginx

img

HTTPD

最常见的 HTTPD 有 Linux 上常用的 Apache 和 Nginx,以及 Windows 上的 IIS。

它会监听得到的请求,然后开启一个子进程去处理这个请求。

处理请求

接受 TCP 报文后,会对连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证:

  • 验证是否配置虚拟主机
  • 验证虚拟主机是否接受此方法
  • 验证该用户可以使用该方法(根据 IP 地址、身份信息等)

重定向

假如服务器配置了 HTTP 重定向,就会返回一个 301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)。详情见这篇文章

URL 重写

然后会查看 URL 重写规则,如果请求的文件是真实存在的,比如图片、html、css、js文件等,则会直接把这个文件返回。

否则服务器会按照规则把请求重写到 一个 REST 风格的 URL 上。

然后根据动态语言的脚本,来决定调用什么类型的动态文件解释器来处理这个请求。

以 PHP 语言的 MVC 框架举例,它首先会初始化一些环境的参数,根据 URL 由上到下地去匹配路由,然后让路由所定义的方法去处理请求。

代码层面

在代码层面即使你所写的后端代码。Django的请求流程如下。

img

浏览器接受响应

浏览器接收响应基本是基于前端的内容。先忽略,详情见

posted @ 2019-09-29 10:47  小夏02  阅读(115)  评论(0)    收藏  举报