HTTP面试题

352 阅读14分钟

1.HTTP有哪些⽅法?

HTTP1.0定义了三种请求⽅法: GET, POST 和 HEAD⽅法
HTTP1.1新增了五种请求⽅法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT

2.这些⽅法的具体作⽤是什么?

GET: 通常⽤于请求服务器发送某些资源
HEAD: 请求资源的头部信息, 并且这些头部与 HTTP GET ⽅法请求时返回的⼀致. 该请求⽅法的⼀个使⽤场景是在
下载⼀个⼤⽂件前先获取其⼤⼩再决定是否要下载, 以此可以节约带宽资源
OPTIONS: ⽤于获取⽬的资源所⽀持的通信选项
POST: 发送数据给服务器
PUT: ⽤于新增资源或者使⽤请求中的有效负载替换⽬标资源的表现形式
DELETE: ⽤于删除指定的资源
PATCH: ⽤于对资源进⾏部分修改
CONNECT: HTTP/1.1协议中预留给能够将连接改为管道⽅式的代理服务器
TRACE: 回显服务器收到的请求,主要⽤于测试或诊断

3.GET和POST有什么区别?

  • 数据传输⽅式不同:GET请求通过URL传输数据,⽽POST的数据通过请求体传输。
  • 安全性不同:POST的数据因为在请求主体内,所以有⼀定的安全性保证,⽽GET的数据在URL中,通过历史记录,缓存很容易查到数据信息。
  • 数据类型不同:GET只允许 ASCII 字符,⽽POST⽆限制
  • GET⽆害: 刷新、后退等浏览器操作GET请求是⽆害的,POST可能重复提交表单
  • 特性不同:GET是安全(这⾥的安全是指只读特性,就是使⽤这个⽅法不会引起服务器状态变化)且幂等(幂等的概念是指同⼀个请求⽅法执⾏多次和仅执⾏⼀次的效果完全相同),⽽POST是⾮安全⾮幂等 

4.PUT和POST都是给服务器发送新增资源,有什么区别?

PUT 和POST⽅法的区别是,PUT⽅法是幂等的:连续调⽤⼀次或者多次的效果相同(⽆副作⽤),⽽POST⽅法是⾮幂等的。
除此之外还有⼀个区别,通常情况下,PUT的URI指向是具体单⼀资源,⽽POST可以指向资源集合。
举个例⼦,我们在开发⼀个博客系统,当我们要创建⼀篇⽂章的时候往往⽤ POST https://www.jianshu.com/articles ,
这个请求的语义是,在articles的资源集合下创建⼀篇新的⽂章,如果我们多次提交这个请求会创建多个⽂章,这是⾮幂等的。
⽽ PUT https://www.jianshu.com/articles/820357430 的语义是更新对应⽂章下的资源(⽐如修改作者名称等),这个URI指向的就是单⼀资源,⽽且是幂等的,⽐如你把『刘德华』修改成『蔡徐坤』,提交多少次都是修改成『蔡徐坤』

5.http的请求报⽂是什么样的?

请求报⽂有4部分组成: 请求⾏,请求头部 ,空⾏,请求体

  • 请求⾏包括:请求⽅法字段、URL字段、HTTP协议版本字段。它们⽤空格分隔。例如,GET /index.htmlHTTP/1.1。
  • 请求头部:请求头部由关键字/值对组成,每⾏⼀对,关键字和值⽤英⽂冒号“:”分隔
  • User-Agent:产⽣请求的浏览器类型。
  • Accept:客户端可识别的内容类型列表。
  • Host:请求的主机名,允许多个域名同处⼀个IP地址,即虚拟主机。
  • 请求体: post put等请求携带的数据

6.同样是重定向307,303,302的区别? 

302是http1.0的协议状态码,在http1.1版本的时候为了细化302状态码⼜出来了两个303和307。
303明确表示客户端应当采⽤get⽅法获取资源,他会把POST请求变为GET请求进⾏重定向。 307会遵照浏览器标准,
不会从post变为get。 

7.HTTP的keep-alive是⼲什么的? 

在早期的HTTP/1.0中,每次http请求都要创建⼀个连接,⽽创建连接的过程需要消耗资源和时间,为了减少资源消耗,缩短响应时间,就需要重⽤连接。在后来的HTTP/1.0中以及HTTP/1.1中,引⼊了重⽤连接的机制,就是在http请求头中加⼊Connection: keep-alive来告诉对⽅这个请求响应完成后不要关闭,下⼀次咱们还⽤这个请求继续交流。协议规定
HTTP/1.0如果想要保持⻓连接,需要在请求头中加上Connection: keep-alive。
keep-alive的优点:
  • 较少的CPU和内存的使⽤(由于同时打开的连接的减少了)
  • 允许请求和应答的HTTP管线化
  • 降低拥塞控制 (TCP连接减少了)
  • 减少了后续请求的延迟(⽆需再进⾏握⼿)
  • 报告错误⽆需关闭TCP连 

8.为什么有了HTTP为什么还要HTTPS?

https是安全版的http,因为http协议的数据都是明⽂进⾏传输的,所以对于⼀些敏感信息的传输就很不安全,HTTPS就是为了解决HTTP的不安全⽽⽣的。 

9.HTTPS是如何保证安全的?

过程⽐较复杂,我们得先理解两个概念
对称加密:即通信的双⽅都使⽤同⼀个秘钥进⾏加解密,⽐如特务接头的暗号,就属于对称加密
对称加密虽然很简单性能也好,但是⽆法解决⾸次把秘钥发给对⽅的问题,很容易被⿊客拦截秘钥。
⾮对称加密:
1. 私钥 + 公钥= 密钥对
2. 即⽤私钥加密的数据,只有对应的公钥才能解密,⽤公钥加密的数据,只有对应的私钥才能解密
3. 因为通信双⽅的⼿⾥都有⼀套⾃⼰的密钥对,通信之前双⽅会先把⾃⼰的公钥都先发给对⽅
4. 然后对⽅再拿着这个公钥来加密数据响应给对⽅,等到到了对⽅那⾥,对⽅再⽤⾃⼰的私钥进⾏解密
⾮对称加密虽然安全性更⾼,但是带来的问题就是速度很慢,影响性能。
解决⽅案:
那么结合两种加密⽅式,将对称加密的密钥使⽤⾮对称加密的公钥进⾏加密,然后发送出去,接收⽅使⽤私钥进⾏解密得到对称加密的密钥,然后双⽅可以使⽤对称加密来进⾏沟通。
此时⼜带来⼀个问题,中间⼈问题:
如果此时在客户端和服务器之间存在⼀个中间⼈,这个中间⼈只需要把原本双⽅通信互发的公钥,换成⾃⼰的公钥,这样中间⼈就可以轻松解密通信双⽅所发送的所有数据。
所以这个时候需要⼀个安全的第三⽅颁发证书(CA),证明身份的身份,防⽌被中间⼈攻击。
证书中包括:签发者、证书⽤途、使⽤者公钥、使⽤者私钥、使⽤者的HASH算法、证书到期时间等
但是问题来了,如果中间⼈篡改了证书,那么身份证明是不是就⽆效了?这个证明就⽩买了,这个时候需要⼀个新的技
术,数字签名。数字签名就是⽤CA⾃带的HASH算法对证书的内容进⾏HASH得到⼀个摘要,再⽤CA的私钥加密,最终组成数字签名。
当别⼈把他的证书发过来的时候,我再⽤同样的Hash算法,再次⽣成消息摘要,然后⽤CA的公钥对数字签名解密,得到CA创建的消息摘要,两者⼀⽐,就知道中间有没有被⼈篡改了。
这个时候就能最⼤程度保证通信的安全了。

10.HTTP2相对于HTTP1.x有什么优势和特点? 

⼆进制分帧
帧:HTTP/2 数据通信的最⼩单位消息:指 HTTP/2 中逻辑上的 HTTP 消息。例如请求和响应等,消息由⼀个或多个帧组成。
流:存在于连接中的⼀个虚拟通道。流可以承载双向消息,每个流都有⼀个唯⼀的整数ID
HTTP/2 采⽤⼆进制格式传输数据,⽽⾮ HTTP 1.x 的⽂本格式,⼆进制协议解析起来更⾼效。
头部压缩
HTTP/1.x会在请求和响应中中重复地携带不常改变的、冗⻓的头部数据,给⽹络带来额外的负担。
  • HTTP/2在客户端和服务器端使⽤“⾸部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送
  • ⾸部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
  • 每个新的⾸部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。 

11.服务器推送 

服务端可以在发送⻚⾯HTML时主动推送其它资源,⽽不⽤等到浏览器解析到相应位置,发起请求再响应。例如服务端
可以主动把JS和CSS⽂件推送给客户端,⽽不需要客户端解析HTML时再发送这些请求。
服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发
送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三⽅资源给客户端。

12.多路复⽤ 

HTTP 1.x 中,如果想并发多个请求,必须使⽤多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的
TCP链接请求限制。
HTTP2中:
  • 同域名下所有通信都在单个连接上完成。
  • 单个连接可以承载任意数量的双向数据流。
  • 数据流以消息的形式发送,⽽消息⼜由⼀个或多个帧组成,多个帧之间可以乱序发送,因为根据帧⾸部的流标识可以重新组装 

13.HTTP的缓存的过程是怎样的?

通常情况下的步骤是:
1. 客户端向服务器发出请求,请求资源
2. 服务器返回资源,并通过响应头决定缓存策略
3. 客户端根据响应头的策略决定是否缓存资源(这⾥假设是),并将响应头与资源缓存下来
4. 在客户端再次请求且命中资源的时候,此时客户端去检查上次缓存的缓存策略,根据策略的不同、是否过期等判断是直接读取本地缓存还是与服务器协商缓存 



一些常见的状态码为:

200     //服务器成功返回网页 
404     //请求的网页不存在 
503     //服务器不可用

1xx(临时响应)

表示临时响应并需要请求者继续执行操作的状态码

100 //继续  请求者应当继续提出请求
101 //切换协议  请求者已要求服务器切换协议,服务器已确认并准备切换。

2xx(成功)

表示成功处理了请求的状态码。

200     //成功  服务器已经成功处理了请求。通常,这表示服务器提供了请求的网页。
201     //已创建  请求成功并且服务器创建了新的资源
202     //已接受  服务器已接受请求,但尚未处理
203     //非授权信息  服务器已经成功处理了请求,但返回的信息可能来自另一来源
204     //无内容  服务器成功处理了请求,但没有返回任何内容
205     //重置内容  服务器成功处理了请求,但没有返回任何内容
206     //部分内容  服务器成功处理了部分GET请求 

3xx(重定向)

表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。

300     //多种选择  针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择。
301     //永久移动  请求的网页已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。
302     //临时移动  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
303     //查看其它位置  请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码
304     //未修改  自动上次请求后,请求的网页未修改过。服务器返回此响应,不会返回网页的内容
305     //使用代理  请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
307     //临时性重定向  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有的位置来进行以后的请求

4xx(请求错误)

这些状态码表示请求可能出错,妨碍了服务器的处理。

400     //错误请求  服务器不理解请求的语法
401     //未授权  请求要求身份验证。对于需要登录的网页,服务器可能返回此响应
403     //禁止  服务器拒绝请求
404     //未找到  服务器找不到请求的网页
405     //方法禁用  禁用请求中指定的方法
406     //不接受  无法使用请求的内容特性响应请求的网页
407     //需要代理授权  此状态码与401(未授权)类似,但指定请求者应当授权使用代理
408     //请求超时  服务器等候请求时发生超时
409     //冲突  服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
410     //已删除  如果请求的资源已永久删除,服务器就会返回此响应
411     //需要有效长度  服务器不接受不含有效内容长度标头字段的请求
412     //未满足前提条件  服务器未满足请求者在请求者设置的其中一个前提条件
413     //请求实体过大  服务器无法处理请求,因为请求实体过大,超出了服务器的处理能力
414     //请求的URI过长  请求的URI(通常为网址)过长,服务器无法处理
415     //不支持媒体类型  请求的格式不受请求页面的支持
416     //请求范围不符合要求  如果页面无法提供请求的范围,则服务器会返回此状态码
417     //未满足期望值  服务器未满足“期望”请求标头字段的要求 

5xx(服务器错误)

这些状态码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

500     //服务器内部错误  服务器遇到错误,无法完成请求
501     //尚未实施  服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码
502     //错误网关  服务器作为网关或代理,从上游服务器无法收到无效响应
503     //服务器不可用  服务器目前无法使用(由于超载或者停机维护)。通常,这只是暂时状态
504     //网关超时  服务器作为网关代理,但是没有及时从上游服务器收到请求
505     //HTTP版本不受支持  服务器不支持请求中所用的HTTP协议版本