使用HTTP/2协议时如何传递Keep-alive元数据?

Mau*_*ice 0 tomcat keep-alive spring-boot http2

我有一个Web 应用程序,它使用 Spring boot 并在后端angular嵌入服务器。tomcat我想让已建立的 http 连接保持更长时间,以提高后续 http 请求的响应时间。浏览器被告知通过添加类似的内容来http/1.1保持http连接处于活动状态。但是, HTTP/2 中禁止连接特定的标头字段,例如 Connection 和 Keep-Alive 。因此,Chrome 和 Firefox 在 HTTP/2 响应中忽略它们。对于 HTTP/2,应通过其他方式传送特定于连接的元数据。Connection: Keep-AliveKeep-Alive: timeout=5, max=1000response header

我在任何地方都找不到那些“其他手段”应该是什么。我也无法在任何地方找到如何配置嵌入式 Tomcat 9 服务器以将Keep-alive元数据添加到HTTP/2响应中。这就是 tomcat 现在的配置方式:

@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
    return (tomcat) -> tomcat.addConnectorCustomizers((connector) -> {
        if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol) {
            AbstractHttp11Protocol<?> protocolHandler = (AbstractHttp11Protocol<?>) connector
                    .getProtocolHandler();
            protocolHandler.setDisableUploadTimeout(false);
            protocolHandler.setConnectionUploadTimeout(5000);
            protocolHandler.setKeepAliveTimeout(4000);
            protocolHandler.setMaxKeepAliveRequests(200);
            protocolHandler.setUseKeepAliveResponseHeader(true);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

但如果我想使用,这些设置将不起作用HTTP/2。有任何想法吗?

Bar*_*ard 6

\n

对于 http/1.1,浏览器被告知通过在响应标头中添加 Connection: Keep-Alive 和 Keep-Alive: timeout=5, max=1000 等内容来保持 http 连接处于活动状态。

\n
\n

那\xe2\x80\x99实际上不是真的。自 HTTP/1.1 起,Connection: Keep-Alive除非明确设置为 ,否则标头默认为这种情况Close。事实上,我们甚至拥有 HTTP/1.0 时代遗留下来的标头,不应该需要设置\xe2\x80\x99t。响应始终更多地说明服务器将执行的操作,而不是向客户端发出指令(\xe2\x80\x9chey,仅供参考,我\xe2\x80\x99m 将使用这些设置\xe2\x80\x9d),但是它也总是毫无意义,因为服务器(和客户端)也可以根据需要断开连接。一般来说,如果一台服务器的 TCP 连接耗尽,它不应该真正保留未使用的旧连接,而不是接受新连接。

\n
\n

然而,HTTP/2 中禁止连接特定的标头字段,例如 Connection 和 Keep-Alive。因此,Chrome 和 Firefox 在 HTTP/2 响应中忽略它们。对于 HTTP/2,应通过其他方式传送特定于连接的元数据。

\n

我在任何地方都找不到那些“其他手段”应该是什么。我也无法在任何地方找到如何配置嵌入式 Tomcat 9 服务器以将 Keep-alive 元数据添加到 HTTP/2 响应。这就是 tomcat 现在的配置方式:

\n
\n

与之前一样,HTTP/2 只是去掉了毫无意义的标头,并假设您希望保持它的活性。它在 HTTP/2 中也没有什么意义,因为它\xe2\x80\x99 用于多个请求和响应,而 HTTP/1.1 一次仅用于一个,并且 keep-alive 是一种连接级别设置。那么,如果 HTTP/2 请求可以指定 a,keep-alive: close这对于该连接上已经进行中的其他请求意味着什么?类似地,将其设置为HTTP/2\xe2\x80\x99s 多路复用keep-alive的本质所暗示的。

\n

\xe2\x80\x99 由客户端和服务器根据自己的逻辑和资源限制来决定何时最好断开连接,尽管HTTP/2 规范稍后会继续说明这一点

\n
\n

HTTP/2 连接是持久的。为了获得最佳性能,预计客户端不会关闭连接,直到确定不需要与服务器进行进一步通信(例如,当用户离开特定网页时)或直到服务器关闭连接。

\n
\n