前端面试题-一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

1.DNS解析

2.TCP连接

3.发送HTTP Request

4.服务器处理 Request and Return Request 报文

5.浏览器解析并渲染页面

6.连接结束

 



1:dns(Domain Name System, 域名系统)解析;DNS即系的过程就是寻找哪台机器上有你需要的资源的过程。当你在浏览器中输入一个地址时,例如: baidu.com, 其实不是百度网站真正意义上的 address, 互联网上的每一台计算机的 only flag是它的 ip address, 但是 ip address 并不方便记忆;用户更喜欢用方便记忆的网址去寻找互联网上的其他计算机, 也就是上面调到的百度的网址(main);所以互联网设计者需要在用户的方便性 and 可用性方面做一个权衡, 这个权衡就是一个网址到 ip 地址的转换, 这个过程就是 DNS解析; 他实际上就相当于一个翻译的角色, 实现了网址到 ip 地址的转换。

当然如果你直接输入另一台电脑 or Server 来访问它就不存在DNS解析这异步了, 例如 ping 127.0.0.1 :)

 



2:TCP Connect (三次握手)

通俗的讲,通信连接的建立需要以下三个过程:

主机向服务器发送一个建立连接的请求 (例如: 你好,我想认识你);

服务器接收到请求厚发送同意连接的信号(例如:好的,很高兴认识你);

主机接收到同意连接的信号后,再次向服务器发送了确认信号(我也很高兴认识你),自此, 主机与服务器两者建立了连接。

(三次握手的过程采用了TCP洗衣, 其可以保证信息传输的可靠性,安全性;三次握手过程中, 若一方收不到确认信号, 协议会要求重新发送信号, TCP相对于UDP更加安全, 可靠;但是UDP因为没有三次握手的过程建立连接也会更快, 可以用到的地方例如直播等对丢包率要求不高的场景



3:发送HTTP请求

当服务器与主机建立了连接之后,下面的主机便与服务器进行通信;网页请求时一个单项请求的过程,即是一个主机向服务器请求数据,服务器返回相应的数据的过程;

浏览器更具URL内容生成了HTTP请求, HTTP请求报文由三部分组成: 请求行, 请求报头, 请求正文;

例如:

    1 POST /path HTTP/1.1
    2 Host: passport.zhihu.com
    2 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
    2 Accept: */*
    2 Content-Length: 24
    2 Content-Type: application/x-www-form-urlencoded
    3
    4 username=ff&password=123


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

服务器接收到请求后,会根据HTTP请求中的内容来决定如何获取相应的HTML文件;

服务器将得到的 HTML 文件发送给浏览器;

HTTP响应报文也是由三部分组成:状态码,响应报头,响应报文

4-1:状态码:

1xx: 指示信息-表示已接收请求,继续处理

2xx:成功-表示服务器已成功接收请求,理解, 接受

3xx:重定向-要完成请求必须进行更进一步的操作

4xx:客户端错误-请求有语法错误或请求无法实现

5xx:服务器端错误-服务器未能实现合法请求;

 

4-2:响应报头

常见的响应报头字段有: server, Connection  ... ...

4-3:响应报文

服务器返回给浏览器的文本信息, 通常为html, css, js, 图片等文件就放在这一部分;



 

5、浏览器解析渲染页面

在浏览器还没有完全接受HTML文件时便开始渲染,显示网页;

在执行HTML中代码时,根据需要,浏览器会继续请求图片, css, Javascript等文件,过程同请HTML;

浏览器是一个边解析边渲染的过程; 首先浏览器解析HTML文件构建的DOM树, 然后解析CSS文件构建渲染树,等到渲染树构建完成后, 浏览器开始布局渲染树并将其绘制到屏幕上; 这个过程比较复杂, 涉及到两个概念: reflow(回流) and repain(重绘); DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow; 当盒模型的位置, 大小以及其他属性, 如: 颜色,字体,等确定下来以后, 浏览器变回开始绘制内容, 这个过程为repain;页面在首次加载时必然会经历 reflow and repain;reflow 和 repain 过程是非常消耗性能的,尤其在移动设备上, 它会破坏用户体验, 有时候会造成用户页面卡顿; 所以我们应当尽量避免 reflow 和 repain;

S的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。



浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-6过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕

6. 连接结束
主机向服务器发送一个断开连接的请求(不早了,我该走了);
服务器接到请求后发送确认收到请求的信号(知道了);
服务器向主机发送断开通知(我也该走了);
主机接到断开通知后断开连接并反馈一个确认信号(嗯,好的),服务器收到确认信号后断开连接;

猜你喜欢

转载自www.cnblogs.com/phpcurd/p/10302298.html