本篇文章包含16个HTTP相关面试题,覆盖HTTP、HTTPS、HTTP/2和HTTP/3相关知识点,题目源于小林、牛客网和我的朋友,解答为我结合书本、文章理解后撰写,用于复习和面试,基本上覆盖了前端校招百分之八九十的HTTP问题。
如果发现文章存在歧义的地方,请各位指出!!
花了一天时间消化相关知识才得出的解答。如果觉得文章不错,记得点赞、收藏!!
请求消息由请求行(方法、URL、版本),请求头部,空行和请求体组成
响应消息由状态行(版本、状态码、状态码描述),响应头部,空行和响应体组成
HTTP 请求方法 - HTTP | MDN (mozilla.org)
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
Get
:请求从服务器获取资源,这个资源可以是静态的⽂本、⻚⾯、图⽚视频等。(安全、幂等)
POST
:向 URI 指定的资源提交数据,数据就放在报⽂的 body ⾥。(不安全、不幂等)
HEAD
:请求一个与GET请求的响应相同的响应,但没有响应体,只有资源的头部信息。(安全、幂等)
PUT
:使用请求中的负载创建或者替换目标资源,对资源进行整体覆盖。(不安全、幂等)
DELETE
:用于删除指定的资源。(不安全、幂等)
OPTIONS
: 用于获取目的资源所支持的通信选项。(安全、幂等)
CONNECT
:用于开启一个客户端与所请求资源之间的双向沟通的通道。(不安全、不幂等)
TRACE
:沿着到目标资源的路径执行一个消息环回测试。(安全、幂等)
PATCH
:对资源进行部分修改。(不安全、不幂等)
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】服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。
【Host】:客户端发送请求时,⽤来指定服务器的域名。
【User-Agent】: 首部可以用来识别发送请求的浏览器
【Accept】:可以接受哪些数据格式,Accept: */*
声明⾃⼰可以接受任何格式的数据
【Accept-Encoding】:说明客户端可以接受哪些压缩编码形式
【Accept-Language】: 首部用来提示用户期望获得的自然语言的优先顺序。
【Content-Type】:在请求中 (如POST
或 PUT
),客户端告诉服务器实际发送的数据类型。
【Content-Length】: 发送给接收方的消息主体的大小
【Connection】: 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持 久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
【Content-Length】:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据⻓度
【Content-Type】:告诉客户端实际返回的内容的内容类型。
【Content-Encoding】:表示服务器返回的数据使⽤了什么压缩编码形式
【Connection】: 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持 久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
如果说一个 HTTP 方法是安全
的,是指这是个不会修改服务器的数据的方法。这是一个对服务器只读操作的方法。所有安全的方法都是幂等的
一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。
HTTP 最凸出的优点是简单、灵活和易于扩展、应用广泛和跨平台。简单指的是HTTP的报文格式都是请求行(状态行)、Header和body,Header字段也是Key-value的简单文本形式,易于理解,降低了学习和使用的门槛。灵活指的用户可以自定义头部字段等。易扩展是因为HTTP是应用层传输协议,其下层是可以变化的,比如HTTPS 就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层,HTTP/3 甚⾄把 TCP 层换成了基于 UDP 的QUIC。应用广泛和跨平台指的是,我们现在用的手机APP、电脑网页都有HTTP的应用。
无状态、明文传输、不安全。HTTP是无状态的,就是说每次的请求都是独立的,如果要完成一些关联性操作就很麻烦,比如登录->添加购物车->下单->结算->支付,这些操作都得知道用户的身份才可以,这样每操作⼀次,都要验证信息,很麻烦。但是它这样减轻了服务器的负担,服务器不需要额外的资源来记录信息。明⽂意味着在传输过程中的信息,是可⽅便阅读的,这样就很容易被窃取。不安全指的是,通信的明文不加密,内容会被窃取。不验证通信方的身份,有可能遭遇伪装,比如访问假的淘宝。无法验证报文的完整性,可能被篡改了。HTTP 的安全问题,可以⽤ HTTPS 的⽅式解决,也就是通过引⼊ SSL/TLS 层,使得在安全上达到了极致。
长连接。早期HTTP/1.0每次发起一个请求都需要新建一次TCP连接(三次握手),而且是串行请求,做了无谓的TCP连接建立和断开,增加了通信开销,性能有很大的问题。HTTP/1.1提出长连接的通信方式,也就是持久连接,HTTP/1.1的请求默认使用一个持久连接,只要客户端和服务器没有明确提出断开连接,就保持TCP连接状态,减少额外的开销。
管道机制。在同⼀个 TCP 连接⾥⾯,客户端可以发起多个请求,只要第⼀个请求发出去了,不必等其回来,就可以发第⼆个请求出去,可以减少整体的响应时间。但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。要是前⾯的回应特别慢,后⾯就会有许多请求排队等着。这称为队头堵塞。
性能瓶颈:
(1)只压缩body部分,请求响应头部未压缩就发送,头部信息越多延迟越大。且每次相互发送相同的首部造成的浪费较多。
(2)服务器是按请求顺序响应的,如果服务器响应慢,就会招致客户端一直请求不到数据,也就是队头阻塞。
(3)请求只能从客户端开始,服务器只能被动响应。
(1)HTTP 是超⽂本传输协议,信息是明⽂传输,存在安全⻛险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP ⽹络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
(2) HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之 后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。
(3) HTTP 的端⼝号是 80,HTTPS 的端⼝号是 443。
(4)HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
首先HTTP存在窃听风险(可以获取通信内容)、篡改风险(篡改内容)和冒充风险(冒充淘宝网站)。而HTTPS 在 HTTP 与 TCP 层之间加⼊了 SSL/TLS 协议,使用混合加密的方式对信息加密,实现信息的机密性,解决了窃听的风险。使用摘要算法确保数据的完整性,保证通信内容无法被篡改,如果被修改了就不能正常显示。将服务器的公钥加入到数字证书中,解决了冒充的风险。
在通信建立前使用非对称加密的方式交换会话秘钥,后续就不再使用非对称加密了。在通信过程中使用对称加密的会话秘钥的方式加密明文数据。
SSL/TLS 的「握⼿阶段」涉及四次通信,
(1)客户端向服务器发起加密通信请求(ClientHello请求),发送的信息有客户端支持的SSL/TLS协议版本、产生的随机数、支持的密码套件列表(比如RSA算法)。
(2)服务器收到客户端请求后,向客户端发出响应(ServerHello),发送的信息有确认的SSL/TLS协议版本、服务器产生的随机数、确认密码套件列表、服务器的数字证书。
(3)客户端收到服务器的回应后,通过浏览器或者操作系统中的CA公钥。确认服务器的数字证书的正确性,如果证书没有问题,客户端就会从数字证书中取出服务器的公钥,然后使用它来加密报文。然后向服务器发送消息,包含一个用服务器公钥加密的随机数、加密通信算法改变通知、客户端握⼿结束通知。
(4)服务器用自己的私钥获取客户端发送过来的随机数,之后使用前面三个随机数生成会话密钥,用来加密之后的通信内容。然后向客户端发送加密通信算法改变通知、服务器握手结束通知。
(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文件等静态资源主动发送给客户端,减少延时的等待。
(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 次,减少了交互次数
本篇文章可能会在我面试后时加以补充,记得收藏!!