我试图澄清/理解websocketsover是否HTTP/2也会使用流通过 TCP 连接进行多路复用。RFC8441 的第 5 节似乎暗示了这一点
成功处理打开握手后,对等方应使用 CONNECT 事务中的 HTTP/2 流继续执行 WebSocket 协议 [RFC6455],就像 [RFC6455] 中提到的 TCP 连接一样。此时 WebSocket 连接的状态为 OPEN,如 [RFC6455] 第 4.1 节所定义。
HTTP/2 流关闭也类似于 [RFC6455] 的 TCP 连接关闭。有序的 TCP 级闭包表示为 END_STREAM 标志([RFC7540],第 6.1 节)。RST 异常由 RST_STREAM 帧([RFC7540],第 6.4 节)和 CANCEL 错误代码([RFC7540],第 7 节)表示。
但我的困惑来自于这样一个事实:即使使用 HTTP/1.1,虽然浏览器中的选项卡共享与同一主机的底层 TCP 连接(例如 chrome 建立 6 个 TCP 连接),但在不同选项websocket卡中创建到同一主机的连接会导致不同的 TCP每个选项卡中的连接。
我不确定为什么两者之间存在差异以及是否也可能websockets相同HTTP/2。
有哪位高手可以解释一下。谢谢。
如何强制Faraday适配器tyhoeus使用HTTP/2来向支持HTTP/2的服务器发出请求?我已经通过服务https://http2.pro/doc/api对此进行了测试,结果如下:
body="{\"http2\":1,\"protocol\":\"HTTP\\/2.0\",\"push\":0,\"user_agent\":\"Faraday v0.12.2\"}",
Run Code Online (Sandbox Code Playgroud)
\"http2\":1,这意味着 HTTP/2 不用于请求!
自从过去 5-6 小时尝试将 138kb 提交推送到 Google Cloud 上托管的存储库以来,一直出现此错误。
我已经推送这个仓库很长时间了,但今天才收到这个错误。
error: RPC failed; http2 499 curl 16
fatal: the remote hung up unexpectedly.
fatal: the remote hung up unexpectedly.
Run Code Online (Sandbox Code Playgroud)
我已经尝试过以下方法:
我无法将 ssh 用于 git。它不允许我克隆(权限被拒绝)。
499:客户端关闭请求:我怀疑它超时了。
我使用的是 Mac OS Catalina 10.15.4 Git 版本 2.26.2
Git Push 在出现以下输出后冻结:
Enumerating objects: 61, done.
Counting objects: 100% (61/61), done.
Delta compression using up to 4 threads
Compressing objects: 100% (31/31), done.
Writing objects: 100% (41/41), 138.25 KiB | …Run Code Online (Sandbox Code Playgroud) 据我了解,gRPC的协议是TCP之上的http2。因此,可以分配的最大端口是65535,对吗?但如果我将服务器地址设置为超出范围的“0.0.0.0:70040”,它仍然可以正常工作,并且 gRPC 客户端能够与 gRPC 服务器连接并通信。我可以知道这实际上意味着什么吗?谢谢。
builder.AddListeningPort("0.0.0.0:70040", grpc::InsecureServerCredentials());
Run Code Online (Sandbox Code Playgroud) Akamai在他们的网站上有一个非常有趣的HTTP/2演示:
HTTP/2(HTTP的未来)允许通过单个TCP连接同时下载资源,减少了对spritesheets和连接的需求......据我所知,在有大量请求的网站上应该总是更快(比如在演示中) ).
当我在Chrome或Safari中尝试演示时,确实要快得多,但是当我在FireFox中测试它时,它一直都是SLOWER.同一台计算机,同一连接.
为什么是这样?
所有主流浏览器(包括FireFox )显然支持 HTTP/2 ,所以它应该可以正常工作,但在这个现实世界的演示中,它在80%的时间内都比较慢.(在Chrome和Safari中,它在100%的时间内都会更快.)
在确保我清除了所有缓存之后,我在接下来的星期一再次尝试:
我的操作系统:带有FireFox版本44.0.2的El Capitan版本10.11.3(15D21)
更新(2016年4月)
现在运行Firefox 45.0.1:
还是慢一点!
我已经阅读了很多关于 http2 的文档,启用它似乎是安全的。但我需要 100% 确定我不会有任何回归,或者至少知道会发生什么回归。
什么会阻止我在我的生产 apache 服务器上启用 http2?我必须仔细检查什么配置?哪些新行为可能会给我带来麻烦?
我需要通过 TCP 套接字从我的 Java 类发送 HTTP/2 请求。我已经适配了一段适用于普通 HTTP/1.1 的代码。但是,使用 HTTP/2 时,它不会输出任何响应或错误代码。
你能看出其中有什么问题吗?我试图访问的服务器位于https://localhost:8443
Socket s = new Socket(InetAddress.getByName("localhost"), 8443);
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.print("GET / HTTP/2.0\r\n");
pw.print("Host: localhost:8443\r\n\r\n");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String t;
while((t = br.readLine()) != null) System.out.println(t);
br.close();
Run Code Online (Sandbox Code Playgroud)
谢谢!
上传多个文件时,使用多路复用 http2 功能应该会显着提高性能。
Java 有一个 httpclient,它原生支持 HTTP/2 协议,因此我尝试编写代码以供自己理解。
这项任务似乎并不像我最初想的那样容易,或者在另一方面,我似乎无法找到能够在上传中使用多路复用的服务器(如果存在)。
这是我写的代码,有人有想法吗?
HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build();
String url = "https://your-own-http2-server.com/incoming-files/%s";
Path basePath = Path.of("/path/to/directory/where/is/a/bunch/of/jpgs");
Function<Path, CompletableFuture<HttpResponse<String>>> handleFile = file -> {
String currentUrl = String.format(url, file.getFileName().toString());
try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(currentUrl))
.header("Content-Type", "image/jpeg")
.PUT(HttpRequest.BodyPublishers.ofFile(file))
.build();
return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
};
List<Path> files = Files.list(basePath).collect(toList());
files.parallelStream().map(handleFile).forEach(c -> {
try {
final HttpResponse<String> response = c.get();
System.out.println(response.statusCode());
} catch (Exception e) {
e.printStackTrace(); …Run Code Online (Sandbox Code Playgroud) 我有一个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 …
我按照Wildfly 10.1 新闻中的简单说明在端口 8443 上启用了 HTTP/2 和 TLS 协议,一切顺利。
但是我想在 HTTP 页面中也启用 HTTP/2 协议,像在 HTTP 中一样在两个 HTTPS 中获取这个协议。
有可能的?
以及如何直接在 standalone-full.xml 配置文件中进行此更改?
谢谢你。
(这个问题最初更具解释性,但管理员不喜欢它......他们要求它更加集中,所以让我们尝试只回答问题。)