从输入url到页面加载完成中发生的事情

一个页面从输入URL到页面加载显示完成,这个过程都发生什么?

1.url分割

输入url之后,浏览器会把url分割成几个部分,包括协议,网络地址,资源路径,端口等;

2.域名解析

判断网络地址是不是ip,如果是ip的话,向该ip地址发起http请求,如果网络地址是域名的话,进行DNS解析的步骤:

  • (1)本机向本地dns服务器发起DNS解析请求,本地服务器首先检查本地缓存中是否存在请求的域名对应的ip地址,(这里的缓存查看顺序为从浏览器缓存开始,到系统缓存,再到路由器缓存)有的话直接返回,没有dns缓存的话进行下一步;
  • (2)本地dns服务器向全球13个根域名服务器中的一台发送dns查询请求,根服务器会返回顶级域名服务器的ip(如果有的话)给本地dns服务器;
  • (3)本地dns服务器得到顶级域名服务器的IP地址之后, 向顶级域名服务器发送dns查询请求,顶级域名服务器会返回域名所对应的权威dns服务器的ip地址(如果有的话)给本地dns服务器;
  • (4)本地dns服务器根据得到的权威dns域名服务器的ip向此权威dns域名服务器发起dns查询请求,权威dns服务器会返回查找的域名的ip地址给本地dns服务器(如果有的话)。
    当然这些都是建立在本地dns没有根dns服务器,顶级dns服务器以及权威dns服务器的dns缓存的情况下的,如果有上述的缓存,可能会跳过一些步骤。

    3.确定端口

    如果输入的url没有著名端口的话,浏览器发送http请求是会使用默认端口,如http连接的默认端口是80。如果url中定义了端口,就会按照定义的端口进行连接;

    4.浏览器向服务器发送一个HTTP请求

    (1)在发送http缓存之前,首先客户端要与服务器建立TCP连接(三次握手):

  • SYN_SEND 客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1;
  • SYN_RECV 服务器端回应客户端,这是三次握手中的第2个报文,这个报文同时带ACK标志(表示服务器准备好了数据通信)和SYN标志。因为它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好数据通讯;内核在收到最后一个ACK后,accept会返回;
  • ESTABLISH 客户端必须再次回应服务器端一个ACK报文(表示客户端也准备好了数据通信),这是报文段3;
    这时就成功建立了TCP连接.

    (2)客户端向服务器发送命令请求

    一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

    (3)浏览器发送请求头信息

    浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

    (4)服务器响应

    客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

    (5)服务器应对应答头信息

    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

    (6)服务器向浏览器发送数据

    Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

    (7)关闭TCP链接

    一般来说,服务器向客户端发送数据之后会关闭tcp连接,如果过浏览器发送的头信息中加入了Connection:keep-alive之后,就会一直保持连接的打开状态。

    5.浏览器根据得到的数据,开始进行网页的加载,解析,渲染过程

加载

加载是指获取HTML/SVG/XHTML,CSS和JavaScript的过程。加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载,但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。虽然css文件的加载不影响js文件的加载,但是却影响js文件的执行,即使js文件内只有一行代码,也会造成阻塞。

解析

  • 解析HTML/SVG/XHTML来产生一个DOM tree,dom tree是由dom元素及属性节点组成,树的根是document对象;
  • 解析CSS来生成CSS rule tree,包含css规则,该规则包含选择器和声明对象;
  • 解析JavaScript脚本,通过DOM API 和 CSSOM API 来操作DOM tree 和 CSS rule tree。

渲染

即为构建渲染树的过程,是原来DOM树的可视化表示,构建这棵树是为了以正确的顺序绘制文档内容。

渲染顺序
  • 1.渲染的顺序也是从上到下;
  • 2.在渲染到页面的某一部分时,其上面的所有部分都已经下载完成;
  • 3.如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),会进行加载和解析,解析过程中,停止页面所有往下元素的加载;
  • 4.样式表在加载完成后,将和以前加载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染;
  • 5.JS、CSS中如有重定义,后定义函数将覆盖前定义函数。
JavaScript的加载

JavaScript加载后马上执行,而且执行时会阻塞页面后续的内容(包括页面的渲染、其它资源的下载)。于是,如果有多个js文件被引入,那么对于浏览器来说,这些js文件被被串行地载入,并依次执行。因为javascript可能会来操作HTML文档的DOM树,所以,浏览器一般都不会像并行下载css文件并行下载js文件。因此JavaScript无法操作此JavaScript之后的dom元素。

thank u !