问题标签 [http2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
17433 浏览

google-chrome - 使用 Chrome 或 Safari 强制 HTTP/2

有没有办法告诉 Chrome 或 Safari 在特定的 URL/地址/服务器上使用 HTTP/2?

我的意思是通过更改某些设置等,而不是通过在服务器套接字上实现 ALPN 或任何可能需要的东西。我想在服务器套接字上尝试 HTTP/2,而不是等到我可以进行 ALPN 协商来告诉浏览器使用 HTTP/2。


澄清:我在 Chrome 上启用了 HTTP/2(通过 chrome://flags 又名 SPDY/4)。它仍然没有通过升级探测我的(TLS 或纯文本)套接字的 HTTP/2。我想强制 Chrome 要么这样做,要么立即假设 HTTP/2。

另外,我读到 Chrome 不支持通过纯文本连接的 HTTP/2,即使 HTTP/2 标准允许它。但也许有一些方法可以解决这个问题。

0 投票
1 回答
5951 浏览

http - http2/http1.1 代理如何处理传输编码?

HTTP/2 禁止特定于连接的标头字段。不得出现以下标头字段:“Connection”、“Keep-Alive”、“Proxy-Connection”、“Transfer-Encoding”和“Upgrade”。此外,“TE”标头字段不得包含“trailers”以外的任何值。

我想问的是,既然HTTP/2禁止了Transfer-Encoding标头,那么HTTP/2代理如何处理标头Transfer-Encoding: chunked呢?

代理是否应该始终将整个分块请求缓存在内存中并添加 Content-Length 标头,发送到 HTTP/2 服务器/客户端?

0 投票
1 回答
1302 浏览

http2 - 是否可以在没有标头压缩(HPack)的情况下执行 HTTP2?

是否可以在 HTTP2 中以某种方式从服务器端禁用标头压缩?对于客户端到服务器和服务器到客户端的通信。例如,通过将压缩表大小设置为零,还是什么?也许只使用静态表?

(这将大大简化实现,这将更符合 HTTP1 背后的思想,即简单性。HTTP2 的其他(巨大)好处将保留。换句话说,HPack 是强制性的吗?)

编辑,为了清楚起见重新措辞......

是否有可能从服务器使其不使用压缩?这是为了避免实现 HTTP2 的复杂部分。我有点怀疑这是不可能的(因为它本质上会使 HTTP2 变慢)。但也许客户端需要遵守服务器的某些设置,或者在它开始发送压缩数据之前(真的不太可能,因为速度很慢),或者它可以在新设置之后重新启动未压缩发送(我觉得更有可能)。

0 投票
2 回答
5680 浏览

curl - cURL 不适用于 nghttp2

我想将 http/2 与 cURL 一起使用。首先,当我尝试此操作时出现错误curl --http2 https://http2.akamai.com/- "Protocol not supported"。我安装了 nghttp2 并重新安装了 cURL,就像这里描述的那样。错误消失了,我现在可以获取数据curl --http2。但是页面https://http2.akamai.com/告诉我“此浏览器未启用 HTTP/2”,而在 chrome 中或直接通过 nghttp2 显示“您现在正在使用 HTTP/2!” .

我正在使用 mac os x 并通过自制软件将所有依赖项安装在最新版本中。我在这里下载的 curl 源代码 (7.41) 。

0 投票
1 回答
1734 浏览

node.js - 从 chrome 到 node-http2 服务器使用 HTTP/2 时查看多个 TCP 连接

更新(对于任何对结果感兴趣的人:)

我无法弄清楚为什么 chrome 和 node-http2 服务器之间的下一个协议协商会失败。我怀疑是自签名证书或 ALPN/NPN 支持问题。所以我转向 golang HTTP/2 implementation。相同的设置完美运行,我看到单个多路 TCP 连接(chrome --> golang)


我一直在阅读有关 HTTP/2 以及它如何解决 HTTP/1.1 的延迟问题以及每个主机的单个多路 TCP 连接,所以我决定尝试一下。

本实验

  • 创建了一个简单的 html 文件,其中引用了一个 css、一个 js 和几个图像。
  • Node.js 中的一个简单的 http 服务器,它为所有这些文件提供服务
  • 使用 chrome 发出 http 请求
  • 在 Ubuntu ( tcptrack ) 上使用 tcptrack 来跟踪与 http 服务器建立的 TCP 连接。

tcptrack 窗口显示已建立 4 个连接。所以浏览器正在为图像和 css/js 请求打开不同的连接。

来自 chrome 的 http/1.1 请求的 Tcp 跟踪输出

我使用 tcpdump 得到了类似的输出。作为参考,使用的 tcptrack 命令是

tcptrack -d -i eth0 -r 3600 端口 8989

并且 tcpdump 也显示类似的输出

tcpdump -i eth0 -nns 0 "dst 端口 8989 和 tcp[tcpflags] == tcp-syn"

为这些文件提供服务的简单的多合一 http 服务器如下所示(相关代码)

在此之后,我尝试使用 http/2。

  • 启用 chrome 标志以发送 http/2 请求
  • 使用node-http2创建了一个 http/2 服务器
  • 简单的 http 服务器与 http/1.1 具有相同的代码,除了它使用在步骤 2 中安装的 http2 服务器模块。
  • 使用 chrome 发出请求(它必须是符合 HTTP/2 规范的 https 请求)
  • 捕获的 tcptrack/tcpdump 输出

http/2 的 tcptrack 输出

因此,这仍然显示正在建立多个 TCP 连接。此外,如果我增加 html 中的图像数量,连接数也会增加。

所以我不知道如何阅读这个。这是 HTTP/2 的行为方式(或者这是一个 chrome 错误)?有没有更好的方法来使用简单的 http/2 客户端服务器来可视化 HTTP/2 的收益?

注意:我正在为 HTTP/2 服务器使用自签名证书,因此 chrome 在进入页面之前会发出警告,并且可能那些关闭的连接代表它,但我认为它不会影响协议如何请求页面及其组件

感谢大家耐心阅读本文并感谢任何建议。

辛格

PS:Wireshark TCP 捕获也不例外。只是我发现在 Wireshark 中隔离流量更难,所以使用了 tcpdump 和 tcptrack。

更新:更新:查看 chrome://net-internals/ HTTP/2 请求协商失败,它回退到使用 HTTP/1.1。还不明白原因。

chrome内部工具事件显示

next 协议的值为 http/1.1(next_proto_status 和 proto)。但它没有说明导致这种倒退的谈判失败的原因是什么?自签名证书可以是原因吗?

HTTP/2 服务器代码

0 投票
1 回答
565 浏览

firefox - 为本地 HTTP/2 代理生成证书

我试图让 Firefox 每晚使用安全的 HTTP/2 代理,但它拒绝接受自签名证书。

该代理由 nghttp2 作为 HTTP/2 前端和一个简单的 Twisted 代理作为后端组成。Twisted 代码来自https://wiki.python.org/moin/Twisted-Examples,可作为 HTTP/1.1 代理自行工作。nghttp2 被调用

Firefox 将其用作https://nghttp2.org/documentation/nghttpx-howto.html#http-2-proxy-mode中指定的代理。

我使用为 localhost 创建了 server.pem

当我尝试通过代理加载像http://www.something.com这样的通用网站时,Firefox 会显示“此连接不受信任”警告。但是,如果我告诉它添加并存储异常,它只会再次显示警告。据我所知,它永远不会通过 nghttp2 前端到达 Twisted 代理。

我应该为安全代理认证做一些不同的事情吗?除了 nghttp2 说明“请注意,Firefox nightly 和 Chromium 都需要有效的安全代理证书”之外,我在网上找不到太多信息。

0 投票
2 回答
3412 浏览

jetty - Jetty HTTP/2 客户端接收服务器推送示例

Jetty 的支持服务器推送的 HTTP/2 客户端已在 Jetty 9.3 RC ( Link ) 中实现。但是,我还没有找到与此相关的任何文档或示例代码。任何人都可以提供一个示例代码,例如从该站点接收推送的资源:https ://nghttp2.org (已启用 http2 服务器推送的公共服务器)

---更新 1--- 我已经尝试测试这个文件,正如 sbordet 所说。但是,执行此行后

我遇到了这个错误

这是我的pom.xml

这是我的项目目录

---更新2---

将我的pom.xml <build>标签更改为:(明确使用 JDK 8 并添加 -Xbootclasspath 以指向 Jetty 提供的 alpn-boot.jar)。我正在使用 Java 8 更新 31

执行此命令后:

尝试连接到https://webtide.com/(Client.java文件中的默认主机)时出现此错误

连接到https://nghttp2.org/时出现此错误

---更新3---

采取不同的方法:当我拉出整个码头项目的所有主分支,然后创建一个 Intellij 项目时,jetty.project/jetty-http2/http2-client它适用于公共服务器https://webtide.comhttps://nghttp2.org。但是当我在我的自签名证书 http2 服务器上测试它时(使用 nghttp2 + nginx,驻留在我的虚拟机中)然后我得到这个错误

0 投票
0 回答
51 浏览

windows-runtime - 在 WinRT 中使用 HTTP/2 端点

有没有办法在 WP8 或 WP8.1 或 W8.1 应用程序中访问 HTTP/2 / SPDY 端点并获得响应?一直在寻找多个地方,但找不到任何相关的东西。

0 投票
1 回答
1377 浏览

.net - 是否可以将 HTTP2 与 HTTPListener 一起使用

是否可以在 HTTPListeners 中使用 http2 功能?我没有听到任何关于它的消息,但我听说 IIS / asp.net 堆栈的新版本支持它,所以我希望 HTTPListener 也将被升级或提供替代方案。

如果不是,那么支持 http2 的最佳选择是什么,使用原始套接字,或者是否有可能扩展 httplistener?

编辑:澄清我不只是在寻找一个“报告”http2的解决方案,而是一个让我能够实际使用http2新功能(例如推送内容)的解决方案,我的用例是我有一个自定义CMS(自写)服务器极低的延迟(几乎立即回复所有请求),唯一需要优化的是能够推送内容和能够多路复用,因为目前我唯一希望的加速是避免这么多往返的延迟

0 投票
1 回答
88 浏览

cloudflare - SPDY 是否需要资源捆绑以减少响应时间

在这里,我使用术语捆绑来指代将 JS 和 CSS 资源连接在一起以减少 HTTP 请求的数量。HTTP/2 解决了最初产生资源捆绑 Web 开发最佳实践的潜在问题(往返时间、资源获取阻塞)。但是,现在广泛部署的 SPDY 有多少与 HTTP/2 共享这些特征?

如果我使用像 CloudFlare 这样的 SPDY 感知 CDN,如果我不需要关心旧客户端,那么捆绑资源还有什么意义吗?

请注意,资源转换可能与捆绑分开进行,这个问题主要是关于响应时间,而不是关于编译代码。