这可能只是突出了我的一些误解,但我很好奇:
如果您运行的HTTP/2服务器并且希望在浏览器中向服务器发出XHR请求,那么XHR会自动利用标头中的性能优化并提供它吗?
或者它会忽略该功能并作为HTTP请求运行?如果是这样,我们可以做些什么来在我们的请求中使用新的优化吗?
我在IIS 10(Windows Server 2016)上托管了一个asp.net web api.当我GET从Microsoft Edge浏览器发出请求时,我看到它HTTP 2.0在IIS日志中使用
2015-09-20 21:57:59 100.76.48.17 GET /RestController/Native - 443 - 73.181.195.76 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.135+Safari/537.36+Edge/12.10240 - 200 0 0 7299
Run Code Online (Sandbox Code Playgroud)
但是,当GET通过.net 4.6客户端发出请求时,如下所示,
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://myapp.cloudapp.net/");
HttpResponseMessage response = await client.GetAsync("RestController/Native");
if (response.IsSuccessStatusCode)
{
await response.Content.CopyToAsync(new MemoryStream(buffer));
}
}
Run Code Online (Sandbox Code Playgroud)
我HTTP 1.1在服务器日志中看到以下日志
2015-09-20 20:57:41 100.76.48.17 GET /RestController/Native - 443 - 131.107.160.196 HTTP/1.1 - - 200 0 0 707
Run Code Online (Sandbox Code Playgroud)
如何让.net客户端使用HTTP/2.0?
我正在评估从HTTP2到HTTP2的性能和获得奇怪的结果我可以从我的网站获得的东西 - 欧洲的网站是从美国加载的:
我从Chrome的网络监视器捕获屏幕截图,看起来像HTTP/2,大多数资源是一个接一个地加载而不是并行加载,就像普通SSL一样.
为了测试,我使用Apache 2.4.17(Win32)所涵盖的Web应用程序作为代理(以应用对SSL和HTTP/2协议的支持).客户端浏览器是Windows 7上的Chrome 46.0.2490.86.
捕获的网络请求如下.简短摘要:1.第一拳 - 是HTML页面2.下一组 - 6个请求 - 直接在HTML中声明的资源3.其余 - 通过脚本动态添加的资源(文档/头部中的'script'和'link/css'标签) .
图片的左侧是HTTP/2,右侧 - 通过普通SSL(http2_module已关闭)的相同工作人员.
更新:我测试了支持HTTP/2作为反向代理的"其他东西".它来自http://nginx-win.ecsds.eu的 nginx 1.9.7.1 Kitty - 原始nginx的分支'for windows'.原始nginx中的HTTP/2仅在商业版中可用,因此我无法尝试.看起来没有其他服务器实现HTTP/2 +反向代理可用于Windows,或者我找不到它们(列表在这里和这里).
我在Kitty中得到的结果更具误导性 - 没有像Apache那样的"顺序加载"资源,但是传输速率比HTTP/2慢两倍于普通SSL.最终结果是 - HTTP/2明显慢于普通SSL.以下是所有这些并排.
在所有这些中,我只能假设性能强烈依赖于实现,并且当前可用的实现执行奇怪,以得出关于HTTP/2的任何一致的结论.
已经按照这里的步骤,我仍然Unsupported Protocol使用curl --http2选项.类似地,设置CURLOPT_HTTP_VERSION到CURL_HTTP_VERSION_2_0使用HTTP/1.1进行通信的结果在节目中,未HTTP/2.
平台:VMware Player 7上的Ubuntu 15.04.
我已经安装了nghttp2-1.0.4 --prefix=/usr/local,因此libnghttp2.*位于/usr/local/lib.
这是配置curl-7.43.0的代码:
./configure --with-nghttp2=/usr/local
Run Code Online (Sandbox Code Playgroud)
结果显示HTTP2已启用:
HTTP2 support: enabled (nghttp2)
Run Code Online (Sandbox Code Playgroud)
后make和sudo make install,以下回报Unsupported Protocol:
curl --http2 https://http2.akamai.com
Run Code Online (Sandbox Code Playgroud)
curl版本不支持nghttp2:
curl 7.43.0 (i686-pc-linux-gnu) libcurl/7.38.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API SPNEGO NTLM NTLM_WB …Run Code Online (Sandbox Code Playgroud) NodeJS 4.x或5.x本机是否支持HTTP/2协议?我知道有http2包,但它是一个外部的东西.
是否有计划将http2支持合并到Node的核心?
很长一段时间,浏览器每个主机最多使用6个并发HTTP 1.1连接来从网页中检索资产.远远超出这个黄金标准被认为是DOS并让你被禁止服务器.
现在有HTTP/2,我们可以在一个连接上复用许多HTTP请求.我们是否仍应对我们在连接上复用的并发请求数量使用类似的限制,以防止服务器过载?或者在单个连接上复用更多请求是否有害?
任何人都知道浏览器使用每台主机和HTTP/2服务器的每个连接限制了什么?
我希望用户能够将其网站网址输入到Chrome扩展程序中的输入框中,Chrome扩展程序将使用AJAX请求或其他类似内容来检测并告知用户URL后面的服务器是否支持发送响应通过HTTP2.这可能吗?
也许WebRequest有办法获取这些信息?还是新的Fetch API?你的请求能否以某种方式告诉服务器只能理解HTTP2回复?我看不出明显的方式.
我知道你可以使用window.chrome.loadTimes().connectionInfo获取当前页面的协议,但这需要加载我不想做的整个页面.
示例URLS:
通过HTTP2发送:https://cdn.sstatic.net/
通过HTTP 1.1提供:https://stackoverflow.com/
我使用的是新 java.net.http.HttpClient与sendAsync方法.该HttpClient是Singelton内创建一次像这样:
HttpClient.newBuilder().build()所以真的没什么特别的.
这些请求可以是POST,GET但我不知道是哪个引起了麻烦.
每天只有几个请求,但有时一个线程使用100%的cpu核心.并不是迫在眉睫,而是在请求完成一段时间后.
所以我做了一个线程转储,甚至有两个无限循环发生,以下2个线程突出:
"HttpClient-4-Worker-5" #144 daemon prio=5 os_prio=0 cpu=511298.10ms elapsed=520.71s tid=0x00007f684403e800 nid=0x2d6b runnable [0x00007f68ac162000]
java.lang.Thread.State: RUNNABLE
at jdk.internal.net.http.common.SSLFlowDelegate$Writer.processData(java.net.http@11.0.2/SSLFlowDelegate.java:771)
at jdk.internal.net.http.common.SSLFlowDelegate$Writer$WriterDownstreamPusher.run(java.net.http@11.0.2/SSLFlowDelegate.java:645)
at jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(java.net.http@11.0.2/SequentialScheduler.java:147)
at jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(java.net.http@11.0.2/SequentialScheduler.java:198)
at jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(java.net.http@11.0.2/SequentialScheduler.java:271)
at jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(java.net.http@11.0.2/SequentialScheduler.java:224)
at jdk.internal.net.http.common.SSLFlowDelegate$Writer.triggerWrite(java.net.http@11.0.2/SSLFlowDelegate.java:722)
at jdk.internal.net.http.common.SSLFlowDelegate.doHandshake(java.net.http@11.0.2/SSLFlowDelegate.java:1024)
at jdk.internal.net.http.common.SSLFlowDelegate.doClosure(java.net.http@11.0.2/SSLFlowDelegate.java:1094)
at jdk.internal.net.http.common.SSLFlowDelegate$Reader.unwrapBuffer(java.net.http@11.0.2/SSLFlowDelegate.java:500)
at jdk.internal.net.http.common.SSLFlowDelegate$Reader.processData(java.net.http@11.0.2/SSLFlowDelegate.java:389)
- locked <0x00000000fba68950> (a java.lang.Object)
at jdk.internal.net.http.common.SSLFlowDelegate$Reader$ReaderDownstreamPusher.run(java.net.http@11.0.2/SSLFlowDelegate.java:263)
at jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run(java.net.http@11.0.2/SequentialScheduler.java:175)
- locked <0x00000000fbbca3e8> (a java.lang.Object)
at jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(java.net.http@11.0.2/SequentialScheduler.java:147)
at jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(java.net.http@11.0.2/SequentialScheduler.java:198)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.2/ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.2/ThreadPoolExecutor.java:628)
at java.lang.Thread.run(java.base@11.0.2/Thread.java:834)
Locked ownable …Run Code Online (Sandbox Code Playgroud) 我打算将我的nginx升级到支持HTTP/2的1.9.6.
有nginx实现HTTP/2服务器推送吗?
我有一个Python REST服务,我想使用HTTP2来提供服务.我当前的服务器设置是nginx -> Gunicorn.换句话说,nginx(重定向到端口443的端口443和80)作为反向代理运行,并将请求转发给Gunicorn(端口8000,没有SSL).nginx在HTTP2模式下运行,我可以通过使用chrome验证这一点,并在向服务器发送简单的GET后检查'protocol'列.但是,Gunicorn报告它收到的请求是HTTP1.0.另外,我在这个列表中找不到它:https:
//github.com/http2/http2-spec/wiki/Implementations
所以,我的问题是:
我想使用HTTP2的原因是因为在某些情况下我需要一起执行数千个请求,我有兴趣看看HTTP2的多路复用请求功能是否可以加快速度.使用HTTP1.0和Python请求作为客户端,每个请求大约需要80毫秒,这是不可接受的.另一种解决方案是批量/批量处理我的REST资源,并通过单个请求发送多个.是的,这个想法听起来不错,但我真的很想知道HTTP2是否可以加快速度.
最后,我要提一下,对于客户端,我使用带有Hyper http2适配器的Python请求.