硬核!30 张图解 HTTP 常见的面试题

在面试过程中,HTTP 被提问的概率还是比较高的 。
小林我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大的,通过问答 + 图解的形式由浅入深的方式帮助大家进一步的学习和理解 HTTP 协议 。
HTTP 基本概念
Get 与 Post
HTTP 特性
HTTPS 与 HTTP
HTTP/1.1、HTTP/2、HTTP/3 演变
提纲
HTTP 基本概念
HTTP 是什么?描述一下
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol 。
能否详细解释「超文本传输协议」?
HTTP的名字「超文本协议传输」,它可以拆成三个部分:
超文本
传输
协议
三个部分
1. 「协议」
在生活中,我们也能随处可见「协议」,例如:
刚毕业时会签一个「三方协议」;
找房子时会签一个「租房协议」;
三方协议和租房协议
生活中的协议,本质上与计算机中的协议是相同的,协议的特点:
「协」字,代表的意思是必须有两个以上的参与者 。例如三方协议里的参与者有三个:你、公司、学校三个;租房协议里的参与者有两个:你和房东 。
「仪」字,代表的意思是对参与者的一种行为约定和规范 。例如三方协议里规定试用期期限、毁约金等;租房协议里规定租期期限、每月租金金额、违约如何处理等 。
针对 HTTP 协议,我们可以这么理解 。
HTTP 是一个用在计算机世界里的协议 。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范 ,浏览器就会执行一次 POST 请求,把你的留言文字放进了报文 body 里,然后拼接好 POST 请求头,通过 TCP 协议发送给服务器 。
POST 请求
GET 和 POST 方法都是安全和幂等的吗?
先说明下安全和幂等的概念:
在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源 。
所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的 。
那么很明显 GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的 。
POST 因为是「新增或提交数据」的操作 , 会修改服务器上的资源,所以是不安全的 , 且多次提交数据就会创建多个资源,所以不是幂等的 。
HTTP 特性
你知道的 HTTP 网络传输成为了可能 。
即可在同一个 TCP 连接里面 , 客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来 , 就可以发第二个请求出去,可以减少整体的响应时间 。
举例来说,客户端需要请求两个资源 。以前的做法是,在同一个TCP连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求 。管道机制则是允许浏览器同时发出 A 请求和 B 请求 。
管道网络传输
但是服务器还是按照顺序 , 先回应 A 请求,完成后再回应 B 请求 。要是 前面的回应特别慢,后面就会有许多请求排队等着 。这称为「队头堵塞」 。
3. 队头阻塞
「请求 – 应答」的模式加剧了 HTTP 的性能问题 。
因为当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会招致客户端一直请求不到数据,这也就是「队头阻塞」 。好比上班的路上塞车 。
队头阻塞
总之 HTTP/1.1 的性能一般般,后续的 HTTP/2 和 HTTP/3 就是在优化 HTTP 的性能 。
HTTP 与 HTTPS
HTTP 与 HTTPS 有哪些区别?
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题 。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输 。
HTTP 连接建立相对简单,TCP 三次握手之后便可进行 HTTP 的报文传输 。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输 。
HTTP 的端口号是 80,HTTPS 的端口号是 443 。
HTTPS 协议需要向 CA 未经压缩就发送,首部信息越多延迟越大 。只能压缩 Body 的部分;
发送冗长的首部 。每次互相发送相同的首部造成的浪费较多;
服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
没有请求优先级控制;
请求只能从客户端开始,服务器只能被动响应 。
那上面的 HTTP/1.1 的性能瓶颈,HTTP/2 做了什么优化?
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的 。
那 HTTP/2 相比 HTTP/1.1 性能上的改进:
1. 头部压缩
HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的分 。
这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了 。
2. 二进制格式
HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式 。
头信息和数据体都是二进制,并且统称为?。╢rame):头信息帧和数据帧 。
报文区别
这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制 , 那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率 。
3. 数据流
HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应 。因此,必须要对数据包做标记,指出它属于哪个回应 。
每个请求或回应的所有数据包,称为一个数据流(Stream) 。
每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数,服务器发出的数据流编号为偶数
客户端还可以指定数据流的优先级 。优先级高的请求,服务器就先响应该请求 。
HTT/1 ~ HTTP/2
4. 多路复用
HTTP/2 是可以在一个连接中并发多个请求或回应 , 而不用按照顺序一一对应 。
移除了 HTTP/1.1 中的串行请求,不需要排队等待 , 也就不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率 。
举例来说,在一个 TCP 连接里,服务器收到了客户端 A 和 B 的两个请求 , 如果发现 A 处理过程非常耗时,于是就回应 A 请求已经处理好的部分,接着回应 B 请求,完成后,再回应 A 请求剩下的部分 。
多路复用
5. 服务器推送
HTTP/2 还在一定程度上改善了传统的「请求 – 应答」工作模式,服务不再是被动地响应,也可以主动向客户端发送消息 。
举例来说,在浏览器刚请求 HTML 的时候 , 就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送(Server Push , 也叫 Cache Push) 。
HTTP/2 有哪些缺陷?HTTP/3 做了哪些优化?
HTTP/2 主要的问题在于:多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的 。
所以一旦发生了丢包现象 , 就会触发 TCP 的重传机制 , 这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来 。
HTTP/1.1 中的管道( pipeline)传输中如果有一个请求阻塞了 , 那么队列后请求也统统被阻塞住了
HTTP/2 多请求复用一个TCP连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求 。
这都是基于 TCP 传输层的问题,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
HTTP/1 ~ HTTP/3
UDP 发生是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的一个丢包全部重传问题 。
大家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输 。
QUIC 有自己的一套机制可以保证传输的可靠性的 。当某个流发生丢包时 , 只会阻塞这个流,其他流不会受到影响 。
TL3 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack 。
HTTPS 要建立一个连接,要花费 6 次交互,先是建立三次握手,然后是 TLS/1.3 的三次握手 。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数 。
TCP HTTPS(TLS/1.3) 和 QUIC HTTPS
所以,QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议 。
QUIC 是新协议 , 对于很多网络设备,根本不知道什么是 QUIC , 只会当做 UDP,这样会出现新的问题 。所以 HTTP/3 现在普及的进度非常的缓慢,不知道未来 UDP 是否能够逆袭 TCP 。
唠叨
接近 30 张图片 , 都是从一条线两条线画出来,灰常的费劲,深切感受到画图也是个体力活?。?
爱偷懒的我其实不爱画图,但为了让大家能更好的理解 , 在跟自己无数次斗争后,踏上了耗时耗体力的画图的不归路,希望对你们有帮助!
创造不易啊,画图也不易,各位「三连」走起就是对小林创造的最大支持和动力了,我们下次见!
参考文献:
[1] 上野 宣.图解HTTP.人民邮电出版社.
[2] 罗剑锋.透视HTTP协议.极客时间.
[3] 陈皓.HTTP的前世今.酷壳CoolShell.
https://coolshell.cn/articles/19840.html
[4] 阮一峰.HTTP 协议入门.阮一峰的网络日志.
http://www.ruanyifeng.com/blog/2016/08/http.html
金三银四招聘季 , 你还有哪些面试干货文章呢?分享或者查看干货文章可戳:
https://blog.csdn.net/blogdevteam/article/details/104691837
【硬核!30 张图解 HTTP 常见的面试题】以上就是朝夕生活(www.30zx.com)关于“硬核!30 张图解 HTTP 常见的面试题”的详细内容,希望对大家有所帮助!

猜你喜欢