HTTP常见面试题总结

HTTP常见面试题

HTTP基本概念

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

HTTP常见状态码

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。

2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

  • 200 OK 」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
  • 204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
  • 206 Partial Content 」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向

  • 301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
  • 302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

  • 304 Not Modified不具有跳转 的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

  • 400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
  • 403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
  • 404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

  • 500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
  • 501 Not Implemented」表示客户端请求的功能还不支持,类似"即将开业,敬请期待"的意思。
  • 502 Bad Gateway 」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。即中间服务器(网关 / 代理)本身没挂 ,但它去请求真正提供内容的后端服务器时失败 / 超时 / 没得到正常响应,于是把这个错误抛给了你。
  • 503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似"网络服务正忙,请稍后重试"的意思。

HTTP解决粘包问题

HTTP协议通过设置回车符,换行符作为HTTP Header的边界,通过Content-Length字段作为HTTP body的边界,这两个方式都是为了解决粘包问题

GET 和 POST 有什么区别?

  • GET 的语义是从服务器获取指定的资源 ,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)。
  • POST 的语义是根据请求负荷(报文body)对指定的资源做出处理 ,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制

GET 和 POST 方法都是安全和幂等的吗?

  1. 在HTTP协议里,安全指的是请求方法不会破坏服务器上的资源
  2. 幂等指的是多次执行相同的操作,结果都是相同的
  • GET就是安全且幂等的,原因:只读操作
  • POST因为是新增或提交数据 操作,会修改服务器上的资源,所以是不安全 的,多次提交数据就会创建多个资源,所以不是幂等的。

注意, 上面是从 RFC 规范定义的语义来分析的。

但是实际过程中,开发者不一定会按照 RFC 规范定义的语义来实现 GET 和 POST 方法。比如:

  • 可以用 GET 方法实现新增或删除数据的请求,这样实现的 GET 方法自然就不是安全和幂等。
  • 可以用 POST 方法实现查询数据的请求,这样实现的 POST 方法自然就是安全和幂等。

如果「安全」放入概念是指信息是否会被泄漏的话,虽然 POST 用 body 传输数据,而 GET 用 URL 传输,这样数据会在浏览器地址拦容易看到,但是并不能说 GET 不如 POST 安全的。因为 HTTP 传输的内容都是明文的 ,虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了。所以,要避免传输过程中数据被窃取,就要使用 HTTPS 协议,这样所有 HTTP 的数据都会被加密传输

RFC 规范并没有规定 GET 请求不能带 body 的。理论上,任何请求都可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的.

HTTP 缓存技术

强制缓存

只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,浏览器决定是否使用缓存。

利用两个HTTP响应头部字段实现,用来表示资源在客户端缓存的有效期:

  • Cache-Control : 相对时间
  • Expires : 绝对时间

​ 如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires 。Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强缓存。具体的实现流程如下:

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小;
  • 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
  • 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。

协商缓存

协商缓存(Negotiated Caching)是 HTTP 协议中一种条件式缓存机制,用于在客户端(如浏览器)已缓存某个资源的前提下,不直接使用本地副本,而是先与服务器确认该副本是否仍然有效。若服务器判定缓存仍新鲜(未修改),则返回 304 Not Modified 响应,避免重复传输完整资源;否则返回 200 OK 及新资源内容。

协商缓存可以基于两种头部来实现:

第一种:请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified 字段实现

  1. 首次请求(无缓存)

​ 你向服务器请求一个资源(比如一张图片、一个 CSS 文件);服务器返回资源(HTTP 200),同时在响应头里加上 Last-Modified: [资源最后修改时间](比如 Last-Modified: Thu, 19 Feb 2026 08:00:00 GMT),告诉浏览器这个资源的最后修改时间;浏览器收到后,会把资源和这个 Last-Modified 时间一起缓存起来。

  1. 再次请求(验证缓存)

当你再次请求同一个资源时,浏览器发现本地有缓存且缓存可能过期,就会在请求头里带上 If-Modified-Since: [之前缓存的 Last-Modified 时间];服务器收到请求后,做两件事:取出这个资源当前的最后修改时间 (服务器端的 Last-Modified);对比请求头里的If-Modified-Since和服务器端的Last-Modified

  • 如果服务器端时间 > If-Modified-Since:资源已更新,返回最新资源(HTTP 200),并更新响应头的 Last-Modified
  • 如果服务器端时间 ≤ If-Modified-Since:资源没更新,只返回 HTTP 304 状态码(无响应体),浏览器直接用本地缓存。

第二种:请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段:

  • 响应头部中 Etag唯一标识响应资源;
  • 请求头部中的 If-None-Match:当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。
  • 唯一标识可以更加准确的判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题

Q : 为什么ETag的优先级更高?
A : 因为ETag主要解决Last-Modified几个比较难以解决的问题:

  1. 最后修改时间可能会改变,导致客户端认为文件被改动了,从而重新发起请求
  2. 有些文件是在秒级以内修改的,而If-Modified-Since 能检查到的粒度是秒级的,使用 Etag就能够保证这种需求下客户端在 1 秒内能刷新多次;
  3. 有些服务器不能精确获取文件的最后修改时间

强制缓存和协商缓存的工作流程

协商缓存可以独立使用,但在同时配置强制缓存时,只有当强制缓存失效后,浏览器才会发起协商缓存请求。

当使用 ETag 字段实现的协商缓存的过程:

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 ETag 唯一标识,这个唯一标识的值是根据当前请求的资源生成的;

  • 当浏览器再次请求访问服务器中的该资源时,首先会先检查强制缓存是否过期:

    • 如果没有过期,则直接使用本地缓存;
    • 如果缓存过期了,会在 Request 头部加上 If-None-Match 字段,该字段的值就是 ETag 唯一标识;
  • 服务器再次收到请求后,

    会根据请求中的 If-None-Match 值与当前请求的资源生成的唯一标识进行比较:

    • 如果值相等,则返回 304 Not Modified,不会返回资源
    • 如果不相等,则返回 200 状态码和返回资源,并在 Response 头部加上新的 ETag 唯一标识;
  • 如果浏览器收到 304 的请求响应状态码,则会从本地缓存中加载资源,否则更新资源。

HTTP特性

HTTP/1.1的优点

1. 简单

HTTP 基本的报文格式就是 header + body,头部信息也是 key-value 简单文本的形式,易于理解,降低了学习和使用的门槛。

2. 灵活和易于扩展

HTTP 协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充

同时 HTTP 由于是工作在应用层( OSI 第七层),则它下层可以随意变化,比如:

  • HTTPS 就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层;
  • HTTP/1.1 和 HTTP/2.0 传输协议使用的是 TCP 协议,而到了 HTTP/3.0 传输协议改用了 UDP 协议。

3. 应用广泛和跨平台

互联网发展至今,HTTP 的应用范围非常的广泛,从台式机的浏览器到手机上的各种 APP,从看新闻、刷贴吧到购物、理财、吃鸡,HTTP 的应用遍地开花,同时天然具有跨平台的优越性。

HTTP/1.1的缺点

1. 无状态双刃剑

无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。

无状态的坏处 ,既然服务器没有记忆能力,它在完成有关联性的操作时会非常麻烦。比较简单的方式用Cookie技术,通过在请求和响应报文中写入Cookie信息来控制客户端的状态,相当于,在客户端第一次请求后,服务器会下发一个装有客户信息的「小贴纸」,后续客户端请求服务器的时候,带上「小贴纸」,服务器就能认得了,

2. 明文传输双刃剑

明文意味着在传输过程中的信息,是可方便阅读的,比如 Wireshark 抓包都可以直接肉眼查看,为我们调试工作带了极大的便利性。

但是这正是这样,HTTP 的所有信息都暴露在了光天化日下,相当于信息裸奔。在传输的漫长的过程中,信息的内容都毫无隐私可言,很容易就能被窃取

3. 不安全

  • 通信明文不加密
  • 不验证通信方的信息
  • 无法证明报文的完整性

HTTP/1.1的性能

  1. 长连接

    目的:减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载

    作用:只要任意一端没有明确提出断开连接,则保持TCP连接状态

  2. 管道网络传输

    可以在同一个TCP连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求,可以减少整体的响应时间

但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应。如果服务端在处理 A 请求时耗时比较长,那么后续的请求的处理都会被阻塞住,这称为「队头堵塞」。

所以,HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞

TIP:

实际上 HTTP/1.1 管道化技术不是默认开启,而且浏览器基本都没有支持,所以后面所有文章讨论 HTTP/1.1 都是建立在没有使用管道化的前提。大家知道有这个功能,但是没有被使用就行了。

  1. 对头阻塞

    当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会招致客户端一直请求不到数据,这也就是队头阻塞

HTTP和HTTPS有哪些区别

  • HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
  • HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
  • 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

HTTPS解决了HTTP的哪些问题

  1. 窃听风险

    方法 :信息加密,使用混合加密方式实现信息的机密性,解决了窃听的风险

  2. 篡改风险

    方法 :校验机制,摘要算法的方式实现完整性,为数据生成独一无二的"指纹"

  3. 冒充风险

    方法:身份证书,将服务器公钥放入到数字证书中,解决冒充风险

详细介绍

  1. 混合加密

    HTTPS 的混合加密过程可以概括为:当浏览器访问网站时,服务器先通过数字证书把自己的公钥发送给浏览器,浏览器验证证书合法后,生成一个随机的对称加密密钥,然后用服务器的公钥将这个对称密钥加密并发送给服务器;服务器用自己的私钥解密得到同一个对称密钥,从此双方就使用这个对称密钥进行后续的数据加密通信。也就是说,HTTPS 先用非对称加密安全地交换"对称密钥",再用对称加密高效地传输数据,这种"安全传钥匙 + 高效传数据"的组合方式就是混合加密。

HTTPS 采用的是对称加密非对称加密结合的混合加密方式:

  • 在通信建立前采用非对称加密的方式交换会话秘钥,后续就不再使用非对称加密。
  • 在通信过程中全部使用对称加密的会话秘钥的方式加密明文数据。

采用混合加密的方式的原因

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

    在计算机里会用摘要算法(哈希函数)来计算出内容的哈希值,也就是内容的"指纹",这个哈希值是唯一的,且无法通过哈希值推导出内容。通过哈希算法可以确保内容不会被篡改,但是并不能保证内容 + 哈希值不会被中间人替换,因为这里缺少对客户端收到的消息是否来源于服务端的证明

    解决方案:使用非对称加密算法

    • 一个是公钥,这个是可以公开给所有人的;
    • 一个是私钥,这个必须由本人管理,不可泄露。

    这两个密钥可以双向加解密的,比如可以用公钥加密内容,然后用私钥解密,也可以用私钥加密内容,公钥解密内容。

    流程的不同,意味着目的也不相同:

    • 公钥加密,私钥解密 。这个目的是为了保证内容传输的安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;
    • 私钥加密,公钥解密 。这个目的是为了保证消息不会被冒充,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。

    一般我们不会用非对称加密来加密实际的传输内容,因为非对称加密的计算比较耗费性能的。

    所以非对称加密的用途主要在于通过私钥加密,公钥解密的方式,来确认消息的身份 ,我们常说的数字签名算法 ,就是用的是这种方式,不过私钥加密内容不是内容本身,而是对内容的哈希值加密

  2. 数字证书

HTTP是如何建立连接的

注意,本人学习时发现现在已经有TLS1.3了,而下面的内容还是基于1.2,两者有许多不同,大家可以通过AI对比学习,或者@本人整一篇

SSL/TLS 协议基本流程:

  • 客户端向服务器索要并验证服务器的公钥。
  • 双方协商生产「会话秘钥」。
  • 双方采用「会话秘钥」进行加密通信。

TLS 的握手阶段涉及四次 通信,使用不同的密钥交换算法,TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA 算法 (opens new window)ECDHE 算法 (opens new window)

基于 RSA 算法的 TLS 握手过程比较容易理解,所以这里先用这个给大家展示 TLS 握手过程:

1. ClientHello

首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。

在这一步,客户端主要向服务器发送以下信息:

(1)客户端支持的 TLS 协议版本,如 TLS 1.2 版本。

(2)客户端生产的随机数(Client Random),后面用于生成「会话秘钥」条件之一

(3)客户端支持的密码套件列表,如 RSA 加密算法。

2. SeverHello

服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。服务器回应的内容有如下内容:

(1)确认 TLS 协议版本,如果浏览器不支持,则关闭加密通信。(在此之前服务端如果没能找到和客户端匹配的版本,直接就握手失败)

(2)服务器生产的随机数(Server Random),也是后面用于生产「会话秘钥」条件之一。

(3)确认的密码套件列表,如 RSA 加密算法。

(4)服务器的数字证书。

3.客户端回应

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

如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:

(1)一个随机数(pre-master key)。该随机数会被服务器公钥加密。

(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。

(3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供服务端校验。

上面第一项的随机数是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。

服务器和客户端有了这三个随机数(Client Random、Server Random、pre-master key),接着就用双方协商的加密算法,各自生成本次通信的「会话秘钥」

4. 服务器的最后回应

服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。

然后,向客户端发送最后的信息:

(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。

至此,整个 TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用会话秘钥加密内容。

RSA算法的缺陷

使用 RSA 密钥协商算法的最大问题是不支持前向保密

因为客户端传递随机数(用于生成对称加密密钥的条件之一)给服务端时使用的是公钥加密的,服务端收到后,会用私钥解密得到随机数。所以一旦服务端的私钥泄漏了,过去被第三方截获的所有 TLS 通讯密文都会被破解。

HTTPS的应用数据是如何保证完整性的

TLS 在实现上分为握手协议记录协议两层:

  • TLS 握手协议就是我们前面说的 TLS 四次握手的过程,负责协商加密算法和生成对称密钥,后续用此密钥来保护应用程序数据(即 HTTP 数据);
  • TLS 记录协议负责保护应用程序数据并验证其完整性和来源 ,所以++对 HTTP 数据加密是使用记录协议++;

TLS 记录协议主要负责消息(HTTP 数据)的压缩,加密及数据的认证:

  • 首先,消息被分割成多个较短的片段,然后分别对每个片段进行压缩。
  • 接下来,经过压缩的片段会被加上消息认证码(MAC 值,这个是通过哈希算法生成的),这是为了保证完整性,并进行数据的认证。通过附加消息认证码的 MAC 值,可以识别出篡改。与此同时,为了防止重放攻击,在计算消息认证码时,还加上了片段的编码。
  • 再接下来,经过压缩的片段再加上消息认证码会一起通过对称加密算法进行整体加密。
  • 最后,上述经过加密的数据再加上由数据类型、版本号、压缩后的长度组成的报头就是最终的报文数据。

HTTPS一定安全可靠吗

场景:客户端通过浏览器向服务端发起 HTTPS 请求时,被「假基站」转发到了一个「中间人服务器」,于是客户端是和「中间人服务器」完成了 TLS 握手,然后这个「中间人服务器」再与真正的服务端完成 TLS 握手。

从客户端的角度看,其实并不知道网络中存在中间人服务器这个角色。那么中间人就可以解开浏览器发起的 HTTPS 请求里的数据,也可以解开服务端响应给浏览器的 HTTPS 响应数据。相当于,中间人能够 "偷看" 浏览器与服务端之间的 HTTPS 请求和响应的数据。

但是要发生这种场景是有前提的,前提是用户点击接受了中间人服务器的证书。中间人服务器与客户端在 TLS 握手过程中,实际上发送了自己伪造的证书给浏览器,而这个伪造的证书是能被浏览器(客户端)识别出是非法的,于是就会提醒用户该证书存在问题。

HTTPS 协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是 HTTPS 不够安全

HTTP/1.1 HTTP/2 HTTP/3演变

HTTP/1.1 相比 HTTP/1.0 提高了什么性能?

HTTP/1.1 相比 HTTP/1.0 性能上的改进:

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

但 HTTP/1.1 还是有性能瓶颈

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

HTTP2相对HTTP/1.1有什么优化?

  1. 头部压缩

    HTTP/2 会压缩头 (Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。(HPACK算法:客户端和服务器同时维护一张头信息表,所有字段都存入这个表,生成一个索引号,以后就不发送同样字段,只发送索引号)

  2. 二进制格式

    头信息和数据体都是++二进制++ ,并且统称为帧(frame):头信息帧 (Headers Frame)和数据帧(Data Frame)。收到报文后就不需要将明文转成二进制,而是直接解析二进制报文,增加了数据传输的效率。

  3. 并发传输

    引入Stream概念,多个Stream复用在一条TCP连接上

    从上图可以看到,1 个 TCP 连接包含多个 Stream,Stream 里可以包含 1 个或多个 Message,Message 对应 HTTP/1 中的请求或响应,由 HTTP 头部和包体构成。Message 里包含一条或者多个 Frame,Frame 是 HTTP/2 最小单位,以二进制压缩格式存放 HTTP/1 中的内容(头部和包体)。

    针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应

    比如下图,服务端并行交错地发送了两个响应: Stream 1 和 Stream 3,这两个 Stream 都是跑在一个 TCP 连接上,客户端收到后,会根据相同的 Stream ID 有序组装成 HTTP 消息。

  4. 服务器推送

    服务端可以主动向客户端发送消息

    客户端和服务器都可以建立Stream,客户端建立的Stream必须是奇数,而服务器建立的Stream必须是偶数,比如:Stream 1 是客户端向服务端请求的资源,属于客户端建立的 Stream,所以该 Stream 的 ID 是奇数(数字 1);Stream 2 和 4 都是服务端主动向客户端推送的资源,属于服务端建立的 Stream,所以这两个 Stream 的 ID 是偶数(数字 2 和 4)。

HTTP/2有什么缺陷

HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当前 1 个字节数据没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。是在TCP层面发生的

HTTP/3做了哪些优化

HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP

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

QUIC特点:无对头阻塞,更快的连接建立,连接迁移(详细介绍)

QUIC 是新协议,对于很多网络设备,根本不知道什么是 QUIC,只会当做 UDP,这样会出现新的问题,因为有的网络设备是会丢掉 UDP 包的,而 QUIC 是基于 UDP 实现的,那么如果网络设备无法识别这个是 QUIC 包,那么就会当作 UDP包,然后被丢弃。

相关推荐
tod1134 小时前
Reactor反应堆模式
网络·网络协议·tcp/ip·reactor·多路转接·tcpdump
Codefengfeng11 小时前
分辨压缩包的真加密与伪加密
linux·运维·网络
白太岁11 小时前
通信:(3) 高并发网络通信:epoll + 边沿触发 + 非阻塞 IO + tcp
c语言·网络·c++·网络协议·tcp/ip
duration~13 小时前
DHCP 协议详解
网络·网络协议·tcp/ip
代码改善世界16 小时前
【C语言】线性表之顺序表、单链表、双向链表详解及实现
c语言·网络·链表
猫头虎18 小时前
web开发常见问题解决方案大全:502/503 Bad Gateway/Connection reset/504 timed out/400 Bad Request/401 Unauthorized
运维·前端·nginx·http·https·gateway·openresty
嵌入式×边缘AI:打怪升级日志18 小时前
9.2.1 分析 Write File Record 功能(保姆级讲解)
java·开发语言·网络
天荒地老笑话么19 小时前
Bridged 与虚拟机扫描:合规边界与自测范围说明
网络·网络安全
TechubNews19 小时前
燦谷(Cango Inc)入局AI 資本重組彰顯決心
大数据·网络·人工智能·区块链