一、 输入url到页面呈现发生了什么
- 首先会进行 url 解析,根据 dns 系统进行 ip 查找 根据 ip 就可以找到服务器,然后浏览器和服务器会进行 TCP 三次握手建立连接,如果此时是 https 的话,还会建立 TLS 连接以及协商加密算法,这里就会出现另一个需要注意的问题"https 和 http 的区别"(下文会讲到)
- 连接建立之后浏览器开始发送请求获取文件,此时这里还会出现一种情况就是缓存,建立连接后是走缓存还是直接重新获取,需要看后台设置,所以这里会有一个关注的问题"浏览器缓存机制",缓存我们等会在讲,现在我们就当没有缓存,直接去获取文件
- 首先获取 html 文件,构建 DOM 树,这个过程是边下载边解析,并不是等 html 文件全部下载完了,再去解析 html,这样比较浪费时间,而是下载一点解析一点
- 好了解析到 html 头部时候,又会出现一种问题,css,js 放到哪里了?不同的位置会造成渲染的不同,此时就会出现另一个需要关注的问题"css,js 位置应该放哪里?为什么",我们先按照正确的位置来说明(css 放头部,js 放尾部)
- 解析到了 html 头部发现有 css 文件,此时下载 css 文件,css 文件也是一边下载一边解析的,构建的是 CSSOM 树,当 DOM 树和 CSSOM 树全部构建完之后,浏览器会把 DOM 树和 CSSOM 树构建成渲染树。
- 样式计算, 上面最后一句"DOM 树和 CSSOM 树会一起构建成渲染树"说的有点笼统,其实还有更细一点的操作,但是一般回答到上面应该就可以了,我们现在接上面说一下构造渲染树的时候还做了哪些事情。第一个就是样式计算,DOM树 和 CSSOM树有了之后,浏览器开始样式计算,主要是为 DOM 树上的节点找到对应的样式
- 构建布局树,样式计算完之后就开始构建布局树。主要是为 DOM 树上的节点找到页面上对应位置以及一些"display:none"元素的隐藏。
- 构建分层树,布局树完成后浏览器还需要建立分层树,主要是为了满足滚动条,z-index,position 这些复杂的分层操作
- 将分层树图块化,利用光栅找到视图窗口下的对应的位图。主要是因为一个页面可能有几屏那么长,一下渲染出来比较浪费,所以浏览器会找到视图窗口对应的图块,将这部分的图块进行渲染
- 最终渲染进程将整个页面渲染出来,在渲染的过程中会还出现重排和重绘,这也是比较爱问的问题"重排重绘为什么会影响渲染,如何避免?"
三次握手
- 客户端发送向服务端发送一个请求连接的包
- 服务端返回一个确认包,表明收到了客户端发来的包
- 客户端收到后同样也返回一个确认包,表明也受到了服务器发来的包,连接建立
四次挥手
- 客户端向服务端发送一个请求断开连接的包,停止发送数据并主动关闭tcp连接
- 服务端返回一个确认包,进入关闭等待状态
- 如果服务端也想断开连接了,也发送一个断开连接的FIN包,
- 客户端收到后再向服务端发送一个确认包,等服务端收到后断开连接
Q: 为什么三次握手?
可以通过双方确认自己的收发能力来确认:
- 客户端发送后 收到服务端的确认包 客户端知道了自己的收发能力是可以的
- 客户端再返回确认包之后,服务端也知道了自己的收发能力是正常的
如果两次,也就是C--S S---C 服务段则无法得知自己发送的确认包对方是否收到,所以至少三次握手才可以。
另外还可以想象一个场景,如果是二次握手: C 发送了一个包 但是此时由于网络问题,S并没有收到,到达超时时间后,C发现自己还没收到S的确认包,于是又发送了一个数据包,这时S收到了,并正确返回了,于是二者建立了通信,而且在通信结束后也正确关闭了。
过了一段时间,之前迷失的数据包这时送到了S这里,S相应的返回确认,但是C以为之前的包已经丢包了,所以C直接就忽略了,而服务端这时还在傻傻等待着。。。
Q:为什么四次挥手
建立连接的时候服务段是ack 和 fin一块发送, 但是断开连接的时候,服务端还保持接收能力。
回顾整个流程,C首先请求断开,并停止发送数据,但S此时可能手头上还有事情要处理,要过一段时间才能断开,所以只能发送一个确认报文,所以需要四次
XSS & CSRF
XSS: tech.meituan.com/2018/09/27/… csrf: tech.meituan.com/2018/10/11/…