HTTP相关面试题

一、先澄清几个术语——HTTPS、SSL、TLS

1. “HTTP” 是干嘛用滴?

首先,HTTP 是一个网络协议,超文本传输协议,用来传输Web内容,大部分网站都是通过HTTP协议来传输Web页面,包括web页面上的图片、CSS样式,JS脚本(超文本:文字、图片、视频的混合体)

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

2. “SSL/TLS” 是干嘛用滴?

SSL 是洋文 “Secure Sockets Layer” 的缩写,中文叫做 “安全套接层”。原先互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。

到了 1999 年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是 “Transport Layer Security” 的缩写),中文叫做“传输层安全协议”。

很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段。

3. “HTTPS” 是啥意思?

咱们通常所说的 HTTPS 协议,说白了就是 “HTTP 协议” 和“SSL/TLS 协议”的组合。你可以把 HTTPS 大致理解为——“HTTP over SSL”或“HTTP over TLS”(反正 SSL 和 TLS 差不多)。

二、HTTP协议的特点

1. HTTP和TCP之间的关系

简单来说,TCP协议是HTTP协议的基石——HTTP协议依靠TCP协议来传输数据,在网络分层模型中,TCP被称为传输层协议,HTTP被称为应用层协议

2. HTTP 协议如何使用 TCP 连接

HTTP对TCP连接的使用,分为长连接和短连接两种

在短连接模式下,浏览器会发起一个TCP连接,拿到该网页的HTML源码,拿到源码后,TCP关闭连接,然后,浏览器分析网页源码,得到外部资源,然后针对每一个外部资源,再分别发起一个个TCP连接,把这些文件获取到本地(获取后,TCP同样断开连接)。

在长连接模式下,TCP连接拿到网页的HTML源码,并不会马上断开连接,而是暂时先保持连接,浏览器分析完网页源码后,再用这个TCP连接去访问外部资源。

在HTTP1.0中采用的是短连接的方式 网页变得越来越复杂后,短连接的方式“时间成本”和“CPU成本”偏高,导致效率低下,所以HTTP1.1中,默认采用长连接的方式

3.五大类HTTP状态码

具体含义常见状态码
1XX提示信息,表示目前是协议处理的中间状态还需要后续的操作
2XX成功,报文已经收到并被正确处理200,204,206
3XX重定向,资源位置发生变动,需要客户端重新发送请求301,302,304
4XX客户端错误,请求报文错误,服务器无法处理400,403,404
5XX服务器错误,服务器在处理请求时内部发生了错误500,501,502,503

「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。

「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。301 和 302 都会在响应头里使用字段 Location ,指明后续要跳转的 URL,浏览器会自动重定向新的URL。

「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。

「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。

「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。

「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。

「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。

「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。

4.HTTP常见字段

  • Host字段:客户端发送请求时,用来指定服务器的域名,有了Host字段,就可以将请求发往同一条服务器上的不同网站
  • Content-Length字段:表明本次回应的数据长度
  • Content-Type字段:用于服务器回应时,告诉客户端,本次数据是什么格式
  • Content-Encoding字段:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式
  • 客户端在请求时,用 Accept-Encoding字段说明自己可以接受哪些压缩方法。

5.Get和Post的区别

Get 方法的含义是请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等。

而 POST 方法则是相反操作,用于将数据发送到服务器来创建/更新资源。它向 URI 指定的资源提交数据,数据就放在报文的 body 里。

  • Get和Post方法的安全性和幂等性

    ​ 安全:请求是否破坏服务器上的资源

    ​ 幂等:多次执行相同的操作,每次结果是否相同

  • GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据
    都是安全的,且每次的结果都是相同的。

  • POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据
    就会创建多个资源,所以不是幂等的。

GETPOST
后退按钮/刷新无害数据会被重新提交
书签可收藏为书签不可收藏为书签
缓存能被缓存不能被缓存
编码类型application/x-www-form-urlencodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
历史参数保存在浏览器中参数不会保存在浏览器历史中
对数据长度的限制GET方法向URL中添加数据,最大长度2048个字符无限制
对数据类型的限制只允许ASCII字符没有限制,可允许二进制
安全性发送的数据是URL的一部分参数不会保存在浏览器历史或web服务器日志
可见性数据在URL中,对任何人可见数据不会显示在URL中

6.HTTP的优缺点

优点有哪些

HTTP最突出的优点就是:简单灵活与易于扩展应用广泛和跨平台

  1. 简单
    HTTP 基本的报文格式就是 header + body ,头部信息也是 key-value 简单文本的形式,易于理解,降低了学习和使用的门槛。
  2. 灵活和易于扩展
    HTTP协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。同时 HTTP 由于是工作在应用层( OSI 第七层),则它下层可以随意变化。
  3. 应用广泛和跨平台

缺点有哪些

无状态不安全

  1. 无状态双刃剑

    无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务
    无状态的坏处,既然服务器没有记忆能力,它在完成有关联性的操作时会非常麻烦

解决: 通过在请求和响应报文中写入cookie信息来控制客户端的状态

  1. 不安全

    通信使用明文,内容可能被窃听

    不验证对方的身份,因此可能遭遇伪装

    无法证明报文的完整性,所以可能已遭篡改

三、HTTP和HTTPS

1. 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(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

2. HTTP解决了HTTPS的哪些问题

HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了上述的风险:

信息加密:交互信息无法被窃取(使用混合加密的方式实现信息的机密性,解决了窃听的风险)

校验机制:无法篡改通信内容,篡改了就不能正常显示(使用摘要算法的方式开实现完整性,解决篡改风险)

身份证书:证明淘宝是真的淘宝网(将服务器公钥放入到数字证书中)

  1. 采用「混合加密」的方式的原因:

    • 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
    • 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢
  2. 摘要算法

    客户端在发送明文之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明文」一同加密成密文后,发送给服务器,服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出的「指纹」做比较,若「指纹」相同,说明数据是完整的。

  3. 数字证书

    为什么需要用到数字证书?

    ​ 在客户端向服务器索要公钥,然后公钥加密信息,服务器收到密文后,用自己的私钥解密的过程中,如何保证公钥不被篡改?

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

SSL/TLS 协议基本流程:

  • 客户端向服务器索要并验证服务器的公钥。

  • 双方协商生产「会话秘钥」。

  • 双方采用「会话秘钥」进行加密通信。

SSL/TLS 协议建立的详细流程:

  1. ClientHello
    首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。
    在这一步,客户端主要向服务器发送以下信息:
    (1)客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本。
    (2)客户端生产的随机数( Client Random ),后面用于生产「会话秘钥」。
    (3)客户端支持的密码套件列表,如 RSA 加密算法。

  2. SeverHello
    服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello 。服务器回应的内容有如下内容:
    (1)确认 SSL/ TLS 协议版本,如果浏览器不支持,则关闭加密通信。
    (2)服务器生产的随机数( Server Random ),后面用于生产「会话秘钥」。
    (3)确认的密码套件列表,如 RSA 加密算法。
    (4)服务器的数字证书。

  3. 客户端回应

客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。

如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:
(1)一个随机数( pre-master key )。该随机数会被服务器公钥加密。
(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
(3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数
据做个摘要,用来供服务端校验。
上面第一项的随机数是整个握手阶段的第三个随机数,这样服务器和客户端就同时有三个随机数,接着
就用双方协商的加密算法,各自生成本次通信的「会话秘钥」。

  1. 服务器的最后回应
    服务器收到客户端的第三个随机数( pre-master key )之后,通过协商的加密算法,计算出本次通信的
    「会话秘钥」。然后,向客户端发生最后的信息:
    (1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
    (2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数
    据做个摘要,用来供客户端校验。
    至此,整个 SSL/TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普
    通的 HTTP 协议,只不过用「会话秘钥」加密内容。

四、 HTTP/1.1、HTTP/2、HTTP/3 演变

1. 相比HTTP1.0,HTTP1.1提高了哪些性能?

  • 使用TCP长连接,改善了短连接造成的性能开销
  • 支持管道网络传输,只要第一个请求发出去了,不必等其回来,就可以将第二个请求发送出去,可以减少整体的响应时间

但是,HTTP1.1还是有性能瓶颈

  • 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
  • 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
  • 没有请求优先级控制;
  • 请求只能从客户端开始,服务器只能被动响应。

2. HTTP2的优化

  • 头部压缩:如果同时发出多个请求,请求头相同或者相似,那么协议会消除重复的部分(HPACK算法:在客户端和服务器同时维护一张头信息表,所有的字段存入这张表,生成一个索引号,以后只发送索引号,从而提高速度)

  • 二进制形式:HTTP2中头信息和数据体都是二进制,并且统称为:头信息帧和数据帧

    HTTP1.1明文报文组成:报文首部,空行,报文主体 HTTP2二进制报文组成:头信息帧,数据帧

  • 数据流:HTTP/2 的数据包不是按顺序发送的,每个请求或回应的所有数据包,称为一个数据流(Stream)。每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数

    客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。

  • 多路复用:HTTP2是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率。

  • 服务器推送:在一定程度上改善了「请求-应答」工作模式,服务器可以主动向客户端发送消息

3. HTTP3的优化

HTTP/2 主要的问题在于,多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个HTTP 请求的。所以一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。

HTTP/1.1 中的管道( pipeline)传输中如果有一个请求阻塞了,那么队列后请求也统统被阻塞住了HTTP/2 多个请求复用一个TCP连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。这都是基于 TCP 传输层的问题,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP

在这里插入图片描述

UDP 发生是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的一个丢包全部重传问题。大家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值