本人大三学生党,最近在复习前端基础知识,会整理一些面试常考问题及答案,所以打算写这类型文章,来总结一些最近所学。如发现任何问题,可以留言,我会认真改正。本篇会讲计算机网络相关的问题,下期问题会是JavaScript相关,欢迎大家关注~~
衍生问题1:什么是回流和重绘?
回流:当渲染树中的部分或全部元素的尺寸、结构或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程叫做回流。
重绘:当页面中的元素样式改变不影响它在文档流中的位置时(color、background-color等),浏览器会将新的样式赋予给元素并重新绘制它,这个过程叫做重绘。
回流一定引起重绘,重绘不一定会引起回流。
衍生问题2:如何避免回流和重绘?
CSS:避免table布局、避免设置多层内联样式、避免使用css表达式、将动画效果应用到position属性为fixed或absolute元素上。
JS:避免频繁操作样式、对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。
网上很多文章都讲到了一下几点:
1. get请求传递的参数长度有限制,而POST没有
2. post请求比get请求安全,因为数据在地址栏不可见。
3. post请求会发出两个TCP数据包
其实这样说是不严谨的:
HTTP/1.0:每次请求都打开一个新的TCP连接,收到响应之后立即断开连接。
HTTP/1.1:
HTTP/2.0:
HTTP/3.0:
衍生问题1:HTTPS的加密方式是什么?
HTTPS采用对称加密+非对称加密的方式进行加密,具体方式可以参考下图:
2xx
3xx
4xx
5xx
如果想要了解更多状态码,戳我-->
如果想要了解更多首部字段,戳我-->
浏览器的缓存可以分为两大类:强缓存和协商缓存,浏览器在加载资源的时候,首先会判断是否命中强缓存,在验证是否命中协商缓存。浏览器的缓存存放在disk cache(磁盘缓存)、memory cache(内存缓存)中。
强缓存
Expire表示缓存的到期时间,过了这个时间,缓存就是失效,如果人为的修改客户端本地时间,就会导致缓存失效
Cache-control:max-age表示资源缓存的最大有效时间,Cache-Contral:max-age=600表示有效时间是600s。no-cache表示需要进行协商缓存;no-store表示禁止使用缓存。
Cache-control的优先级比Expire的优先级高
协商缓存
If-Modified-Since
浏览器第一次请求资源的时候,服务器返回的header上会带有last-modified字段,表示资源最后修改的时间。当浏览器再次请求资源时,请求头会带有一个If-Modified-Since字段,这个值是第一次请求返回的last-modified的值,服务器收到请求之后,将If-modified-Since和当前的last-modified进行比较。如果相同则说明资源没有修改,返回304,直接使用缓存。
Etag
Etag一般是由文件内容hash生成,也就是说它可以保证资源的唯一性,资源发送改变就会导致Etag发送改变。同样的,在浏览器第一次请求时,服务器会返回一个Etag标识。当浏览器再次请求时,会通过If-no-match字段将Etag发送服务器,然后服务器进行比较,如果相等,返回304表示资源未修改。Etag每次生成都需要进行读写操作,消耗较大。
If-Modified-Since和Etag可以同时设置,服务器会优先校验Etag,如果Etag相等就回继续比对Last-Modified,最后才会决定是否返回304.
衍生问题1:用户行为对浏览器缓存的影响
DNS是域名解析系统,最初,由于ip长且难记,通过ip访问网站不方便,所以出现了域名解析系统,将域名转化为对应的ip地址。DNS主要采用了UDP进行通讯,主机向本地域名服务器查询一般递归查询,本地域名向根域名服务器查询采用迭代查询。
CDN是内容分发网络,尽可能避开互联网上有可能影响数据传出速度和稳定性的瓶颈和环节,使传输内容更快、更稳定。CDN只是对某个具体的域名的加速。
过程:
缓存服务器响应用户请求,将用户所需内容传送到用户终端。
想要了解更多更详细的CDN知识,推荐大家阅读这几篇文章:
https://juejin.im/post/6844903906296725518#heading-6
https://juejin.im/post/6844903604596244493
https://juejin.im/post/6844903605888090125
UDP全称用户数据报协议,是运输层协议。具有以下特点:
TCP全称传输控制协议,也是运输层协议。TCP是面向连接的、可靠的字节流服务。具有以下特点:
可靠传输:已字节为单位的滑动窗口、超时重传
流量控制:利用滑动窗口实现的流量控制,告诉发送方不要太快,要让接收方来的及接受
拥塞控制:采用了四种算法:慢开始、拥塞避免、快重传、快恢复
衍生问题1:流量控制和拥塞控制的区别
衍生问题2:详细说一下,TCP的三次握手和四次挥手
三次握手:三次握手是为了保证建了一个可靠的安全链接。第一次由客户端发起,客户端会向服务端发送一个报文,报文中SYN位为1,表示要和服务端建立连接。服务端收到报文之后,要向客户端发送一个确认消息包,其中ACK为1,SYN为1,表示服务端收到了客户端发送的消息,服务端要和客户端建立连接。两次握手之后,客户端已经知道服务端可以收到我发送的消息,我也可以收到服务端发送的消息,但是服务端还不知道客户端能否收到消息。所以客户端收到消息之后,要向服务端发送ACK为1的消息包,表示收到了服务端发送的消息,通过三次握手之后,服务端和客户端都知道可以安全的收到对方发送的消息,就可以建立一个安全的连接了。
四次挥手:客户端向服务端发送一个FIN为1的报文,表示客户端要和服务端断开连接,此时服务端可能还不能断开连接,因为服务端可能还有数据没有发生完,所以只能发送ACK为1的报文,表示收到了客户端的消息。此时进入半连接状态,当服务端的数据全部发送完之后,会向客户端发送FIN为1的报文,表示要和客户端断开连接,当客户端收到消息之后,会给服务端发送一个ACK为1的确认消息包,此时客户端会进入TIME_WAIT状态,经过2MSL之后,才会断开连接。
衍生问题3:为什么要进行三次握手,而不是两次?
两次握手服务端不能确定客户端是否收到了自己发送的消息,并且可以防止已失效连接请求突然传到服务端,从而产生错误。
衍生问题4:为什么要在TIME_WAIT状态等待2MSL?
了解更多的TCP内容,可以参考以下几篇文章:
https://juejin.im/post/6844903685563105293
https://github.com/jawil/blog/issues/14
https://zhuanlan.zhihu.com/p/53374516
衍生问题1:浏览器是怎么渲染页面的
浏览器是边解析边渲染,首先浏览器解析HTML文件构建DOM树,然后会解析CSS文件构建CSS 规则树,最后根据DOM树和CSS规则树构建渲染树,等到渲染树构建完成之后,浏览器开始布局渲染树并将其绘制到屏幕,这个过程要尽量减少回流和重绘。
JS的解析是由浏览器中的JS引擎完成的,JS是单线程,文档中的JS加载并且解析完成之后,才会继续HTML的渲染,因为JS可能会改变DOM结构,所以要把script标签放到body后面,这里也可以使用defer和async。defer表示延迟执行,等到HTML解析完毕并且script加载完成才执行,async表示异步引入,如果加载好了就会立即执行。CSS文件不会影响JS的加载,但是会影响JS的解析。
只有浏览器具有同源策略,同源策略是指“协议+域名+端口”相同,否则就是跨域,即使2个不同的域名指向同一个服务端也是跨域。服务器与服务器之间不存在跨域。
解决跨域的方案有:
JSONP:
利用
表示没有跨域限制的漏洞,网页可以获得从其他来源动态产生的JSON
数据。JSONP
请求一定需要对方的服务器支持才可以。优缺点:简单兼容性好,但是仅支持GET方法具有局限性。CORS:
需要后端设置Access-Control-Allow-Origin
字段,表示哪些域名可以访问资源。CORS
默认不会发生cookie
,只有Access-Control-Allow-Credentials
为true
,表示服务器允许该请求包含cookie
信息。postMessage:
允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本文档、多窗口、跨域消息传递。websocket:
是H5的一个持久化协议,实现了客户端与浏览器的全双工通信。其中CORS分为简单请求和复杂请求。对于简单请求,浏览器直接发出CORS
请求,就是在头信息中增加一个Origin
字段,来说明请求来自哪个源,如果不在许可范围内,则响应头中没有Access-Conctrol-Allow-Origin
,浏览器会报错。复杂请求会在正式通信之前,增加一次HTTP请求(options
请求方法),称之为“预检”请求。浏览器先会询问服务器,当前网站所在的域名是否在服务器的许可名单之内,只有得到肯定的答复,浏览器才会发出正式的请求,否则就报错
XSS:跨站脚本攻击是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。
XSS攻击的分类:
预防XSS攻击:改为纯前端渲染,把代码和数据分隔开、对输入的内容做长度控制 、避免内联事件
CSRF:跨站请求伪造,攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
预防CSRF攻击:阻止不明外域的访问(同源检测) 、提交时要求附加本域才能获取的信息(CSRF Token、双重cookie验证)
以上就是近期整理的全部网络相关面试题,以后如果遇到更好的问题会及时补充,以希望大家多多补充!!
整理不易,如果这篇文章对你有用,希望可以点个大大的赞!!