浏览器输入url后经历的过程

2023-11-07

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、过程简述

  1. 首先,在浏览器地址栏中输入url
  2. 浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若 没有,则跳到第三步操作。
  3. 在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
  4. 浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
  5. 握手成功后,浏览器向服务器发送http请求,请求数据包。
  6. 服务器处理收到的请求,将数据返回至浏览器
  7. 关闭TCP连接(四次挥手)
  8. 浏览器收到响应结果解析html代码并请求资源(js、css、图片等)
  9. 浏览器进行页面布局渲染

二、发送http请求前先进行DNS域名解析

DNS,英文是Domain Name System,中文叫域名系统,是Internet的一项服务,他将域名和IP地址相互映射的一个分布式数据库

主要过程如下:

  1. 从浏览器缓存中查找域名www.google.com的IP地址
  2. 在浏览器缓存中没找到,就在操作系统缓存中查找,这一步中也会查找本机的hosts看看有没有对应的域名映射(当然已经缓存在系统DNS缓存中了)
  3. 在系统中也没有的话,就到你的路由器来查找,因为路由器一般也会有自己的DNS缓存

如果以上都没有找到,则继续往下向dns域名服务器查询

  • 用户电脑的解析器向LDNS(也就是Local DNS,互联网服务提供商ISP),发起域名解析请求,查询www.google.com的IP地址,这是一个递归查找过程
  • 在缓存没有命中的情况下,LDNS向根域名服务器.查询www.google.com的IP地址,LDNS的查询过程是一个迭代查询的过程
  • 根告诉LDNS,我不知道www.google.com对应的IP,但是我知道你可以问com域的授权服务器,这个域归他管
  • LDNS向com的授权服务器问www.google.com对应的IP地址
  • com告诉LDNS,我不知道www.google.com对应的IP,但是我知道你可以问google.com域的授权服务器,这个域归他管
  • LDNS向google.com的授权服务器问www.google.com对应的IP地址
  • google.com查询自己的ZONE文件(也称区域文件记录),找到了www.google.com对应的IP地址,返回给LDNS
  • LDNS本地缓存一份记录,把结果返回给用户电脑的解析器
  • 在这之后,用户电脑的解析器拿到结果后,缓存在自己操作系统DNS缓存中,同时返回给浏览器,浏览器依旧会缓存一段时间。

注意

域名查询时有可能是经过了CDN调度器的(如果有cdn存储功能的话)
而且,需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化在这里插入图片描述

三、三次握手

建立TCP连接一开始都要经过三次握手:

第一次握手,请求建立连接,发送端发送连接请求报文
第二次握手,接收端收到发送端发过来的报文,可知发送端现在 要建立联机。然后接收端会向发送端发送一个报文
第三次握手,发送端收到了发送过来的报文,需要检查一下返回的内容是否是正确的;若正确的话,发送端再次发送确认包

在这里插入图片描述


四、四次挥手

理解为:

客户端:我已经关闭了向你那边的主动通道了,只能被动接收了
服务端:收到通道关闭的信息
服务端:那我也告诉你,我这边向你的主动通道也关闭了
客户端:最后收到数据,之后双方无法通信

在这里插入图片描述

五、TCP的连接与断开

在这里插入图片描述


六、浏览器渲染过程

获取到资源HTML、CSS、js ->构建DOM树 > 构建styleSheets树 > 布局(构建render树) > 分层 > 绘制 >分块 > 光栅化 > 合成

  1. 将HTML转换为浏览器可识别的解构 — DOM树
  2. 将 CSS 文本转换为浏览器可以识别的结构 — styleSheets
  3. 布局:将两树合并,生成render树 — Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系。
  4. 分层:浏览器为一些特殊的节点建立一个对应图层,生成图层树(LayerTree),并将这些图层合并 — Layout,顾名思义就是计算出每个节点在屏幕中的位置。
  5. 绘制:图层创建完后重叠在一起 — 即遍历render树,并使用UI后端层绘制每个节点。
  6. 分块:根据视口结合渲染进程将图层分成若干图块
  7. 光栅化:在光栅化线程池中将图块转换成位图。
  8. 合成:合成线程发送绘制图块命令 DrawQuad 给浏览器进程。浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。

渲染细节

  1. 生成DOM树
    DOM树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。DOM树的根节点就是document对象。
    DOM树的生成过程中可能会被CSS和JS的加载执行阻塞,当HTML文档解析过程完毕后,浏览器继续进行标记为deferred模式的脚本加载,然后就是整个解析过程的实际结束触发DOMContentLoaded事件,并在async文档文档执行完之后触发load事件。
  2. 生成Render树
    生成DOM树的同时会生成样式结构体CSSOM(CSS Object Model)Tree,再根据CSSOM和DOM树构造渲染树Render Tree,渲染树包含带有颜色,尺寸等显示属性的矩形,这些矩形的顺序与显示顺序基本一致。从MVC的角度来说,可以将Render树看成是V,DOM树与CSSOM树看成是M,C则是具体的调度者,比HTMLDocumentParser等。
    可以这么说,没有DOM树就没有Render树,但是它们之间不是简单的一对一的关系。Render树是用于显示,那不可见的元素当然不会在这棵树中出现了,譬如 。除此之外,display等于none的也不会被显示在这棵树里头,但是visibility等于hidden的元素是会显示在这棵树里头的。
  3. DOM树与Render树
    DOM对象类型很丰富,什么head、title、div,而Render树相对来说就比较单一了,毕竟它的职责就是为了以后的显示渲染用嘛。Render树的每一个节点我们叫它渲染器renderer。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器输入url后经历的过程 的相关文章

  • Node.js 中的 HTTPS 代理服务器

    我正在开发一个node js代理服务器应用程序 我希望它支持HTTP and HTTPS SSL 协议 作为服务器 我目前正在使用node http proxy https github com nodejitsu node http pr
  • python http 客户端卡在 100 continue

    我在 python 中有一个简单的 http 服务器 它使用 100 continue 实现 PUT class TestHandler SimpleHTTPRequestHandler def do PUT self length int
  • Express.js在控制器中获取http方法

    我正在构建一个注册表单 本地护照作为身份验证 表单作为表单助手 因为注册只知道 GET 和 POST 我想在一个函数中完成整个处理 换句话说 我正在寻找类似的东西 exports register function req res if r
  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 除了 GET 和 POST 之外,如何从浏览器向 RESTful 应用程序发送任何内容?

    我没有得到 RESTful 的东西 是的 我知道如何从浏览器向我的应用程序发送 GET 请求 这是通过 URL 链接 a href user someone 并且还可以通过form方法发送POST请求 a
  • 将 HttpApi 与 I/O 完成端口结合使用

    我刚刚偶然发现了微软的HTTP 服务器 API http msdn microsoft com en us library aa364510 28v vs 85 29 aspx 简介中写道 HTTP 服务器 API 使应用程序能够通过 HT
  • 如何禁用 HTTP 的 HSTS 标头?

    我已将以下内容插入到我网站的 htaccess 中 以便能够访问HSTS预加载列表 https hstspreload appspot com
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • 如何使用批处理脚本调用的curl 获取http post 请求的响应代码?

    我正在努力为从我们的工具之一发送 http post 请求提供支持 该工具基本上通过 http 请求执行作业 实现此目的的方法是该工具使用多个参数调用 RunScript bat 该脚本解析这些参数并在验证后发出curl post 请求 P
  • Chrome 开发工具无法显示响应,即使返回的内容具有标题 Content-Type:text/html;字符集=UTF-8

    为什么我的 Chrome 开发者工具显示 无法显示响应数据 当返回的内容是text html类型时响应 在开发者工具中查看返回的响应的替代方法是什么 我认为只有当您选中 保留日志 并且您在导航离开后尝试查看先前请求的响应数据时 才会发生这种
  • ASP.NET Core URL 重写

    我正在尝试将我的网站从 www 重定向到非 www 规则以及 http 到 https https example com https example com 在中间件中 我曾经在 web config 中进行这些重定向更改 例如
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • AJAX 发送数据到 Node.js 服务器

    我尝试使用 AJAX 将数据发送到 Node js 服务器 但不断遇到同样的问题 即接收问题 这是客户端 JavaScript AJAX 代码 var objects function return new XMLHttpRequest f
  • 404 标头 - HTTP 1.0 还是 1.1?

    为什么我能找到的几乎每个例子 包括这个问题 https stackoverflow com questions 437256 sending a 404 error in php大约一年前 说 404 标头应该是HTTP 1 0 404 N
  • $http.get() 与 JSON 数据

    我正在编写一个服务器应用程序 并希望客户端使用正文中的数据来参数化我的 GET 方法 如下所示 http v GET http localhost 3000 url text 123 foo bar GET url HTTP 1 1 Acc
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • 从 PCAP 嗅探重建数据

    我试图通过 libpcap 嗅探 HTTP 数据 并在处理 TCP 有效负载后获取所有 http 内容 标头 有效负载 根据我的讨论编写 http 嗅探器 或任何其他应用程序级嗅探器 https stackoverflow com ques
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080

随机推荐

  • Ubuntu: 安装最新版本的 Nginx

    Ubuntu 默认 apt 源中的 Nginx 版本比较旧 今天介绍下如何在 Ubuntu 中安装最新版本的 Nginx 要安装较新版本的 Nginx 可以使用 Nginx 的 APT 源 执行如下脚本来添加 Nginx APT 源 bin
  • gitlab项目的备份与迁移

    gitlab项目的备份与迁移 最近工作中需要用到gitlab项目的备份与迁移工作 因此做了一个简单的部署配置 这里小小记录一下 一 gitlab的安装 1 安装准备 1 本人由于在centos7上部署gitlab 因此使用的gitlab的版
  • unity3d 启动项目卡在load script assembly

    最近突然碰到unity启动项目 卡在load script assembly的情况 删除了library重开也还是如此 日志打印里面打印到 刷新script开始然后就戛然而止了 后来发现是 项目里某个文件夹被一个命令行占用了 unity在导
  • 安装nrm报错

    internal validators js 124 throw new ERR INVALID ARG TYPE name string value TypeError ERR INVALID ARG TYPE The path argu
  • 2023华为OD机试真题【最接近中位数的索引】

    前言 本题使用Java解答 如果需要python版本答案 请查看以下链接 Python版本答案 题目内容 给定一个数组X和正整数K 请找出使表达式X i x i 1 X i K 1 结果最接近于数组中位数的下标i 如果有多个i满足条件 请返
  • [Java]两个有理数的加减乘除

    public class Rational private long num 0 分子 private long den 1 分母 Begin long i public Rational long num long den this nu
  • Blender 的 操作与快捷键

    Blender是一款开源的免费的3D建模软件 目前来看还不错哦 Blender的快捷键 鼠标右键选中物体 左键是确认 选中下 按住滑轮拖动鼠标可以环视 选中下 按住shift正反键可以上下 选中下 按住shift按住滑轮拖动鼠标可以左右 小
  • javaweb-HTTP协议(服务器数据的接收、处理、响应流程)详解

    HTTP协议 HTTP请求 两种HTTP请求方式 在服务器接收信息 HttpServletRequest 请求行 请求头 请求体 处理 响应 HTTP协议 什么是HTTP协议 超文本传输协议 Hypertext Transfer Proto
  • https请求跨域问题的解决

    原http服务升级为https服务后 发现同级域名下的单点登录不可用 报错 The page at https aaa xxx com was loaded over HTTPS but requested an insecure fram
  • CTFweb篇——upload-labs

    0x00 前言 本次以 upload labs的Pass 00和pass 01为例 0x01 进入靶场 pass 00 首先查看Pass 00题目 任务要求上传一个webshell到服务器 编写一句话木马 然后上传 右键复制图像地址 连接菜
  • Windows系统克隆***与防范

    随着电脑技术的发展和电脑的普及 还有大大小小的 骇客 网站和越来越简单的工具 使得目前 变得日趋频繁 被植入 的电脑或 服务器也越来越多 与此同时系统管理员的 安全意识也在不断提高 加上杀毒软件的发展 网络 的生命周期也越来越短 所以 者在
  • sql函数创建和调用

    create FUNCTION Fun GetDeptID 传入参数 或参数类型 UserID VARCHAR 100 IDepGrade INT 返回值类型 RETURNS VARCHAR 100 AS BEGIN 定义返回值 DECLA
  • 揭开“视频超分”黑科技的神秘面纱

    在看电影时 有一幕大家应该都非常熟悉 警察从证据图片中选取一块区域放大 再放大 直到一个很小的目标变得清晰可见 从而发现重要的线索 现实中是不是真的有这样的技术 可以把模糊的小图变得清晰 答案是 一定程度上可以 这项黑科技就是超分辨率技术
  • 【教程】PyTorch Timer计时器

    转载请注明出处 小锋学长生活大爆炸 xfxuezhang cn OpenCV的Timer计时器可以看这篇 Python Timer和TimerFPS计时工具类 Timer作用说明 统计某一段代码的运行耗时 直接上代码 开箱即用 import
  • 【实战】通过 JS 将 HTML 导出为 PDF 文档

    背景介绍 某老人院信息管理系统项目 甲方要求将财务模块的各种报表导出为PDF文档 方便打印 之前的解决方案 是将报表生成专门的打印 HTML 页面 然后按 Ctrl P 调用浏览器本身打印功能去打印 这种方式存在的问题是不同分辨率的显示器
  • vue单页应用在页面刷新时保留状态数据的方法

    在Vue单页应用中 如果在某一个具体路由的具体页面下点击刷新 那么刷新后 页面的状态信息可能就会丢失掉 这时候应该怎么处理呢 如果你也有这个疑惑 这篇文章或许能够帮助到你 一 问题 现在产品上有个需求 单页应用走到某个具体的页面 然后点击刷
  • 跨平台开发之 Tauri

    比起 Electron Tauri 打包后的安装包体积是真的小 跨平台开发 最近使用跨平台开发框架写了一个软件 在此记录一下 说起跨平台开发 我的理解是这样的 多依赖浏览器环境运行 多使用前端语言进行开发 只需一次编码 但不同平台可能需要做
  • linux usermod用法,Linux中Usermod命令的一些使用技巧

    usermod 是一个命令行实用程序 允许您修改用户的登录信息 本文介绍了如何使用usermod命令添加用户到组 更改用户shell 登录名 主目录等 1 usermod 命令 该usermod命令的语法采用以下形式 usermod opt
  • 爬虫遇到验证码必须要知道的解决办法(干货)

    对于爬取数据而言 有的网站在登录时或者采集数据过程中 都会出现验证码 对于网络爬虫而言 解决验证码识别识别是非常重要的一件事 今天 我们将讨论有关验证码的5件事 以帮助大家更好的进行网络数据抓取 1 什么是验证码 2 验证码是如何工作的 3
  • 浏览器输入url后经历的过程

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 过程简述 二 发送http请求前先进行DNS域名解析 主要过程如下 注意 三 三次握手 四 四次挥手 五 TCP的连接与断开 六 浏览器渲染过程 渲染细节 一