从输入网址到页面显示经历了那些步骤?
第一步:查找域名的IP地址(浏览器缓存,系统缓存,路由器缓存,ISP的DNS缓存,递归搜索域名从顶级域名开始)
第二步:通过三次握手建立TCP/IP连接
第三步:发送HTTP请求(HTTP头等分析)
第四步:baidu.com到www.baidu.com的永久重定向相应(和搜索引擎重定向排名有关,搜索引擎知道301是什么意思,于是将两者归于同一个名下;用多个地址会导致缓存效果较差)
第五步:跟踪重定向地址发送请求
第六步:服务器处理响应(可能要设置http头);四次放手协议
第七步:浏览器获取到二进制的数据, 转换(Conversion): 浏览器从磁盘或者网络上读取HTML的原始字节,然后根据指定的编码规则转换成单独的字符(比如按UTF-8编码)。标记分解(Tokenizing):浏览器将字符串按照W3C HTML5标准转换成确定的标记,比如<html>、<body>以及其他带尖括号的字符。每个标记都有特定的意义以及一套规则。词法分析(Lexing):分解出来的标记被转换成能定义其属性和规则的对象。DOM 构造: 最终由于HTML标记定义了不同标签的关系(有些标签嵌套在其他标签里面),创建出来的对象被关联到一个树形数据结构。这颗树会反映在原先标签里定义的父子关系,比如HTML对象就是body对象的父对象,body对象又是paragraph对象的父对象等等。(参见谷歌 Web 开发最佳实践手册(4.1.1):创建对象模型)
第八步:发送请求获取在html中其它内容如img/javascript/css等,如果是javascript可能要按顺序逐个下载执行
第九步:浏览器从服务端获取网页后会根据文档的DOCTYPE定义显示网页,如果文档正确定义了DOCTYPE浏览器则会进入标准模式(Standards Mode),否则浏览器会进入怪异模式或混杂模式(Quirks mode)。
第十步:构建DOM树/CSSOM树构建渲染树(这时候对于head,或者display:none等不需要显示的元素不会在渲染树上),然后进行对象尺寸的计算,并且绘制到屏幕上!(DNS预处理,link prefetching,ajax请求等)