URL到页面加载显示完成过程到底发生了啥?

1.URL

url:统一资源定位符,互联网上的每个文件都有一个唯一的URL,通俗的说就是咱们现日常所见的网页地址。我们常见的URL是这样的: www.baidu.com. 这个域名由三部分组成:协议名、域名、端口号,这里端口是默认所以隐藏。除此之外URL还会包含一些路径、查询或其他片段,例如:baike.baidu.com/search?word…

我们最常见的的协议是 HTTP 协议,除此之外还有加密的 HTTPS 协议、FTP 协议等等。 URL 的中间部分为域名或者是 IP,之后是端口号。

通常端口号不常见是因为大部分都是使用默认端口,如HTTP默认端口80,HTTPS默认端口443。

统一资源定位符的标准格式如下:

协议类型://服务器地址[:端口号]文件名?查询

以下面为例:

baike.baidu.com:80/item/url/11…

  • 1.https是协议
  • 2.层级URL标记符号(为[//],固定不变)
  • 3.baike.baidu.com是服务器地址(通常为域名,有时为IP地址)
  • 4.80是端口
    1. /item/url/110640是路径
    1. ?fr=aladdin是查询参数
    1. #19是锚点

2.DNS转换

首先我们应该要知道的是,在地址栏输入的域名并不是最后资源所在的真实位置,域名只是与IP地址的一个映射。网络服务器的IP地址那么多,我们不可能去记一串串的数字,因此域名就产生了,域名解析的过程实际是将域名还原为IP地址的过程。

DNS 域名解析有两种方法,分别是迭代查询和递归查询

DNS 域名解析(域名解析), DNS 实际上是一个域名和IP对应的数据库。

IP地址往都难以记住,但机器间互相只认IP地址,于是人们发明了域名,让域名与IP地址之间一一对应,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。

首先浏览器先检查本地hosts文件是否有这个网址映射关系,如果有就调用这个IP地址映射,完成域名解析。

如果没找到则会查找本地DNS解析器缓存,如果找到则返回。

如果还是没有找到则会查找本地DNS服务器,如果找到则返回。

最后迭代查询,按根域服务器库(.com,.cn,.vip,.top…)->顶级域(.com),然后根据顶级域(.com)->第二层域子域(baidu.com),最后根据baidu.com的域名找到相应的IP,返回给浏览器。

3.根据 IP 建立 TCP 连接(三次握手)。

三次握手

HTTP 请求分为三个部分:TCP 三次握手、http 请求响应信息、关闭 TCP 连接。

在客户端发送数据之前会发起 TCP 三次握手用以同步客户端和服务端的序列号和确认号,并交换 TCP 窗口大小信息。

第一次

第一次握手:建立连接时,客户端(浏览器)发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认; (浏览器:我要连接你啦) SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; (服务器收到请求,并回复:同意你连接)

第三次

第三次握手:客户端(浏览器)收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 (浏览器回复:收到你的回复,)

三次握手结束后,开始发送 HTTP 请求报文。

4.HTTP 发起请求。

完整的 HTTP 请求包含请求起始行、请求主体和请求头部三部分。

请求的内容如下:

HTTP/1.1协议中共定义了八种方法(也叫“动作”) GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。其中较为常用的又GET、POST、PUT方法;

请求了之后,应该都能得到一个响应,除非断网了,或者服务器宕机了。接下来服务器开始处理请求并返回 HTTP 报文。

5.服务器处理请求

每台服务器上都会安装处理请求的应用——web server(常见的web server产品有apache、nginx、IIS或Lighttpd等)。

web server 担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理对应请求的程序进行处理(例如CGI脚本,JSP脚本,servlets,ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应。

5.网站后台处理阶段

网站处理,就是实际后台处理的工作。后台开发现在有很多框架,但大部分都还是按照MVC设计模式进行搭建的。

MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。

这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层。

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

2 )最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。在 MVC 的三个部件中,模型拥有最多的处理任务。一个模型能为多个视图提供数据。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果,控制器属于管理者角色,从视图接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示模型处理返回的数据。

总结而言,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回html字符串给浏览器,浏览器呈现网页给用户。 返回相应报文内容如下:

6.浏览器解析渲染页面

浏览器接收到 http 数据包后后, 向服务器发起请求下载资源, 然后解析流程(涉及到:html 的词法分析,然后解析成 DOm 树, 同时解析 css 生成 css 规则树, 合并生成render 树. 然后 layout 布局、painting 渲染、复合图层的合成、GPU绘制、外链接处理、loaded 和 documentloaded 等). 若在下载js文件,解析器会停止对 html 的解析,这就出现了 js 阻塞问题。

通过后台处理返回的html字符串结果会被浏览器读取解析,对应就是html页面加载、解析、渲染的工作。

1、加载

浏览器对一个html页面的加载顺序是从上而下的,并在加载过程并行进行解析渲染处理。在这个过程中遇到link标签、image标签、script标签时,浏览器会再次向服务器发送请求获取css文件、图片资源、js文件,并执行js代码,同步进行加载解析。

2、解析、渲染

解析的过程,其实就是生成解析树,即dom树。dom树是由dom元素及属性节点组成,加上css解析的样式对象和js解析后的动作实现。而渲染,就是将DOM树进行可视化表示。下一步就来到了绘制网页的工作阶段。

六、绘制页面 浏览器通过上面步骤计算得到渲染树,是DOM树的可视化表示,构建渲染树使页面以正确的顺序绘制出来,遵循一定的渲染规则,经过一系列的渲染工作,实现网站页面的绘制,由此最终完成了页面展示。

7.断开链接,TCP 连接(四次挥手)。

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

1.TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。 (浏览器发起通知,请求已经发送完毕,你准备关闭吧)

2.服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 (服务器发起通知,请求已经已经接收完毕,你准备关闭吧)

3.服务器关闭客户端的连接,发送一个FIN给客户端。 (服务器发起通知,响应报文已经发送完毕,你准备关闭吧)

4.客户端发回ACK报文确认,并将确认序号设置为收到序号加1。 (浏览器发起通知,我准备关闭了,你也准备关闭吧)

以上基本就是个页面从输入 URL 到页面加载显示完成,发生的全过程,当然还可以在细化一些,不过这些知识对于前端来说已经足够了,有兴趣的同学可以自行深究。

猜你喜欢

转载自blog.csdn.net/qq_52006046/article/details/128782604