我想将 http/2 与 cURL 一起使用。首先,当我尝试此操作时出现错误curl --http2 https://http2.akamai.com/- “协议不支持”。我安装了 nghttp2 并重新安装了 cURL,就像这里描述的那样。错误消失了,我现在可以获取数据了curl --http2。但是页面https://http2.akamai.com/告诉我“此浏览器未启用 HTTP/2”,而在 chrome 中或直接通过 nghttp2 则显示“您现在正在使用 HTTP/2!” 。
我使用的是 mac os x 并通过 homebrew 安装了最新版本中的所有依赖项。我在这里下载了curl源代码(7.41)。
我正在使用Charles来调试通过网络上的移动设备发出的 HTTP 响应(即 iPhone 中没有查看源代码)。我注意到,当我向 google.com 发出请求时,Charles 会报告一堆看似垃圾的内容作为响应内容。
我不是在请求 charler 支持(或者,不是在这里请求 - 我已经向代理作者发送了支持票)。我想知道谷歌到底在做什么。我不认为这是 gzip 编码(至少标头没有表明它是),但我不知道这是否是 Google 所做的某种特殊的非标准优化,或者它是否是 HTTP 的一部分/2 我不熟悉。
那么,作为一名在 90 年代末学习 HTTP 的程序员,谷歌现在到底通过网络发送什么和/或理解现代 HTTP/2 的第一步是什么?
我正在阅读规范并试图准确了解 421 何时可能返回。给出了一个例子,但我不完全理解它。
背景
该规范建立了两个允许连接重用的条件:
对于没有 TLS 的 TCP 连接,这取决于解析为相同 IP 地址的主机。
和
对于 https 资源,连接重用还取决于是否拥有对 URI 中的主机有效的证书。
如果连接中使用的证书有多个subjectAltName或其中任何一个subjectAltName是通配符,则该连接可以重新用于主机名位于 s 列表中subjectAltName或与任何通配符匹配的任何请求。
规范中的具体示例
在某些部署中,重复使用多个源的连接可能会导致请求被定向到错误的源服务器。例如,TLS 终止可能由使用 TLS 服务器名称指示 (SNI) [TLS-EXT] 扩展来选择源服务器的中间件执行。这意味着客户端有可能将机密信息发送到可能不是请求的预期目标的服务器,即使该服务器在其他方面具有权威性。
请解释一下我对这个例子的理解哪里错误:
使用具有域的请求建立到中间件的 https 连接x.com。中间盒的 IP 地址为 1.2.3.4,并x.com解析为该地址。使用 SNI,TLS 握手会x.com返回一个对该域有效的证书。此连接上的所有消息都从客户端发送到中间件或从中间件发送到客户端。从客户端到中间件的应用程序级消息由中间件转发到不同连接上的源。从源到中间盒的消息被转发到客户端。如果要重用连接,满足上面讨论的两个条件是不够的。具体来说,对于域为 的请求y.com:如果y.com解析为 1.2.3.4 并且中间件具有对 有效的证书y.com,则仍然可能存在问题。因为原始连接使用 TLS 握手x.com,并且握手仅在新连接开始时完成,所以无法建立 https 连接来获取y.com. 因此客户端错误地在同一连接上向 发送请求y.com。中间件拒绝请求,因为与连接关联的证书的有效期为x.com- not y.com …
这主要是出于好奇;说我有一个 HTTP1.1 兼容的服务器。我没有资源/无法向该服务器添加完整的 HTTP2 支持。
我仍然希望能够通过告诉客户端PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n使用 HTTP1.1 来为使用HTTP2 连接序言( )打开连接的客户端提供服务。请注意,这是关于不使用带有Upgrade标头的 HTTP1.1 请求启动连接的客户端。
这是我想要实现的行为:
CLIENT SERVER
| ------ http2 GET --> |
| <----need http1 ---- |
| ------ http1 GET --> |
... (normal http1 processing)
Run Code Online (Sandbox Code Playgroud)
该规范包含一个错误代码HTTP_1_1_REQUIRED (0xd),听起来正是我所需要的。此外,从阅读周围来看,这个错误代码似乎用于在必要时降级连接(显然是 TLS 重新协商?)。然而,我似乎无法让它发挥作用......
CLIENT SERVER
| ------ http2 GET --> |
| <----need http1 ---- |
| ------ http1 GET --> |
... (normal http1 processing)
Run Code Online (Sandbox Code Playgroud)
使用上述内容并fwrite(frame, …
我有 Envoy 代理处理 SSL 终止。Nginx(docker 容器中的 1.17.0,已编译--with-http_v2_module)是几个上游服务之一。结果,Nginx 在端口 443 上接收流量但不使用该ssl模块:
server {
listen 443;
server_name example.com www.example.com;
root /var/www/html;
...
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果我尝试添加http2到监听行的末尾,我会收到:
curl: (1) Received HTTP/0.9 when not allowed
Run Code Online (Sandbox Code Playgroud)
...不仅仅是有问题的example.com,而是所有服务器。
出于明显的性能原因,我希望 Envoy 通过 HTTP/2 与 Nginx 对话。
是否有一些技巧可以让 nginx 在端口 443 上使用 http2 而无需 SSL 终止?
编辑:
核心nginx.conf:
user nginx;
worker_processes 2;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 64M;
sendfile on;
keepalive_timeout 65; …Run Code Online (Sandbox Code Playgroud) 我是 ASP.NET core 新手,我正在尝试在我的计算机 (Windows 8.1) 上启动一个新的 ASP.NET core 应用程序。我正在关注https://learn.microsoft.com/en-us/aspnet/core/getting-started/?view=aspnetcore-3.1&tabs=windows上的教程(这是最基本的):
\n当我运行应用程序并在 Chrome 中导航到 https://localhost:5001/ 时,收到以下错误:
\n\n\n无法访问此站点\xe2\x80\x99
\n
\n位于 https://localhost:5001/ 的网页可能暂时无法访问,或者可能已永久移至新网址。
\nERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
对我来说,这感觉像是一个证书问题,所以我点击了“信任开发证书部分”下的链接,然后尝试通过以下方式删除并重新添加旧证书:
\ndotnet dev-certs https --clean\ndotnet dev-certs https --trust\nRun Code Online (Sandbox Code Playgroud)\n但这没有帮助。
\n运行 dotnet watch run 时,我没有看到任何错误。这是输出:
\nwatch : Started \ninfo: Microsoft.Hosting.Lifetime[0] \n Now listening on: https://localhost:5001 \ninfo: Microsoft.Hosting.Lifetime[0] \n Now listening on: http://localhost:5000 \ninfo: …Run Code Online (Sandbox Code Playgroud) 作为一点背景知识,我刚刚完成了训练营并开始深入研究网络和网络服务器。
在阅读了有关 OSI 模型、TCP/IP 模型和 HTTP 的一些信息后,我发现这些理论知识与我在现实生活中所做的之间存在某种差距。
例如,我用在 node.js 上运行的服务器构建了几个项目。直到最近我才发现它们在 HTTP 1.1 上运行。
我看到的所有教程课程或其他示例都使用 HTTP 1.1 而不是 HTTP 2。
理论上,HTTP2 在处理大量数据方面做得更好,而且确实比 HTTP 1.1 更安全。
尽管存在一些缺点,但 http2 似乎是 http 的高级形式,并且在过去几年中已经成熟。
我很难理解为什么服务器语言(或 node.js 的运行时)仍然使用 HTTP 1.1 而不是 2。
谁能解释一下?
在HTTP/1.1案例中,一个网页有多个资源,每个文件将创建一个到服务器端的连接来检索数据,js,css等.我认为工作模式类似于多进程或多线程,工作并行.
但是在HTTP/2 Case中,每个域在网页中只有一个连接,即使它可以处理来自客户端浏览器的多个请求,也许它类似于单个线程.
我不知道为什么http/2的性能比http/1.1更好?
我试图弄清楚如何使用NodeJS发送HTTP / 2 POST请求。到目前为止,我离文档中的示例还很远:
const http2 = require('http2');
const fs = require('fs');
const client = http2.connect('https://localhost:8443', {
ca: fs.readFileSync('localhost-cert.pem')
});
client.on('error', (err) => console.error(err));
client.on('socketError', (err) => console.error(err));
const req = client.request({ ':path': '/' });
req.on('response', (headers, flags) => {
for (const name in headers) {
console.log(`${name}: ${headers[name]}`);
}
});
req.setEncoding('utf8');
let data = '';
req.on('data', (chunk) => { data += chunk; });
req.on('end', () => {
console.log(`\n${data}`);
client.close();
});
req.end();
Run Code Online (Sandbox Code Playgroud)
但是我还不清楚如何实际设置数据以POST方式发送。
我正在开发一个需要从企业网络连接到云中的服务的应用程序。我想使用gRPC以及gRPC流作为此通信的协议。
这行得通吗?路由器,代理和防火墙会正确处理此协议吗?例如,许多企业在其网络出口处都有一个蓝衣或其他代理-它将起作用吗?
预先感谢您的反馈!
http2 ×10
http ×4
node.js ×2
asp.net-core ×1
backend ×1
curl ×1
envoyproxy ×1
grpc ×1
networking ×1
nghttp2 ×1
nginx ×1
post ×1
ssl ×1