面试前,这十六个HTTP相关面试题你总得会吧?

前言

本篇文章包含16个HTTP相关面试题,覆盖HTTP、HTTPS、HTTP/2和HTTP/3相关知识点,题目源于小林、牛客网和我的朋友,解答为我结合书本、文章理解后撰写,用于复习和面试,基本上覆盖了前端校招百分之八九十的HTTP问题。

如果发现文章存在歧义的地方,请各位指出!!

花了一天时间消化相关知识才得出的解答。如果觉得文章不错,记得点赞、收藏!!


正文

1. HTTP请求消息和响应消息的组成部分?

请求消息由请求行(方法、URL、版本),请求头部,空行和请求体组成

响应消息由状态行(版本、状态码、状态码描述),响应头部,空行和响应体组成

2. HTTP有哪九种请求方法?具体作用是什么呢?

HTTP 请求方法 - HTTP | MDN (mozilla.org)

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

Get:请求从服务器获取资源,这个资源可以是静态的⽂本、⻚⾯、图⽚视频等。(安全、幂等)

POST :向 URI 指定的资源提交数据,数据就放在报⽂的 body ⾥。(不安全、不幂等)

扫描二维码关注公众号,回复: 13772541 查看本文章

HEAD:请求一个与GET请求的响应相同的响应,但没有响应体,只有资源的头部信息。(安全、幂等)

PUT:使用请求中的负载创建或者替换目标资源,对资源进行整体覆盖。(不安全、幂等)

DELETE:用于删除指定的资源。(不安全、幂等)

OPTIONS : 用于获取目的资源所支持的通信选项。(安全、幂等)

CONNECT:用于开启一个客户端与所请求资源之间的双向沟通的通道。(不安全、不幂等)

TRACE:沿着到目标资源的路径执行一个消息环回测试。(安全、幂等)

PATCH:对资源进行部分修改。(不安全、不幂等)

3. 什么是HTTP?

HTTP是超文本传输协议,可以解释为是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

4. HTTP有哪些常见状态码(响应代码)呢?

HTTP 响应代码 - HTTP | MDN (mozilla.org)

(1)1xx类状态码属于提示信息,是协议处理中的⼀种中间状态,实际⽤到的⽐较少。

(2)2xx是成功响应,表示服务器成功处理了客户端的请求

​ 【 200 OK】 请求成功。

​ 【 201 Created】 该请求已成功,并因此创建了一个新的资源。

​ 【 204 No Content】 服务器成功处理了请求,但不返回任何实体内容,即响应头没有body数据

​ 【 206 Partial Content】服务器已经成功处理了部分 GET 请求,应用于HTTP断点续传或者将一个大文档分 解为多个下载段同时下载,即响应返回的body数据并不是资源的全部。

(3)3xx是重定向,表示客户端请求的资源发送了变动,需要客户端⽤新的 URL 重新发送请求获取资源

​ 【301 Moved Permanentl】被请求的资源已永久移动到新位置(新的URL),响应头里包含的Location字段 表示新的URL,浏览器会自动重定向到新的URL。

​ 【302 Found】表示临时重定向,请求的资源现在临时从不同的 URI 响应请求,客户端应当继续向原有地址 发送以后的请求。

​ 【304 Not Modified】表示资源未修改,如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文 档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。

(4)4xx是客户端错误

​ 【400 Bad Request】 语义有误,当前请求无法被服务器理解,可能是请求参数有误。

​ 【401 Unauthorized】当前请求需要用户验证。

​ 【403 Forbidden】服务器已经理解请求,但是拒绝执行它,即服务器禁止访问资源。

​ 【404 Not Found】请求失败,请求的资源在服务器上找不到或不存在,无法提供给客户端

​ 【408 Request Timeout】请求超时,客户端没有在服务器预备等待的时间内完成一个请求的发送。

(5)5xx是服务器错误

​ 【500 Internal Server Error】是一个笼统通用的错误码,服务器遇到意外的情况并阻止其执行请求。

​ 【501 Not Implemented】请求的方法不被服务器支持,因此无法被处理。服务器必须支持的方法(即不会 返回这个状态码的方法)只有 GET 和 HEAD。

​ 【502 Bad Gateway】表示作为网关或代理角色的服务器,从上游服务器(如tomcat、php-fpm)中接收到 的响应是无效的。

​ 【503 Service Unavailable】服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。

5. HTTP常见的请求头部字段?

​ 【Host】:客户端发送请求时,⽤来指定服务器的域名。

​ 【User-Agent】: 首部可以用来识别发送请求的浏览器

​ 【Accept】:可以接受哪些数据格式,Accept: */*声明⾃⼰可以接受任何格式的数据

​ 【Accept-Encoding】:说明客户端可以接受哪些压缩编码形式

​ 【Accept-Language】: 首部用来提示用户期望获得的自然语言的优先顺序。

​ 【Content-Type】:在请求中 (如POSTPUT),客户端告诉服务器实际发送的数据类型。

​ 【Content-Length】: 发送给接收方的消息主体的大小

​ 【Connection】: 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持 久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

6. HTTP常见的响应头部字段?

​ 【Content-Length】:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据⻓度

​ 【Content-Type】:告诉客户端实际返回的内容的内容类型。

​ 【Content-Encoding】:表示服务器返回的数据使⽤了什么压缩编码形式

​ 【Connection】: 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持 久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

7. 什么是安全的?什么是幂等的?

​ 如果说一个 HTTP 方法是安全的,是指这是个不会修改服务器的数据的方法。这是一个对服务器只读操作的方法。所有安全的方法都是幂等的

一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。

8. HTTP( 1.1 ) 有哪些优点,怎么体现的?

HTTP 最凸出的优点是简单、灵活和易于扩展、应用广泛和跨平台。简单指的是HTTP的报文格式都是请求行(状态行)、Header和body,Header字段也是Key-value的简单文本形式,易于理解,降低了学习和使用的门槛。灵活指的用户可以自定义头部字段等。易扩展是因为HTTP是应用层传输协议,其下层是可以变化的,比如HTTPS 就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层,HTTP/3 甚⾄把 TCP 层换成了基于 UDP 的QUIC。应用广泛和跨平台指的是,我们现在用的手机APP、电脑网页都有HTTP的应用。

9. HTTP(1.1)的缺点呢?

无状态、明文传输、不安全。HTTP是无状态的,就是说每次的请求都是独立的,如果要完成一些关联性操作就很麻烦,比如登录->添加购物车->下单->结算->支付,这些操作都得知道用户的身份才可以,这样每操作⼀次,都要验证信息,很麻烦。但是它这样减轻了服务器的负担,服务器不需要额外的资源来记录信息。明⽂意味着在传输过程中的信息,是可⽅便阅读的,这样就很容易被窃取。不安全指的是,通信的明文不加密,内容会被窃取。不验证通信方的身份,有可能遭遇伪装,比如访问假的淘宝。无法验证报文的完整性,可能被篡改了。HTTP 的安全问题,可以⽤ HTTPS 的⽅式解决,也就是通过引⼊ SSL/TLS 层,使得在安全上达到了极致。

11. HTTP/1.1 的性能如何?

长连接。早期HTTP/1.0每次发起一个请求都需要新建一次TCP连接(三次握手),而且是串行请求,做了无谓的TCP连接建立和断开,增加了通信开销,性能有很大的问题。HTTP/1.1提出长连接的通信方式,也就是持久连接,HTTP/1.1的请求默认使用一个持久连接,只要客户端和服务器没有明确提出断开连接,就保持TCP连接状态,减少额外的开销。

管道机制。在同⼀个 TCP 连接⾥⾯,客户端可以发起多个请求,只要第⼀个请求发出去了,不必等其回来,就可以发第⼆个请求出去,可以减少整体的响应时间。但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。要是前⾯的回应特别慢,后⾯就会有许多请求排队等着。这称为队头堵塞。

性能瓶颈:

(1)只压缩body部分,请求响应头部未压缩就发送,头部信息越多延迟越大。且每次相互发送相同的首部造成的浪费较多。

(2)服务器是按请求顺序响应的,如果服务器响应慢,就会招致客户端一直请求不到数据,也就是队头阻塞。

(3)请求只能从客户端开始,服务器只能被动响应。

12. HTTP和HTTPS的区别?

(1)HTTP 是超⽂本传输协议,信息是明⽂传输,存在安全⻛险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP ⽹络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。

(2) HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之 后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输

(3) HTTP 的端⼝号是 80,HTTPS 的端⼝号是 443。

(4)HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

13. HTTPS 解决了 HTTP 的哪些问题?怎么解决的?

首先HTTP存在窃听风险(可以获取通信内容)、篡改风险(篡改内容)和冒充风险(冒充淘宝网站)。而HTTPS 在 HTTP 与 TCP 层之间加⼊了 SSL/TLS 协议,使用混合加密的方式对信息加密,实现信息的机密性,解决了窃听的风险。使用摘要算法确保数据的完整性,保证通信内容无法被篡改,如果被修改了就不能正常显示。将服务器的公钥加入到数字证书中,解决了冒充的风险。

在通信建立前使用非对称加密的方式交换会话秘钥,后续就不再使用非对称加密了。在通信过程中使用对称加密的会话秘钥的方式加密明文数据。

14. HTTPS 是如何建立连接的?其间交互了什么?

SSL/TLS 的「握⼿阶段」涉及四次通信,

(1)客户端向服务器发起加密通信请求(ClientHello请求),发送的信息有客户端支持的SSL/TLS协议版本、产生的随机数、支持的密码套件列表(比如RSA算法)。

(2)服务器收到客户端请求后,向客户端发出响应(ServerHello),发送的信息有确认的SSL/TLS协议版本、服务器产生的随机数、确认密码套件列表、服务器的数字证书

(3)客户端收到服务器的回应后,通过浏览器或者操作系统中的CA公钥。确认服务器的数字证书的正确性,如果证书没有问题,客户端就会从数字证书中取出服务器的公钥,然后使用它来加密报文。然后向服务器发送消息,包含一个用服务器公钥加密的随机数、加密通信算法改变通知、客户端握⼿结束通知。

(4)服务器用自己的私钥获取客户端发送过来的随机数,之后使用前面三个随机数生成会话密钥,用来加密之后的通信内容。然后向客户端发送加密通信算法改变通知、服务器握手结束通知。

15. HTTP1.1和HTTP2.0的区别?

(1)HTTP/2协议是基于HTTPS的,所以HTTP/2的安全性是有保障的。

(2)HTTP/1.1使用文本格式传输数据,但是HTTP/2协议采用二进制传输数据,头信息和数据体都是⼆进制,并且统称为帧(frame):头信息帧和数据帧。收到报⽂后,⽆需再将明⽂的报⽂转成⼆进制,⽽是直接解析⼆进制报⽂,这提高了数据传输的效率。

(3)HTTP/1.1每次请求都会携带大量的头部信息,浪费资源。而HTTP/2使用HPACK算法对消息头进行压缩,通信过程中只传输索引号,提高速度、节省流量

(4)HTTP/2采用数据流的形式收发数据,一个完整的请求或响应数据包称为一个数据流stream,其可以分成非连续多次发送。在数据包发送时,必须标记所属的数据流编号,用来区分是哪个数据流,规定客户端发出的数据流编号为奇数,服务器发出的数据流编号为偶数。客户端还可以指定数据流的优先级,优先级高的请求,服务器就先响应该请求。

(5)HTTP1.1虽然通过管道机制也能发起多个请求,但服务器得按顺序处理客户端的请求,容易出现队头阻塞。而HTTP/2实现了多路复用,在一个连接中并非多个请求或回应,而不用按照顺序一一对应,降低了延迟,大幅度提高了连接的利用率。服务器同时(或先后)收到了A、B两个请求,先回应A请求,但由于处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。

(6)HTTP1.1请求只能从客户端开始,服务器只能被动响应。而HTTP/2支持服务器推送,即可以主动向客户端发送消息,比如在浏览器刚请求HTML的时候,就提前把可能用到的JS、CSS文件等静态资源主动发送给客户端,减少延时的等待。

16. HTTP/2 有哪些缺陷?HTTP/3 做了哪些优化?

(1)HTTP/2如果出现丢包现象,就会触发TCP的重传机制,这样就会阻塞所有的HTTP请求。而HTTP/3把HTTP下层的TCP协议换成了UDP协议。虽然 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。当某个流发⽣丢包时,只会阻塞这个流,其他流不会受到影响

(2)TLS3 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack 。

(3)HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿,然后是 TLS/1.3 的三次握⼿。QUIC 直接把 以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数


本篇文章可能会在我面试后时加以补充,记得收藏!!

猜你喜欢

转载自blog.csdn.net/qq_45890970/article/details/123882882