学习笔记url输入到页面展现中发生了什么?

Posted 曾胖神父

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记url输入到页面展现中发生了什么?相关的知识,希望对你有一定的参考价值。

url输入到页面展现中,发生以下了6个阶段,分别为
DNS解析
TCP连接
发送HTTP请求
服务器处理请求并返回HTTP报文
断开连接

一,URL基础概念

在说之前,先了解一下什么是URL,URL全称Uniform Resource Locator,直接翻译为统一资源定位符号,用于定位互联网资源,我们也称之为网址,比如这个https://www.zhihu.com/,网址遵守以下的语法规则

scheme://host.domain:port/path/filename

各部分解释如下:

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

二,域名解析(DNS)

网址经过域名解析之后,返回IP地址,然后游览器通过IP地址找到对应的服务器,这里值得一提的是,DNS本身是一个网络服务器,该服务器上存储了域名和与其对应的IP地址与端口号

1,游览器通过域名查询URL对应的IP的具体过程

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

三,TCP三次握手

在客户端发送数据之前会发起TCP三次握手用以同步客户端和服务端的序列号和确认号
具体过程如下
客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,有游览器发起,告诉服务器我要发送请求)
服务器发回一个带SYN=1,ACK=X+1,Seq=Y的相应包以示传达确认信息(第二次握手,由服务器发起,告诉游览器我准备接受了,你赶紧发送吧)
客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)

四,发送HTTP请求

TCP三次握手结束后,开始发送HTTP请求报文。
请求报文由请求行(request line),请求头(header),请求体三个部分组成。

1.请求行包含请求方法,URL,协议版本

请求方法包含8种:GET,POST,PUT,DELETE,PATH,HEAD,OPTIONS,TRACE。
URL 即请求地址,由 <协议>://<主机>:<端口>/<路径>?<参数> 组成
协议版本即http版本号

POST /chapter17/user.html HTTP/1.1

以上代码中“POST”代表请求方法,“/chapter17/user.html”表示 URL,“HTTP/1.1”代表协议和协议的版本。现在比较流行的是 Http1.1 版本

2.请求头包含请求的附加信息,由关键字/值对组成,每行一对,关键字和值用英文冒号":"分隔。

请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。其中比如:Host,表示主机名,虚拟主机;Connection,HTTP/1.1 增加的,使用 keepalive,即持久连接,一个连接可以发多个请求;User-Agent,请求发出者,兼容性以及定制化需求。

3.请求体,可以承载多个请求参数的数据,包含回车符,换行符和请求数据,并不是所有请求都具有请求数据

name=tom&password=1234&realName=tomson

上面代码,承载着 name、password、realName 三个请求参数。

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

返回的HTTP报文为http响应报文,响应报文由相应行(request line),响应头部(header),响应主体三个部分组成。
(1) 响应行包含:协议版本,状态码,状态码描述
状态码规则如下:
1xx:指示信息–表示请求已接受,继续处理。
2xx:成功–表示请求已被成功接受,理解,接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
(2)响应头部包含响应报文的附加信息,由 名/值 对组成
(3)响应主体包含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据

六,游览器解析渲染界面

游览器解析渲染界面分为以下五个步骤
根据HTML解析出DOM树
根据CSS解析生成CSS规则树
结合DOM树和CSS规则树,生成渲染树
根据渲染树计算每一个节点的信息
根据计算好的信息绘制界面

1,根据HTML解析DOM树

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

2. 根据 CSS 解析生成 CSS 规则树

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

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

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

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

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

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

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

七,断开连接

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

以上是关于学习笔记url输入到页面展现中发生了什么?的主要内容,如果未能解决你的问题,请参考以下文章

从URL输入到页面展现到底发生什么

从输入URL到页面展现在用户面前,都发生了什么?

当用户输入网址到页面展现,发生了什么?

前端:从 URL 输入到页面展现发生了什么?(What really happens when you navigate to a URL)

从输入URL到页面展现全过程

从URL输入到页面展现原理