记录学习笔记、分享资源工具、交流技术思想、提升工作效率

从URL输入到页面都经历了什么

前端 xiaomudk 3年前 (2018-09-05) 2427次浏览 0个评论
文章目录[隐藏]

总体分为六个过程

  • DNS 解析:将域名解析成 IP 地址
  • TCP 连接:TCP 三次握手
  • 发送 HTTP 请求
  • 服务器处理请求并返回 HTTP 报文
  • 浏览器解析渲染页面
  • 断开连接:TCP 四次挥手

URL

URL (Unifrom Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。

  • 遵循的语法规则
    scheme://host.domain:port/path/filename

    • scheme – 定义因特网服务的类型。常见的协议有 http、https、ftp、file 其中最常见的类型是 http,而 https 则是进行加密的网络传输。
    • host – 定义域主机(http 的默认主机是 www)
    • domain – 定义因特网域名,eg: w3school.com.cn
    • port – 定义主机上的端口号 (http 的默认端口号是 80)
    • path – 定义服务器上的路径 (如果省略,则文档必须位于网站的根目录中)
    • filename – 定义文档/资源的名称
  • URL 编码

    URL 只能使用 ASCII 字符集,不属于 ASCII 中的字符,都必须进行编码才能使用 URL 来进行表示,若传输时使用了特殊字符会造成不必要的问题,导致服务器不能解析。

    • 编码方法
      使用 JavaScript 中 3 对方法进行 URL 的 编码/解码 escape/unescape,encodeURI/decodeURI 和encodeURIComponent/decodeURIComponent,
      三者适用场合不同,encodeURI 用于对整个 URI 进行编码 encodeURIComponent 被用于对 URI 的一部份进行编码,通常是指查询字符串或路径。

域名解析 (DNS)

在浏览器输入网址后,首先要经过域名解析,浏览器并不能直接通过域名找到对应的服务器,而是通过 IP 地址

IP 地址

IP 地址是指互联网协议地址,是 IP Address 的缩写。 IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。Ip 地址是一个 32 位的二进制数。

域名相当于 IP 地址乔装打扮的伪装者,带着一副面具。作用就是便于记忆和沟通的一组服务器的地址。与 Ip 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯,但要计算机去理解就相对变得的困难,为了解决这个问题,DNS 服务器应运而生。

什么是域名解析

DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务,DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息。

浏览器如何通过域名去查询 URL 对应的 IP

  • 浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。
  • 操作系统缓存:如果浏览器缓存中找不到需要的 DNS 记录,那就从操作系统中找。
  • 路由缓存: 路由器也有 DNS 缓存。
  • ISP 的 DNS 服务器:ISP 是互联网提供商 (Internet Service Provider)的简称,ISP 有专门的 DNS 服务器应对 DNS 查询请求。
  • 根服务器:ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查询 (DNS 服务先问根域名服务器.com 域名服务器的 IP 地址,然后再问 .baidu 域名服务器,依次类推)

浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,然后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对应的服务器。

TCP 三次握手

三次握手其实就是指建立一个 TCP 连接时,需要客户端和服务器端总共发送三个包。进行三次握手的主要目的是为了确认双方的接收能力和发送能力是否正常,指定自己的初始化序列号为后面的可靠性传送做准备。
在客户端发送数据之前会发起 TCP 三次握手用以同步客户端和服务端的序列号和确认号,并交换 TCP 窗口大小信息。

握手过程

刚开始客户端处于 closed 的状态,服务器处于 Listen 状态。

  • 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_Send 状态
  • 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 作为应答,并且也是指定了自己的初始化序列号 ISN,同时会把客户端的 ISN+1 作为 ACK 的值,表示已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态
  • 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,把服务器 ISN+1 作为 ACK 的值。表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。
  • 服务器收到 ACK 报文之后,也处于 establised 状态。
    file

注意点:解释一下为啥只有三次握手才能确认双方的接受与发送能力是否正常,而两次却不可以:
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

发送 HTTP 请求

http 请求报文由请求行(request line)、请求头(header)、请求体、空行(blank line)四部分组成。

  • 请求行包含请求方法、URL、协议版本
    • 请求方法包含 8 种:get、post、put、delete、patch、head、options、trace
      • get 请求
        数据是英文字母/数字,原样发送;如果是空格,转换为 + ;如果是中文/其他字符,则直接把字符串用 BASE64 加密,得出:%E4%BD,其中%XX 中的 XX 为该字符号以 16 进制表示的 ASCII。
      • post 请求
    • URL 即请求地址,由<协议>://<主机>:<端口>/<路径>?<参数> 组成
    • 协议版本即 http 版本号。
  • 请求头包含请求附加信息,由关键字/值对组成每行一对,关键字和值用英文冒号分隔。
    请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。eg:host,表示主机名,使用 keepalive,即持久连接,一个连接可以发多个请求;
  • 请求体,可以承载多个请求参数的数据,包含回车符、换行符、和请求数据。

file

服务器处理请求并返回 HTTP 报文

服务器

服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供响应的服务,eg:网页服务、文件下载、邮件服务、视频服务。客户端的主要功能是浏览网页、看视频、等等两者截然不同。每台服务器上都会安装处理请求的应用————web server .
web server 担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理,然后返回后台程序处理产生的结果作为响应。

浏览器解析渲染页面

浏览器解析渲染页面分为五个步骤

  • 根据 HTML 解析出 DOM 树
  • 根据 CSS 解析生成 CSS 规则树
  • 结合 DOM 树和 CSS 规则树,生成渲染树
  • 根据渲染树计算每一个节点是信息
  • 根据计算好的信息绘制页面

根据 HTML 解析出 DOM 树

  • 根据 HTML 的内容,将标签按照结构解析成为 DOM 树,DOM 树解析的过程是一个深度优先遍历。即先构建当前节点的所有子节点,再构建下一个兄弟节点。
  • 在读取 HTML 文档,构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行完毕。

根据 CSS 解析生成 CSS 规则树

  • 解析 CSS 规则树时 js 执行将暂停,直至 CSS 规则树就绪。
  • 浏览器在 CSS 规则树生成之前不会进行渲染。

结合 DOM 树和 CSS 规则树,生成渲染树

  • DOM 树和 CSS 规则树全部准备好了以后,浏览器才开始构建渲染树。
  • 精简 CSS 并可以加快 CSS 规则树的构建,从而加快页面相应速度。

根据渲染树计算每一个节点的信息(布局)

  • 布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的位置和尺寸。
  • 回流:在布局完成后,发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。

根据计算好的信息绘制页面

  • 绘制阶段:系统会遍历呈现树,并调用呈现器的”paint”方法,将呈现器的内容显示在屏幕上。
  • 重绘:某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的重绘。
  • 回流:某个元素的尺寸发生了变化,则需要重新计算渲染树,重新渲染。

断开连接

当数据传送完毕,需要断开 tcp 连接,此时发起 tcp 四次挥手。

  • 发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)
  • 被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)
  • 被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)
  • 发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)

发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址