当前位置: 首页 > Web前端 > HTML

浏览器从输入网址到加载页面的全过程

时间:2023-03-28 17:26:57 HTML

1.首先在浏览器中输入网址2。查找缓存:浏览器??首先检查浏览器缓存-系统缓存-路由缓存中是否存在该地址页面,如果存在则显示页面内容。如果没有,请继续下一步。浏览器缓存:浏览器??会记录一段时间的DNS,所以它只是解析DNS请求的第一位;操作系统缓存:如果这条记录不在浏览器缓存中,系统会调用操作系统获取操作系统的Record(保存最新的DNS查询缓存);路由器缓存:如果以上两步获取不到DNS记录,继续查找路由器缓存;ISP缓存:如果以上都失败,则继续搜索ISP。3、DNS域名解析:浏览器向DNS服务器发起请求,解析URL中域名对应的IP地址。DNS服务器是基于UDP的,所以会用到UDP协议。以dns解析www.example.com为例。从浏览器的dns缓存中获取dns解析结果,获取成功则直接返回。如果失败,则进入下一步,从本地dns缓存中获取解析结果。如果失败,则进入下一步向设置的dns服务器(一般是ISPInternet服务商的dns服务器)发起dns解析请求(需要考虑路由器缓存和运营商的dns缓存),如果失败,转到下一步。ISP的DNS解析器将www.example.com的请求转发给DNS根名称服务器。ISP的DNS解析器再次将对www.example.com的请求转发到.com域的TLD名称服务器。.com域的名称服务器使用与example.com域关联的四个AmazonRoute53名称服务器的名称响应请求。ISP的DNS解析器选择一个AmazonRoute53名称服务器并将对www.example.com的请求转发到该名称服务器。AmazonRoute53名称服务器在example.com托管区域中查找www.example.com记录,获取值,例如Web服务器的IP地址(192.0.2.44),并将IP地址返回给DNS解析器.ISP的DNS解析器最终得到用户需要的IP地址。解析器将此值返回给Web浏览器。DNS解析器还会在您指定的时间长度内缓存(存储)example.com的IP地址,以便下次有人浏览example.com时它可以更快地响应。有关详细信息,请参阅生存时间(TTL)。Web浏览器向从DNS解析器获得的IP地址发送对www.example.com的请求。这是您的内容所在的位置,例如在AmazonEC2实例或配置为网站端点的AmazonS3存储桶中运行的Web服务器。192.0.2.44上的Web服务器或其他资源将www.example.com的网页返回给Web浏览器,Web浏览器显示该页面。4、建立TCP连接:解析IP地址后,根据IP地址和默认端口80与服务器建立TCP连接。5、发起HTTP请求:浏览器发起HTTP请求读取文件,并请求报文作为TCP三次握手第三次数据发送给服务器6.服务器响应请求并返回结果:服务器响应浏览器请求,将相应的html文件发送给浏览器7.关闭TCP连接:四次挥手释放TCP连接8.浏览器渲染:客户端(浏览器)解析HTML内容并渲染。浏览器收到数据包后,解析过程为:构建DOM树:词法分析,然后解析成DOM树(dom树),DOM树由dom元素和属性节点组成。树的根是文档对象。构建CSS规则树:生成CSS规则树(CSSRuleTree)构建渲染树:Web浏览器结合DOM和CSSOM构建渲染树(rendertree)布局(Layout):计算每个节点在屏幕绘制(Painting):即遍历渲染树,使用UI后端层绘制每个节点。9、JS引擎解析过程:调用JS引擎执行JS代码(JS解释阶段、预处理阶段、执行阶段生成执行上下文、VO、作用域链、回收机制等)创建window对象:window对象也称为globalexecution环境是在页面生成的时候创建的,所有的全局变量和函数都属于窗口的属性和方法,DOMTree也会映射到窗口的doucment对象上。当关闭网页或关闭浏览器时,全局执行环境将被破坏。加载文件:完成js引擎分析其文法和词法语法是否合法。如果合法,则进入预编译预编译:在预编译过程中,浏览器会寻找全局变量声明,并将其作为window属性添加到window对象中。并将变量分配为“未定义”;寻找全局函数声明,将其作为窗口方法添加到窗口对象中,并将函数体赋值给他(匿名函数不参与预编译,因为它是一个变量)。ES6中已经解决了变量提升不合理的地方,函数提升依然存在。解释和执行:当变量被执行时,它会被赋值。如果变量没有定义,则不会预编译,直接赋值。在ES5非严格模式下,这个变量会成为window的一个属性,即成为一个全局变量。string、int等值是直接把值放到变量的存储空间中,object对象是把指针指向变量的存储空间。当函数执行时,将函数的环境压入一个环境的栈中,执行完成后弹出,控制权还给之前的环境。JS作用域其实就是通过这样的执行流机制来实现的。