👨🏫面试官:要不今天聊聊 HTTP 吧?
👨💻候选者:可以,我的理解是HTTP它是种客户端和服务器通信的格式,那你可能要问呢 那格式是啥?说白了就是双方约定好的一种协议,就好像你租房一样是吧,让我们双方能看的懂而已;这个交互实际上就是请求和饷应。其中包括最重要的是传包括文本在内的各式各样“消息”,另外呢,它也是种无状态的协议。
详细过程看下图
👨🏫面试官:那你说的无状态你是咋理解的?
👨💻候选者:它的意思是服务器它不维护任何有关客户端发过来的请求消息。哈哈这其实是一种懒,对浏览器来说省事多了,并且状态协议会复杂一点,需要你维护状态(历史信息),并且如果客户或服务器失效,会产生状态的不一致,如果要解决这种不一致的代价会更高。
👨🏫 面试官:差不多,问你 HTTP 协议有哪些优点?
👨💻 候选者:扩展性强啊、速度快、跨平台支持性好。
👨🏫 面试官:HTTP 属于哪一层的协议啊?
👨💻候选者:它是应用层协议,用 TCP(传输层)作为底层协议,默认端口为 80
👨🏫 面试官:这些太简单,HTTP 通信过程能简单介绍一下不?
👨💻 候选者:明显八股文哈哈:
1 服务器在 80 端口等待客户的请求
2 浏览器发起到服务器的 TCP 连接,同时在本地创建套接字 Socket
3 服务器接收来自浏览器的 TCP 连接
4 浏览器(HTTP 客户端)与 Web 服务器(HTTP 服务器)交换 HTTP 消息
5 关闭 TCP 连接
👨🏫面试官:还行,那你知道HTTP版本的区别吗?
👨💻候选者:各个之间的区别还是蛮大的,HTTP1.0 默认是短连接,每次和服务器交互,都需要断开又连;那么 HTTP1.1 版本最主要的是[默认持久连接]。只要你客户端服务器没有断开TCP连接,它就一直保持连接,你也可以发多次HTTP请求,非常的nice啊
1.1还有个就是[断点续传],啥意思呢?它是用HTTP消息头用分块的形式传编码,把实体分成块进行传。
👨💻候选者:1.1说完了,咱们摆下HTTP2.0,坑定高级许多,它不再用文本的方式传了,而是采用二进制来传,对头部进行了压缩,能进行流量控制,最主要就是HTTP/2它是支持多路复用,意思是通过单一的TCP连接并行发起多个的请求和响应消息。
👨🏫面试官:嗯,稍微打断你下。我知道HTTP1.1版本来有个管线化理论,但默认是关闭的。管线化这个跟HTTP2的多路复用是很类似的,它们有什么区别呀?
👨💻候选者:HTTP1.1提出的 管线化 只能串行(一个响应必须完全返回后,下个请求才会开始传输);而我说的HTTP2的多路复用是它利用分帧数据流,把HTTP协议分解为互不依赖的帧(给每个帧排好序然后发出去,接回来的时候按序重组),进而可以搞成乱序,注意发送的时候要避免一定的队列阻塞问题哈,也就是不要把先进先出这个顺序搞混了。
👨💻候选者:无论是HTTP1.1还是HTTP2,response饷应的处理顺序总是要跟request请求顺序保持一致的。假如某个请求的reponse饷应慢了,还是同样会有阻塞的问题,这什么原因呢,根本原因是HTTP底层的传输协议是TCP,没办法完全解决线头阻塞的问题哦
总的来说,做了如下总结
HTTP/1.1
-
引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用。
-
分块传输编码,即服务端每产生一块数据,就发送一块,用” 流模式” 取代” 缓存模式”。
-
管道机制,即在同一个 TCP 连接里面,客户端可以同时发送多个请求。
HTTP/2.0
- 二进制协议,1.1 版本的头信息是文本(ASCII 编码),数据体可以是文本或者二进制;2.0 中,头信息和数据体都是二进制。
- 完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。
- 报头压缩,HTTP 协议不带有状态,每次请求都必须附上所有信息。Http/2.0 引入了头信息压缩机制,使用 gzip 或 compress 压缩后再发送。
- 这个我没有说,是服务端推送,允许服务器未经请求,主动向客户端发送资源。
👨🏫面试官:嗯,好的。那你讲下 HTTP3 跟前面版本什么区别
👨💻候选者:最本质的是 HTTP1和2 的底层都是 TCP,而 HTTP3 它的底层是 UDP。使用HTTP3能够减少RTT(往返时延),还有他使用 QUIC 来保证 UDP可靠性。之前的HTTP/2是存在的一些问题,比如重传,请求饷应慢了,上面也说了都是由于 TCP 本身的特性导致的,所以HTTP/3在QUIC的基础上进行发展而来,QUIC(Quick UDP Connections)译为快速UDP网络连接,底层使用UDP进行数据传输,你说强不强?