
文章目录系列文章:
2022前端大厂面试题之JavaScript篇(1)
2022前端大厂面试题之JavaScript篇(2)
2022前端大厂面试题之JavaScript篇(3)
2022大厂高频面试题之 *** 作系统篇
2022前端大厂高频面试题之HTTP篇
2022大厂高频面试题之计算机网络篇
- 2022前端大厂高频面试题之HTTP篇超全总结
- HTTP协议
- HTTP的特点及缺点
- GET和POST两种基本请求方法的区别
- POST和PUT请求的区别
- HTTP请求报文
- 常见的HTTP请求方法
- HTTP响应报文
- HTTP响应报文中常见的状态码
- Http缓存机制与原理
- HTTP的基本优化
- keep-alive
- HTTP 1.0和 HTTP 1.1 的区别
- SPDY
- HTTP 1.1 和 HTTP 2.0 的区别
- HTTP 3.0
- HTTPS协议
- TLS/SSL
- HTTP与HTTPS的区别
- HTTPS是如何保证安全的
HTTP 是一个在客户端和服务器之间传输文字、图片、音频、视频等超文本数据的约定和规范。默认使用 80 端口,它使用 TCP 作为传输层协议,保证了数据传输的可靠性。
HTTP的特点及缺点特点: 端对端, 灵活可拓展,可靠, 无状态, 持久连接
- HTTP协议是一种端对端的协议,也是一种请求/响应模式的协议。
- 灵活可扩展:一个是语义上的自由,只规定了基本格式,其它的各部分没有严格的限制;第二个它允许传输任意类型的数据对象,例如文本、图片、音频等,传输的类型由Content-Type加以标记。
- 可靠传输,HTTP 基于 TCP/IP,因此把这一特性继承了下来。
- 无状态,也就是说HTTP请求不具备保存之前发送过的请求或响应的功能,每一次请求都是独立无关的。
- 持久连接,HTTP1.1 以后默认采用的是持续的连接,持续连接下,TCP 连接默认不关闭,可以被多个请求复用,目前对于同一个域,大多数浏览器支持 同时建立 6 个持久连接。
缺点:不加密,篡改,遭遇伪装,无状态,队头阻塞
- 明文传输(不加密),内容可能被窃听。
- 无法验证报文的完整性,内容可能被篡改。
- 不验证通信方的身份,有可能遭遇伪装。
- 无状态,它是缺点也是优点吧,分不同的场景。
- 队头阻塞。HTTP2多路复用解决问题
GET和POST是 HTTP 请求的两种方法,其区别如下:
- Get是不安全的,因为在传输过程,Get没有请求体,数据被放在请求的URL中;Post放在 Request body 中,所有 *** 作对用户来说都是不可见的,比较安全。(请求头:一般用来存放一些cookie,token信息;请求体一般用来存储post的参数和参数数据)
- Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制。
- GET 请求会被浏览器主动 缓存(cache),而 POST 不会,除非手动设置。
- GET 请求保留在浏览器历史记录中,POST 请求不会保留在浏览器历史记录中。
- GET 在刷新浏览器或回退时是没有影响的,而 POST 会再次提交请求。
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),如果失败了就不用继续发送data,从而减少了资源的浪费。
- 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。安全指该 *** 作用于获取信息而非修改信息,幂等指对同一URL的多个请求应该返回同样的结果。
- 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
- Get执行效率却比Post方法好。Get是form提交的默认方法。
- get一般用来从服务器上获得数据,而post是用来向服务器上传递数据。
- GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- PUT请求是向服务器端发送数据,从而修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT *** 作,其结果并没有不同。(可以理解为时更新数据)
- POST请求是向服务器端发送数据,该请求会改变数据的种类等资源,它会创建新的内容。(可以理解为是创建数据)
一个HTTP请求报文由请求行、请求头部、空行和请求数据 4个部分组成。
GET: 向服务器获取数据;
POST:将实体提交到指定的资源,通常会造成服务器资源的修改;
PUT:上传文件,更新数据;
DELETE:删除服务器上的对象;
HEAD:获取报文首部,与GET相比,不返回报文主体部分;
OPTIONS:询问支持的请求方法,用来跨域请求;
CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信;
TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。
HTTP响应报文由响应行、响应头部、空行和响应正文 4个部分组成。
响应行:由网络协议版本,状态码和状态码的原因短语组成,例如 HTTP/1.1 200 OK 。
常见的HTTP请求头和响应头
HTTP状态码表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常或者是出现的错误,能够根据返回的状态码判断请求是否得到正确的处理。
- 1XX 表示消息,接受的请求正在处理
- 2XX 表示成功,请求正常处理完毕
- 3XX 表示重定向,需要进行附加 *** 作以完成请求
- 4XX 表示客户端错误,服务器无法处理请求
- 5XX 表示服务端错误
101 Switching Protocol(协议切换)状态码表示服务器应客户端升级协议的请求对协议进行切换。
200 Ok表示资源请求成功,也是最常见到的状态码。
201 Created资源创建成功,多用于 POST 请求。
204 No Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回)。
206 Partial Content表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容。当请求多媒体数据数据较大时,会进行分片传输。当你在 B 站观看视频,打开开发者工具,会发现许多 206 状态码以及响应头 Content-Range。
301 Moved Permanently永久重定向。表示请求的资源被分配了新的URL,之后应使用更改的URL。
302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;会在重定向的时候改变 method: 把 POST 改成 GET,于是有了 307。
303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;
304 Not Modified:304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。
307 Temporary Redirect:临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;
400 Bad Request:表示请求报文中存在语法错误;
401 Unauthorized:当没有权限的用户请求需要带有权限的资源时,会返回 401(没有经过身份验证或身份验证不正确)
403 Forbidden:服务器拒绝该次访问(通过身份验证,但访问权限出现问题)
404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;
405 Method Not Allowed需要 POST 这条资源,却用的 GET
422 Unprocessable Entity常用来处理不合法的参数校验。
429 Too Many Request请求过多被限流。
500 Internal Server Error服务器内部错误,很有可能是应用层未捕获错误而导致整个服务挂掉
502 Bad Gateway:Nginx 上常见,从上游应用层未返回响应,上游应用层挂了
503 Service Unavailable服务器暂时处于超负载或正在进行停机维护,无法处理请求。
504 Gateway Timeout网关超时,上游应用层迟迟未响应。
Http缓存主要分为两种:强缓存和协商缓存。
- 强缓存:
强缓存基本原理是:所请求的数据在缓存数据库中尚未过期时,不与服务器进行交互,直接使用缓存数据库中的数据。当缓存未命中时,则重新向服务器请求数据,其基本流程与首次请求时相似。 - 协商缓存
当强缓存过期未命中或者响应报文Cache-Control中有must-revalidate标识必须每次请求验证资源的状态时,便使用协商缓存的方式去处理缓存文件。
协商缓存主要原理是从缓存数据库中取出缓存的标识,然后向浏览器发送请求验证请求的数据是否已经更新,如果已更新则返回新的数据,若未更新则使用缓存数据库中的缓存数据。
两个字段Etag和Last-Modified是用于协商缓存的规则字段。其中etag是所请求的数据在服务器中的唯一标识,而last-modifind标识所请求资源最后一次修改的时间。
此处参考
刷新页面对缓存的影响:
正常 *** 作:地址栏输入URL,跳转链接,前进后退等【强制缓存有效,协商缓存有效】
手动刷新:F5,点击刷新按钮,点击菜单刷新【强制缓存失效,协商缓存有效】
强制刷新:CRTL+F5【强制缓存失效,协商缓存失效】
影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。
延迟:
现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。
-
管道网络传输:在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但是服务器还是按照顺序回应请求。如果前面的回应特别慢,后面就会有许多请求排队等着,即队头堵塞。
-
队头堵塞(HOL blocking):HTTP 传输的报文里面的任务被放在一个任务队列中串行执行,一旦队首的请求处理太慢,就会阻塞后面请求的处理。这就是HTTP队头阻塞问题。
解决方法:
(1)并发连接:对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。
(2)域名分片:将域名分出很多二级域名,它们都指向同样的一台服务器,能够并发的长连接数变多,解决了队头阻塞的问题。 -
DNS 查询(DNS Lookup):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。
-
建立连接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
解决方法:持久连接。
HTTP协议有两种连接模式,一种是持续连接,一种非持续连接。
(1)非持续连接(HTTP/1.0中)指的是服务器必须为每一个请求的对象建立和维护一个全新的连接。
(2)持续连接(HTTP/1.1中),TCP 连接默认不关闭,可以被多个请求复用。采用持续连接的好处是可以避免每次建立 TCP 连接三次握手时所花费的时间。
HTTP1.0 中默认是在每次请求/应答,客户端和服务器都要新建一个连接,完成之后立即断开连接,这就是短连接。当使用Keep-Alive模式时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接,这就是长连接。
优点:
较少的CPU和内存的使用(由于同时打开的连接的减少了);
允许请求和应答的HTTP管线化;
降低拥塞控制 (TCP连接减少了);
减少了后续请求的延迟(⽆需再进⾏握⼿);
报告错误⽆需关闭TCP连;
缺点:
长时间的Tcp连接容易导致系统资源无效占用,浪费系统资源。
- 连接方面,http1.0 默认使用非持久连接(短连接),而 http1.1 默认使用持久连接(长连接) 和请求的流水线处理。http1.1 通过使用持久连接来使多个 http请求复用同一个 TCP 连接,减少了建立和关闭连接的消耗和延迟。
- 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- 资源请求方面,在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接。
- 缓存方面,在 http1.0 中主要使用 header 里的 If-Modified-Since、Expires
来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如
Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。 - http1.1 中新增了 host 字段,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP地址,因此,请求消息中的 URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了host 字段,这样就可以将请求发往到同一台服务器上的不同网站。
- http1.1 相对于 http1.0 还新增了很多请求方法,如 PUT、HEAD、OPTIONS 等。
其实 SPDY 并不是新的一种协议,而是在 HTTP 之前做了一层会话层。优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性。
- 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
- 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
- header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
- 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
- 服务端推送(server push),采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。
- 头信息压缩
- 二进制协议:HTTP/2 是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。
- 多路复用: 一个request对应一个id,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送。
- 数据流: 因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP/2将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流 ID,用来区分它属于哪个数据流。
- 服务器推送: HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对减少一些延迟时间。注意http2 下服务器主动推送的是静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。
HTTP/3基于UDP协议实现了类似于TCP的多路复用数据流、传输可靠性等功能,这套功能被称为QUIC协议。
- 流量控制、传输可靠性功能:QUIC在UDP的基础上增加了一层来保证数据传输可靠性,它提供了数据包重传、拥塞控制、以及其他一些TCP中的特性。
- 集成TLS加密功能:目前QUIC使用TLS1.3,减少了握手所花费的RTT数。
- 多路复用:同一物理连接上可以有多个独立的逻辑数据流,实现了数据流的单独传输,解决了TCP的队头阻塞问题。
- 快速握手:由于基于UDP,可以实现使用0 ~ 1个RTT来建立连接。
超文本传输安全协议(Hypertext Transfer Protocol Secure,简称:HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包。HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
采用了混合加密机制、数字签名、数字证书。
其实也就是弥补了HTTP的缺点:
数据隐私性,内容经过加密;(加解密)
数据完整性,内容经过完整性校验;(数字签名)
身份认证,第三方无法伪装客户端/服务器的身份(数字证书)
TLS/SSL全称安全传输层协议(Transport Layer Security), 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议。
TLS/SSL的功能实现主要依赖三类基本算法:散列函数hash、对称加密、非对称加密。作用如下:
基于散列函数验证信息的完整性
对称加密算法采用协商的秘钥对数据加密
非对称加密实现身份认证和秘钥协商
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- HTTPS与HTTP使用不同的连接方式,用的端口也不一样,HTTPS标准端口443,HTTP是80
- https 缓存不如 http 高效,会增加数据开销,要更耗费服务器资源。
- HTTPS在浏览器上会显示绿色的安全锁,而HTTP没有
- 弥补了HTTP的缺点,数据的隐私性、完整性、身份验证。也就是更加安全。
- http页面响应速度比https快,主要是因为http使用TCP 三次握手建立连接,客户端和服务器需要交换3 个包,而https除了TCP 的三个包,还要加上ssl 握手需要的9 个包,所以一共是12 个包。
结合对称加密、非对称加密,将对称加密的密钥使⽤非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
还有第三方颁发证书(CA)、数字签名等。
参考文献:
计网汇总
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)