Java核心面试宝典】Day19、你猜HTTP协议会有什么面试题?

网友投稿 711 2022-05-29

Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!

用坚持缔造技术、用指尖敲动未来!

和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者”。也想靠技术来改未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣!

在此专栏《Java核心面试宝典》记录我们备战梦想的【day 19】!

HTTP和HTTPS大家都知道吧?那你知道他们的连接方式、区别、加密方式等等吗?那今天这篇我就带大家来总结一下这其中会有哪些常见的面试题呢?

一、HTTP和HTTPS的工作方式【建立连接的过程】

【Java核心面试宝典】Day19、你猜HTTP协议会有什么面试题?

HTTP(超文本传输协议) 是一种简单的请求-响应协议。被用于在web浏览器和网站服务器之间传递消息,HTTP使用TCP协议作为它的支撑运输层协议,其默认工作在TCP协议的80端口,HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器和服务器进程就可以通过套接字接口访问TCP,客户机从套接字接口发送HTTP请求报文和接收HTTP响应报文,类似的,服务器也是从套接字接口接收HTTP请求报文和发送HTTP响应报文。其通信内容以明文的形式发送,不通过任何形式的数据加密,当通信结束时,客户机和服务器关闭连接。

HTTPS是以安全为目的的HTTP协议,在HTTP协议的基础上,通过传输加密和身份认证的方式保证了数据传输的安全性,其具体的工作流程是这样的:

客户端发起一个HTTPS请求,并连接到服务器的443端口,发送的信息主要包括自身所支持的算法列表和密匙长度。

服务器端将自身所支持的所有加密算法与客户端的算法列表进行对比并选择一种支持的加密算法,然后将它和其他密匙组件一起发送给客户端。

服务器向客户端发送一个包含数字证书的报文,该数字证书中包含证书的颁发机构、过期时间、服务端的公钥等信息。

最后服务端发送一个完成报文通知客户端 SSL 的第一阶段已经协商完成。

SSL第一次协商完成后,客户端发送一个回应报文,报文中包含一个客户端生成的随机密码串,称为pre_master_secre,并且该报文是经过证书中的公钥加密过的。

紧接着客户端会发送一个报文提示服务端在此之后的报文是采用pre_master_secre 加密的。

客户端向服务端发送一个finish 报文,这次握手中包含第一次握手至今所有报文的整体校验值,最终协商是否完成取决于服务端能否成功解密。

服务端同样发送与第 ⑥ 步中相同作用的报文,已让客户端进行确认,最后发送 finish 报文告诉客户端自己能够正确解密报文。

当服务端和客户端的 finish 报文交换完成之后,SSL 连接就算建立完成了,之后就进行和 HTTP 相同的通信过程,唯一不同的是在 HTTPS 通信过程中并不是采用明文传输,而是采用对称加密的方式,其中对称密钥已经在 SSL 的建立过程中协商好了。

二、说一说HTTPS和HTTP的区别?

HTTP采用明文的形式发送数据,数据不安全;

HTTPS采用对称加密算法对传输的报文进行加密,保证了数据的安全性。

HTTP和HTTPS使用不同的连接方式,所使用端口也是不一样的,HTTP使用的端口是80端口,HTTPS使用的端口是443。

HTTPS需要向数字认证机构申请证书,一般是需要一定费用的、

HTTP比HTTPS响应速度快,原因是HTTP采用3次握手建立连接,客户端和服务器需要握手3次,而HTTPS除了需要3次握手之外,还需要经历SSL的协商过程。

三、HTTPS的加密方式是怎样的?

HTTPS采用对称和非对称相结合的方式,首先使用SSL/TLS协议进行加密传输,

为了弥补非对称加密的不足,HTTPS采用证书来进一步加强非对称加密的安全性。通过非对称加密,客户端和服务器协商好进行通信传输的对称密匙,后续的所有信息通过该对称密匙进行加密解密,完成整个HTTPS的流程。

所以简单来说就是: HTTPS首先通过非对称加密算法将用于通信加密的对称加密密匙传输给对方,然后接下来的通信就使用对称加密了。

四、客户端为什么信任第三方证书?

假设中间人篡改了证书原文,由于他没有 CA 机构的私钥,所以无法得到此时加密后的签名,因此无法篡改签名。客户端浏览器收到该证书后会发现原文和签名解密后的值不一致,则说明证书被中间人篡改,证书不可信,从而终止向服务器传输信息。上述过程说明证书无法被篡改,

我们考虑更严重的情况,例如中间人拿到了 CA 机构认证的证书,它想窃取网站 A 发送给客户端的信息,于是它成为中间人拦截到了 A 传给客户端的证书,然后将其替换为自己的证书。此时客户端浏览器收到的是被中间人掉包后的证书,但由于证书里包含了客户端请求的网站信息,因此客户端浏览器只需要把证书里的域名与自己请求的域名比对一下就知道证书有没有被掉包了。

五、HTTP/1.1和HTTP/1.0的区别?

主要区别如下:

缓存处理: 在 HTTP/1.0 中主要使用 header 里的 if-modified-Since, Expries 来做缓存判断的标准。而 HTTP/1.1 请求头中添加了更多与缓存相关的字段,从而支持更为灵活的缓存策略,例如 Entity-tag, If-Unmodified-Since, If-Match, If-None-Match 等可供选择的缓存头来控制缓存策略。

节约带宽: 当客户端请求某个资源时,HTTP/1.0 默认将该资源相关的整个对象传送给请求方,但很多时候可能客户端并不需要对象的所有信息。而在 HTTP/1.1 的请求头中引入了 range 头域,它允许只请求部分资源,其使得开发者可以多线程请求某一资源,从而充分的利用带宽资源,实现高效并发。

错误通知的管理: HTTP/1.1 在 1.0 的基础上新增了 24 个错误状态响应码,例如 414 表示客户端请求中所包含的 URL 地址太长,以至于服务器无法处理;410 表示所请求的资源已经被永久删除。

Host 请求头: 早期 HTTP/1.0 中认为每台服务器都绑定一个唯一的 IP 地址并提供单一的服务,请求消息中的 URL 并没有传递主机名。而随着虚拟主机的出现,一台物理服务器上可以存在多个虚拟主机,并且它们共享同一个 IP 地址。为了支持虚拟主机,HTTP/1.1 中添加了 host 请求头,请求消息和响应消息中应声明这个字段,若请求消息中缺少该字段时服务端会响应一个 404 错误状态码。

长连接: HTTP/1.0 默认浏览器和服务器之间保持短暂连接,浏览器的每次请求都需要与服务器建立一个 TCP 连接,服务器完成后立即断开 TCP 连接。HTTP/1.1 默认使用的是持久连接,其支持在同一个 TCP 请求中传送多个 HTTP 请求和响应。此之前的 HTTP 版本的默认连接都是使用非持久连接,如果想要在旧版本的 HTTP 协议上维持持久连接,则需要指定 Connection 的首部字段的值为 Keep-Alive。

六、HTTP/1.X 和 HTTP/2.0 的区别知道吗?

相比于 HTTP/1.X 的文本(字符串)传送, HTTP/2.0 采用二进制传送。客户端和服务器传输数据时把数据分成帧,帧组成了数据流,流具有流 ID 标识和优先级,通过优先级以及流依赖能够一定程度上解决关键请求被阻塞的问题。

HTTP/2.0 支持多路复用。因为流 ID 的存在, 通过同一个 HTTP 请求可以实现多个 HTTP 请求传输,客户端和服务器可以通过流 ID 来标识究竟是哪个流从而定位到是哪个 HTTP 请求。

HTTP/2.0 头部压缩。HTTP/2.0 通过 gzip 和 compress 压缩头部然后再发送,同时通信双方会维护一张头信息表,所有字段都记录在这张表中,在每次 HTTP 传输时只需要传头字段在表中的索引即可,大大减小了重传次数和数据量。

HTTP/2.0 支持服务器推送。 服务器在客户端未经请求许可的情况下,可预先向客户端推送需要的内容,客户端在退出服务时可通过发送复位相关的请求来取消服务端的推送。

七、HTTP/3了解吗?

HTTP/3之所以会出现,是因为HTTP/2存在一定的弊端,

我们知道,传统 Web 平台的数据传输都基于 TCP 协议,而 TCP 协议在创建连接之前不可避免的需要三次握手,如果需要提高数据交互的安全性,即增加传输层安全协议(TLS),还会增加更多的握手次数。 HTTP 从 1.0 到 2.0,其传输层都是基于 TCP 协议的。即使是带来巨大性能提升的 HTTP/2,也无法完全解决 TCP 协议存在的固有问题(慢启动,拥塞窗口尺寸的设置等)。此外,HTTP/2 多路复用只是减少了连接数,其队头的拥塞问题并没有完全解决,倘若 TCP 丢包率过大,则 HTTP/2 的表现将不如 HTTP/1.1。

HTTP/3则是在QUIC(快速UDP网络连接)的基础上建立起来的,

QUIC的特点是: 低延迟连接、能够避免HTTP/2的对头阻塞问题、传输的报文是经过加密和认证的、具有向前纠错机制,

HTTP/3的底层使用UDP进行数据传输,上层仍然使用HTTP/2。在 UDP 与 HTTP/2 之间存在一个 QUIC 层,其中 TLS 加密过程在该层进行处理。HTTP/3 主要有以下几个特点:

使用 UDP 作为传输层进行通信;

在 UDP 之上的 QUIC 协议保证了 HTTP/3 的安全性。QUIC在建立连接的过程中就完成了 TLS 加密握手;

建立连接快,正常只需要 1 RTT即可建立连接。如果有缓存之前的会话信息,则直接验证和建立连接,此过程 0 RTT。建立连接时,也可以带有少量业务数据;

不和具体底层连接绑定,QUIC 为每个连接的两端分别分配了一个唯一 ID,上层连接只认这对逻辑ID。网络切换或者断连时,只需要继续发送数据包即可完成连接的建立;

使用 QPACK 进行头部压缩,因为 在 HTTP/2 中的HPACK 要求传输过程有序,这会导致队头阻塞,而 QPACK 不存在这个问题。

最后用这个图来表示HTTP的三次发展变化:

今日总结

今天的题目主要是关于HTTP协议的,理论性比较强,但是需要记忆的东西还是比较多的,包括HTTP和HTTPS的工作方式、区别、HTTPS的加密方式等。

如果小伙伴们有遇到其他相关的面试题,欢迎在评论区留言提出,我会把大家提出的总结到文章内, 欢迎小伙伴们一起评论区打卡学习!小伙伴们可也在左方加我好友一起探讨学习!

我是灰小猿,我们下期见!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【华为人】—寻宝记
下一篇:搞 Java 的年薪 40W 是什么水平?
相关文章