在浏览器输入url之后,浏览器首先会判断在地址栏中输入的信息到底是url还是关键字 如果是关键字,那么浏览器会使用默认的搜索引擎搜索关键字,这和直接访问url的请求、响应过程一致, 如果是url,那么浏览器则会准备开始进行下一步:判断时候访问DNS
DNS(域名服务器),浏览器在之前url的基础上判断,该地址是否含有域名 如果有,则访问域名服务器,域名服务器中存放了各个域名对应的IP地址,浏览器在发出带有域名的请求后会收到带有IP的响应,在拿到IP地址之后,浏览器发送请求报文
浏览器把地址信息封装成请求报文包括请求行、请求头、请求体(简单理解相当于XMLHttpRequest里面的open()/setHeader()/send()方法分别设置了请求行、头、体),接下来请求报文将经由传输层
浏览器发送的请求报文由应用层到达了传输层,将端口、标志数据等封装到报文上然后交由网络层,网络层再次封装并添加数据,最后数据链路层添加mac信息等完成封装、准备传输 !:这部分由于了解的不多,仅作参考
封装完毕的数据通过‘网线’传输,其中路由器扮演了重要的角色,路由器中的路由表帮助请求能准确的找到服务端,如果一个路由器在路由表中找不到和请求报文中IP地址相同的内容,则让报文通行至上一层路由器,上一层以此类推,这样就找到了对应的IP地址,接收方接收请求报文,并沿着数据链路层–网络层–传输层–应用层的顺序将报文的其他信息拨开,准确的把信息发送给对应IP、端口的服务端
服务端接受到请求后返回响应,把对应的html页面通过http、ftp等指定好了的协议封装,接下来和发送请求报文类似,设置响应行、响应头、响应体并将其封装、传输给发送请求的浏览器
浏览器收到响应报文后进行解析,解析方式遵守指定的规则(http、ftp等),这样浏览器就得到了一个html页面,接下来进行渲染、显示
浏览器得到html文件后,浏览器在主线程先对html进行解析,在html解析过程中,如果遇到script标签,则先解释js代码,因为如果跳过JS直接解释HTML的话,后续JS对DOM树的操作会导致DOM树变化,不利于提高效率,在解释完html文件后,浏览器就生成了DOM树,然后浏览器开始解析样式,生成样式表,有了节点元素和样式,浏览器就会生成Layout树,随后确定绘画顺序,最终在主线程完成layer树,这时,合成器线程会拿着layer树和绘制顺序表分图层>>图块,将图块交给栅格线程栅格化,栅格化之后,合成器线程会拿到处理好的图块信息并交由GPU渲染、最后显示在屏幕上
主线程主要负责DOM树、style表、Layout树、layer树、绘制顺序表的生成,但是它也负责JS的执行,因此动画在绘制每帧动画的时候,可能会发生JS和动画绘制抢占资源的情况从而造成卡顿,因此不提倡过多的让页面重构、重绘,这些会占用主线程资源