今天阅读了 《阿里面试官的”说一下从url输入到返回请求的过程“问的难度就是不一样!》,总结了一个流程图:
文中仔细讲了构建 DOM Tree
之前的技术细节,我也主要围绕这个写点自己的理解。
对 URL 的解析
首先,为什么要有这样解析 URL 的步骤?因为不转义会出现歧义,如 http://baidu.com?key=value
,当这里的 key
本身就包括了 =
,就会变成 ke=y=value
出现歧义。
其次,URL 的编码为 utf-8,可通过 encodeURIComonent
来确保。
DNS 解析流程
简易版:
完整版:
- 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
- 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
Reference:http://road2ai.info/2017/08/15/WindowsServer-DNSForward/
三次握手
-
第一次握手:发送端发送位码为SYN=1的TCP包给接收端,并且随机产生一个作为确认号(这是tcp包的一部分),接收端收到SYN码后直到发送端要求建立连接;
-
第二次握手:接收端收到请求后,向发送端发送确认号(发送端的seq+1),syn=1,seq = 随机数 的TCP包;
-
发送端收到后检查确认号是否正确,即第一次发送端发送的确认号是否+1了,以及位码ack是否为1,若正确,发送端会再发送确认号(接收端的seq+1),ack=1,接收端收到后确认seq值与ack=1则连接建立成功。
页面渲染优化
- 在脚本中尽量减少DOM操作,尽量缓存访问DOM的样式信息,避免过度触发回流;
- 减少通过JavaScript代码修改元素样式,尽量使用修改class名方式操作样式或动画;
- HTML文档结构层次尽量少
- JavaScript 引入尽量后放;
- 首屏中少量的样式用内联的方式写在标签内;
- 动画尽量使用在绝对定位或固定定位的元素上;
- 隐藏在屏幕外,或在页面滚动时,尽量停止动画;