前端面试-核心八股文系列(http篇)

109 阅读12分钟

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 资源⽀持不了这种消耗。

3、https 协议的⼯作原理

  1. 客户使用httpsURL访问Web服务器,要求与Web服务器建立SSL连接。
  2. Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  3. 客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
  4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
  5. Web服务器利用自己的私钥解密出会话密钥。
  6. Web服务器利用会话密钥加密与客户端之间的通信。

4、TCP三次握⼿

  1. 客服端首先发送一个连接试探。
  2. 服务器监听到连接请求报文后,如果同意建立连接,则向Client发送确认。
  3. Client收到确认后还需要再次发送确认,同时携带要发送给Server的数据。

5、为什么要三次握手?

  1. 验证服务端和客户端是否遵循TCP/IP协议
  2. 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

6、TCP 四次挥⼿

  1. 客户端进程发出连接释放报文,并且停止发送数据。
  2. 服务器收到连接释放报文,发出确认报文,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。(客户端向服务器方向释放了,但是服务器发送数据,客户端依然要接受)
  3. 客户端收到服务器的确认请求后,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,客户端就进入了TIME-WAIT(时间等待)状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。(服务器结束TCP连接的时间要比客户端早一些。)

7、域名发散和域名收敛

域名发散:为了突破浏览器对于同一域名并发请求数的限制,http 静态资源采用多个子域名,通常为2~4个。 目的是充分利用现代浏览器的多线程并发下载能力。

域名收敛:域名收敛和域名发散正好相反:就是将静态资源只放在一个域名下面,而非发散情况下的多个域名下。 主要是为了适应移动端的发展需求。

8、TCP和UDP的区别

. TCP是⾯向 链接 的,⽽UDP是⾯向⽆连接的。

. TCP仅⽀持 单播传输 ,UDP 提供了单播,多播,⼴播的功能。

. TCP的三次握⼿保证了连接的 可靠性 ; UDP是⽆连接的、不可靠的⼀种数据传输协议,⾸先不可靠性体现在⽆连接上,通信都不需要建⽴连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收。

. UDP的 头部开销 ⽐TCP的更⼩,数据 传输速率更⾼ , 实时性更好 。

9、HTTP 请求跨域问题

跨域,是指浏览器不能执⾏其他⽹站的脚本。它是由浏览器的 同源策略 造成的。

同源策略,是浏览器对 JavaScript 实施的安全限制,只要 协议、域名、端⼝ 有任何⼀个不同,都被当作是不同的域。跨域原理,即是通过各种⽅式, 避开浏览器的安全限制 。

1、JSONP:

ajax 请求受同源策略影响,不允许进⾏跨域请求,⽽ script 标签 src 属性中的链 接却可以访问跨域的 js 脚本,利⽤这个特性,服务端不再返回 JSON 格式的数据,⽽是 返回⼀段调⽤某个函数的 js 代码,在 src 中进⾏了调⽤,这样实现了跨域。

步骤:

. 去创建⼀个script标签

. script的src属性设置接⼝地址

. 接⼝参数,必须要带⼀个⾃定义函数名,要不然后台⽆法返回数据

. 通过定义函数名去接受返回的数据

JSONP 的缺点: JSON 只⽀持 get,因为 script 标签只能使⽤ get 请求; JSONP 需要后端配合返回指定格式的数据。

2、document.domain 基础域名相同 ⼦域名不同:通过修改document.domain形成同域操作

3、window.name 利⽤在⼀个浏览器窗⼝内,载⼊所有的域名都是共享⼀个window.name:通过iframe处理

4、CORS CORS(Cross-origin resource sharing)跨域资源共享 服务器设置对CORS的⽀持原理:服务器设置Access-Control-Allow-Origin HTTP响应头之后,浏览器将会允许跨域请求

5、proxy代理 ⽬前常⽤⽅式,通过服务器设置代理

6、window.postMessage() 利⽤h5新特性window.postMessage()

10、DNS 域名如何解析的?

DNS域名解析采用的是递归查询的方法

先去找DNS缓存->缓存找不到就去找根域名服务器->根域名又会去找下一级,递归查找之后,找到了,给我们的web浏览器。

  1. 浏览器首先搜索自身的DNS缓存,看缓存中是否有 www.abc.com 这个域名,有而且没有过期的话,解析结束。

  2. 如果浏览器自身的缓存中没有找到,则会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索,解析到此结束。

  3. 如果在操作系统的DNS缓存中也没有找到,那么尝试读取hosts文件,有则解析成功,解析到此结束。

  4. 如果在hosts文件中也没有找到,浏览器会发起一个DNS(Domain Name System:域名服务协议)系统调用,向本地配置的首选DNS服务器发起域名解析请求(递归请求)

11、从输⼊URL到⻚⾯加载的全过程

1、⾸先在浏览器中输⼊URL

2、查找缓存:浏览器先查看浏览器缓存-系统缓存-路由缓存中是否有该地址⻚⾯,如果有则显示⻚⾯内容。如果没有则进⾏下⼀步。

. 浏览器缓存:浏览器会记录DNS⼀段时间,因此,只是第⼀个地⽅解析DNS请求;

操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调⽤操作系统, 获取操作系统的记录(保存最近的DNS查询缓存); 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;

ISP缓存:若上述均失败,继续向ISP搜索。

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内容并渲染出来,浏览器接收到数据包后的解析流程为:

构建DOM树 -》构建render树 -〉绘制 -》JS引擎解析 -〉 创建window对象 -》 加载⽂件 -〉 预编译 -》解释执⾏

12、浏览器重绘与重排的区别?

重排/回流(Reflow) :当 DOM 的变化影响了元素的⼏何信息,浏览器需要重新计算元素的⼏何属性,将其安放在界⾯中的正确位置,这个过程叫做重排。表现为重新⽣成布局,重新排列元素。

重绘(Repaint) : 当⼀个元素的外观发⽣改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变

单单改变元素的外观,肯定不会引起⽹⻚重新⽣成布局,但当浏览器完成重排之后,将会重新绘制受到此次重排影响的部分

重排和重绘代价是⾼昂的,它们会破坏⽤户体验,并且让UI展示⾮常迟缓,⽽相⽐之下重排的性能影响更⼤,在两者⽆法避免的情况下,⼀般我们宁可选择代价更⼩的重绘。

『重绘』不⼀定会出现『重排』,『重排』必然会出现『重绘』
任何改变⽤来构建渲染树的信息都会导致⼀次重排或重绘

13、介绍下304过程

1、浏览器请求资源时⾸先命中资源的Expires 和 Cache-Control,Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效,可以通过Cache- control: max-age指定最⼤⽣命周期,状态仍然返回200,但不会请求数据,在浏览器中能明显看到from cache字样。

2、强缓存失效,进⼊协商缓存阶段,⾸先验证ETagETag可以保证每⼀个资源是唯⼀的,资源变化都会导致ETag变化。服务器根据客户端上送的If-None-Match值来判断是否命中缓存

3、协商缓存Last-Modify/If-Modify-Since阶段,客户端第⼀次请求资源时,服务服返回的header中会加上Last-Modify,Last-modify是⼀个时间标识该资源的最后修改时间。再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根 据资源的最后修改时间判断是否命中缓存。

14、浏览器的缓存机制 强制缓存 && 协商缓存

浏览器与服务器通信的⽅式为应答模式,即是:浏览器发起HTTP请求 – 服务器响应该请求。那么浏览器第⼀次向服务器发起该请求后拿到请求结果,会根据响应报⽂中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存⼊浏览器缓存中

1、强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使⽤该缓存结果的过程。

当浏览器向服务器发起请求时,服务器会将缓存规则放⼊HTTP 响应报⽂的HTTP头中和请求结果⼀起返回给浏览器,控制强制缓存的字段分别是 Expires 和 Cache-Control ,其中Cache-Control优先级⽐Expires⾼。

强制缓存的情况主要有三种(暂不分析协商缓存过程),如下:

. 不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求(跟第⼀次发起请求⼀致)。

. 存在该缓存结果和缓存标识,但该结果已失效,强制缓存失效,则使⽤协商缓存。

. 存在该缓存结果和缓存标识,且该结果尚未失效,强制缓存⽣效,直接返回该结果

2、协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使⽤缓存的过程 ,同样,协商缓存的标识也是在响应报⽂的HTTP头中和请求结果⼀起返回给浏览器的,控制协商缓存的字段分别有: Last-Modified / If-Modified-Since 和 Etag / If-None-Match ,其中Etag / If-None-Match的优先级⽐Last-Modified / If-Modified-Since⾼。协商缓存主要有以下两种情况:

. 协商缓存⽣效,返回304

. 协商缓存失效,返回200和请求结果结果

15、get和post的区别

1、get在浏览器回退的时候是无害的,post会再次提交请求

2、get请求会被浏览器主动cache,而post不会,除非手动设置

3、GET请求只能进行url编码,而POST支持多种编码方式

4、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留

5、GET请求在URL中传送的参数是有长度限制的,而POST没有

6、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

其实区别并不大,在http上都是明文传输,只有使用HTTPS才能加密安全