前端面试自用总结--网络和浏览器

126 阅读12分钟

网络和浏览器

三次握手 四次挥手
 三次握手
 三次握手的作用:确保客户端和服务器接收和发送请求正常,这样的话就可以建立连接
 第一次握手,客户端给服务器发送SYN (同步),服务器接收。
 作用:服务器确认客户端发送请求正常和自己的接收请求正常
 第二次握手,服务端发送SYN+ACK (确认),客户端接收。
 作用:客户端确认自己和服务器的接收和发送请求都正常
 第三次握手,客户端发送ACK,服务器接收。
 作用:服务器确认客户端和自己的接收和发送请求都正常最后客户端和服务器都知道自己的接收和发送都正常,就可以建立连接。
 ​
 四次挥手
 四次挥手的目的是关闭客户端和服务器的连接。
 第一次挥手:客户端给服务器发送FIN (结束)+ACK(确认),请求断开连接,服务器接收。
 第二次挥手:服务器发送ACK,表示已经收到了客户端断开连接的请求。此时客户端到服务器的连接关闭,但服务器如果有部分数据没有发送给客户端,服务器就会发送完成数据之后,才会向
 客户端发送断开连接的请求,即第三次挥手。
 第三次挥手:服务器已经没有数据需要发送给客户端的时候,就向客户端发送FIN+ACK请求,表示已经断开连接。
 第四次挥手:客户端给服务器发送ACK,表示已经知道服务器关闭了连接。
http与https
 1.http  https 的基本概念
 http: 是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的超文本传输协议。
 https:是以安全为目标的 HTTP 通道,即 HTTP  加入 SSL 层进行加密。其作用是:建立一个信息安全通道,来确保数据的传输,确保网站的真实性。
 
 2.http  https 的区别及优缺点?
 http 是超文本传输协议,信息是明文传输,HTTPS 协议要比 http 协议安全,https 是具有安全性的 ssl 加密传输协议,可防止数据在传输过程中被窃取、改变,确保数据的完整性(当然这种安全性并非绝对的,对于更深入的 Web 安全问题,此处暂且不表)。
 http 协议的默认端口为 80,https 的默认端口为 443
 http 的连接很简单,是无状态的。https 握手阶段比较费时,会使页面加载时间延长 50%,增加 10%~20%的耗电。
 https 缓存不如 http 高效,会增加数据开销。
 Https 协议需要 ca 证书,费用较高,功能越强大的证书费用越高。
 SSL 证书需要绑定 IP,不能再同一个 IP 上绑定多个域名,IPV4 资源支持不了这种消耗。
http请求方法
 GET: 向服务器获取数据;
 POST:将实体提交到指定的资源,通常会造成服务器资源的修改;
 PUT:上传文件,更新数据;
 DELETE:删除服务器上的对象;
 HEAD:获取报文首部,与GET相比,不返回报文主体部分;
 OPTIONS:询问支持的请求方法,用来跨域请求;
 CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信;
 TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。
http状态码
 1xx - 服务器收到请求。
 2xx - 请求成功,如 200。
 3xx - 重定向,如 302。
 4xx - 客户端错误,如 404。
 5xx - 服务端错误,如 500。
 200 - 成功。
 301 - 永久重定向(配合 location,浏览器自动处理)。
 302 - 临时重定向(配合 location,浏览器自动处理)。
 304 - 资源未被修改。
 403 - 没权限。
 404 - 资源未找到。
 500 - 服务器错误。
 504 - 网关超时。
强缓存和协商缓存
 浏览器每次发起请求,都会先在浏览器缓存中查找该请求的结果以及缓存标识
 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中
 ​
 强制缓存
 强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。当浏览器向服务器发起请求时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是 Expires 和 Cache-Control,其中Cache-Control优先级比Expires高。
 强制缓存的情况主要有三种(暂不分析协商缓存过程),如下:
 不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求(跟第一次发起请求一致)。
 存在该缓存结果和缓存标识,但该结果已失效,强制缓存失效,则使用协商缓存。
 存在该缓存结果和缓存标识,且该结果尚未失效,强制缓存生效,直接返回该结果
 Cache-Control 有哪些值:
 max-age:缓存最大过期时间。
 no-cache:可以在客户端存储资源,每次都必须去服务端做新鲜度校验,来决定从服务端获取新的资源(200)还是使用客户端缓存(304)。
 no-store:永远都不要在客户端存储资源,永远都去原始服务器去获取资源。
 ​
 协商缓存
 协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,同样,协商缓存的标识也是在响应报文的HTTP头中和请求结果一起返回给浏览器的,控制协商缓存的字段分别有:Last-Modified / If-Modified-Since 和 Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。协商缓存主要有以下两种情况:
 协商缓存生效,返回304
 协商缓存失效,返回200和请求结果结果
cookie,localStorage, sessionStorage三者区别
 相同点:
 存储在客户端
 不同点:
 cookie数据大小不能超过4k;sessionStorage和localStorage的存储比cookie大得多,可以达到5M+
 cookie设置的过期时间之前一直有效;localStorage永久存储,浏览器关闭后数据不丢失除非主动删除数据;sessionStorage数据在当前浏览器窗口关闭后自动删除
 cookie的数据会自动的传递到服务器;sessionStorage和localStorage数据保存在本地
跨域的解决方法(jsonp的详细实现过程)
 跨域:浏览器从一个域名的网页去请求另一个域名的资源时,协议、域名、端口任一个不同,都叫做跨域。协议、域名、端口都相同叫做同源策略,它的作用就是为了防止别人恶意访问。
 1、jsonp跨域
 jsonp是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。
 核心思想: <srcipt> 标签的src属性不受同源策略限制,可以用来作为请求,后端接受请求后返回一个回调函数callback,前端调用已经定义好的函数获取数据,从而实现跨域请求。
 2、CORS 
 (1)放开服务端跨域限制,通过添加response的header的方法,设置所有权限都可以访问。.header(' Access-Control-Allow-Origin:“*” );
 (2)或者在第三方库( node.js) 引入cors,设置cors({origin: "*",})
 3、代理(Proxy)
 将请求资源的操作通过一层代理,然后取回数据,再从代理层把数据返给浏览器,由于代理层和浏览器是同源的,这样就解决了跨域的问题。
TCP和UDP的区别
 TCP是面向链接的,而UDP是面向无连接的。
 TCP仅支持单播传输,UDP 提供了单播,多播,广播的功能。
 TCP的三次握手保证了连接的可靠性; UDP是无连接的、不可靠的一种数据传输协议,首先不可靠性体现在无连接上,通信都不需要建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收。
 UDP的头部开销比TCP的更小,数据传输速率更高,实时性更好
输入url后的整个过程
 1.首先在浏览器中输入URL
 2.查找缓存:浏览器先查看浏览器缓存-系统缓存-路由缓存中是否有该地址页面,如果有则显示页面内容。如果没有则进行下一步。
 3.DNS域名解析:浏览器向DNS服务器发起请求,解析该URL中的域名对应的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议。
 4.建立TCP连接:解析出IP地址后,根据IP地址和默认80端口,和服务器建立TCP连接
 5.发起HTTP请求:浏览器发起读取文件的HTTP请求,,该请求报文作为TCP三次握手的第三次数据发送给服务器
 6.服务器响应请求并返回结果:服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
 7.关闭TCP连接:通过四次挥手释放TCP连接
 8.浏览器渲染:客户端(浏览器)解析HTML内容并渲染出来,浏览器接收到数据包后的解析流程为:
 9.JS引擎解析过程:调用JS引擎执行JS代码(JS的解释阶段,预处理阶段,执行阶段生成执行上下文,VO,作用域链、回收机制等等)
回流和重绘
 重排/回流(Reflow):当DOM的变化影响了元素的几何信息,浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。表现为重新生成布局,重新排列元素。
 重绘(Repaint): 当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变
 ​
 集中改变样式,不要一条一条地修改 DOM 的样式。
 不要把 DOM 结点的属性值放在循环里当成循环里的变量。
 为动画的 HTML 元件使用 fixedabsoultposition,那么修改他们的 CSS 是不会 reflow 的。
 不使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局。
 尽量只修改positionabsolutefixed元素,对其他元素影响不大
 动画开始GPU加速,translate使用3D变化
 提升为合成层
前端性能优化
 1.懒加载也叫做延迟加载、按需加载,指的是在长网页中延迟加载图片数据,是一种较好的网页性能优化的方式。在比较长的网页或应用中,如果图片很多,所有的图片都被加载出来,而用户只能看到可视窗口的那一部分图片数据,这样就浪费了性能。
 图片的加载是由src引起的,当对src赋值时,浏览器就会请求图片资源。根据这个原理,我们使用HTML5 的data-xxx属性来储存图片的路径,在需要加载图片的时候,将data-xxx中图片的路径赋值给src,这样就实现了图片的按需加载,即懒加载。
 ​
 2.减少回流与重绘的措施:
 操作DOM时,尽量在低层级的DOM节点进行操作
 不要使用table布局, 一个小的改动可能会使整个table进行重新布局
 使用CSS的表达式
 不要频繁操作元素的样式,对于静态页面,可以修改类名,而不是样式。
 使用absolute或者fixed,使元素脱离文档流,这样他们发生变化就不会影响其他元素
 避免频繁操作DOM,可以创建一个文档片段documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中
 将元素先设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。
 将DOM的多个读操作(或者写操作)放在一起,而不是读写操作穿插着写。这得益于浏览器的渲染队列机制。
 浏览器针对页面的回流与重绘,进行了自身的优化——渲染队列
 ​
 3.函数防抖是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。这可以使用在一些点击请求的事件上,避免因为用户的多次点击向后端发送多次请求。
 function debounce(fn, wait) {
   var timer = null;
   return function() {
     var context = this,
       args = [...arguments];
     // 如果此时存在定时器的话,则取消之前的定时器重新记时
     if (timer) {
       clearTimeout(timer);
       timer = null;
     }
     // 设置定时器,使事件间隔指定事件后执行
     timer = setTimeout(() => {
       fn.apply(context, args);
     }, wait);
   };
 }
 ​
 *函数节流是指规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。节流可以使用在 scroll 函数的事件监听上,通过事件节流来降低事件调用的频率。
 // 定时器版
 function throttle (fun, wait){
   let timeout = null
   return function(){
     let context = this
     let args = [...arguments]
     if(!timeout){
       timeout = setTimeout(() => {
         fun.apply(context, args)
         timeout = null 
       }, wait)
     }
   }
 }
 ​
 4.对项目中的图片进行优化?
 不用图片。很多时候会使用到很多修饰类图片,其实这类修饰图片完全可以用 CSS 去代替。
 对于移动端来说,屏幕宽度就那么点,完全没有必要去加载原图浪费带宽。一般图片都用 CDN 加载,可以计算出适配屏幕的宽度,然后去请求相应裁剪好的图片。
 小图使用 base64 格式
 将多个图标文件整合到一张图片中(雪碧图)
 选择正确的图片格式