为什么curl在mac上使用HTTP/1.1而不是HTTP/2?

为什么curl在mac上使用HTTP/1.1而不是HTTP/2?,curl,http2,http-1.1,Curl,Http2,Http 1.1,据此, 自7.47.0以来,curl工具默认为HTTPS连接启用HTTP/2。 使用自制软件安装最新版本并检查: curl --version curl 7.54.1 (x86_64-apple-darwin15.6.0) libcurl/7.54.1 SecureTransport zlib/1.2.5 但是在启用HTTP2的URL上运行curl(例如,使用测试),我得到: 及 你知道为什么使用HTTP/1.1而不是HTTP/2吗?你可以构建curl来使用许多不同的TLS/SSL库中的一个,

据此,

自7.47.0以来,curl工具默认为HTTPS连接启用HTTP/2。

使用自制软件安装最新版本并检查:

curl --version
curl 7.54.1 (x86_64-apple-darwin15.6.0) libcurl/7.54.1 SecureTransport zlib/1.2.5
但是在启用HTTP2的URL上运行
curl
(例如,使用测试),我得到:


你知道为什么使用HTTP/1.1而不是HTTP/2吗?

你可以构建curl来使用许多不同的TLS/SSL库中的一个,每一个库都有稍微不同的功能集,并为curl提供稍微不同的工作条件

您在问题列表中显示的curl
SecureTransport
是为使用它而构建的TLS库,即macOS本机TLS库

安全传输并没有为curl提供通过TLS协商HTTP/2的必要手段,或者至少没有,因为我被告知最新版本现在支持ALPN,所以未来的curl版本应该能够通过TLS进行HTTP/2,即使使用安全传输

除了正确的TLS协商之外,curl还需要讲HTTP/2,这要感谢使用了久负盛名的nghttp2库,所以这是curl能够讲HTTP/2所需要的第二个依赖项。有了nghttp2,curl实际上可以通过纯文本HTTP讲HTTP/2,即使TLS库无法正确协商ALPN

修理 更高版本的macOS附带内置libreSSL和HTTP/2支持的curl


如果您选择使用另一个TLS库(如OpenSSL、GnuTLS或NSS)来重建curl,它现在已经可以在HTTPS上使用HTTP/2了。

使用MacOS Sierra,您可以通过使用OpenSSL而不是SecureTransport来安装支持HTTP2的更新curl

  • brew重新安装curl——使用openssl——使用-nghttp2
  • brew链接卷曲--force
  • 重新启动终端
  • curl-V
    应该返回如下内容:
  • curl 7.54.1(x86_64-apple-darwin16.6.0)libcurl/7.54.1 OpenSSL/1.0.2l zlib/1.2.8 nghttp2/1.24.0发布日期:2017-06-14协议:dict 文件ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smb smtp smtps telnet tftp功能:IPv6大文件NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS代理


    我应该注意到,MacOS的次要点更新有时会覆盖正在使用的curl版本。如果出现这种情况,只需重新运行
    brew link curl--强制
    并重新启动终端,以切换回支持自制HTTP2的版本。

    FYI在SecureTransport中启用HTTP/2协商的功能是
    SSLSetALPNProtocols
    。它可以在iOS 11+和macOS 10.13+上使用。与此同时,苹果已经转换了,现在推出的curl是使用libressl构建的……哦。我不知道。那是。。。令人惊讶。旁注:macOS High Sierra配备了curl 7.54.0,并支持内置的HTTP2。
    curl -I http://www.google.co.uk 
    HTTP/1.1 200 OK
    
    curl --http2 -v http://www.google.co.uk
    curl: (1) Unsupported protocol