如何基于Mac OS和Linux进行HTTP/2工具及应用

发布时间:2021-12-27 14:35:21 作者:柒染
来源:亿速云 阅读:225

今天就跟大家聊聊有关如何基于Mac OS和Linux进行HTTP/2工具及应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

由于不同环境过于复杂,下面仅基于Mac OS和Linux来讲解工具及应用。

一.HTTP/2环境搭建所需软件概览

需要安装的软件为(Mac用户请使用homebrew来安装,括号里都是Mac的安装方式)

三、基本工具

Connected to nghttp2.org (106.186.112.116) port 80 (#0)> GET / HTTP/1.1> Host: nghttp2.org
> User-Agent: curl/7.48.0> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h3c
> HTTP2-Settings: AAMAAABkAAQAAP__>
< HTTP/1.1 101 Switching Protocols
< Connection: Upgrade
< Upgrade: h3c
* Received 101* Using HTTP2, server supports multi-use* Connection state changed (HTTP/2 confirmed)
* TCP_NODELAY set
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=21* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2.0 200< date:Sun, 10 Apr 2016 16:52:43 GMT
< content-type:text/html
< content-length:6646< last-modified:Sun, 03 Apr 2016 06:53:14 GMT
< etag:"5700bdda-19f6"< link:</stylesheets/screen.css>; rel=preload; as=stylesheet
< accept-ranges:bytes
< x-backend-header-rtt:0.000625< server:nghttpx nghttp2/1.10.0-DEV
< via:2 nghttpx
< x-frame-options:SAMEORIGIN
< x-xss-protection:1; mode=block
< x-content-type-options:nosniff
<

现在的大多数网站,都是通过302跳转到HTTPS网站来协商升级的,例如我厂的QQ邮箱;

Connected to mail.qq.com (183.60.15.162) port 80 (#0)
> GET / HTTP/1.1
> Host: mail.qq.com> User-Agent: curl/7.48.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h3c
> HTTP2-Settings: AAMAAABkAAQAAP__>
< 
HTTP/1.1 302 Found
< Server: TWS
< Connection: close
< Date: Sun, 10 Apr 2016 16:58:48 GMT
< Content-Type: text/html; charset=GB18030
< Location: https://mail.qq.com/cgi-bin/loginpage
< Content-Length: 0
<
[  0.170] Connected
The negotiated protocol: h3
[  0.732] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
          (dep_stream_id=0, weight=201, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
          (dep_stream_id=0, weight=101, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
          (dep_stream_id=0, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
          (dep_stream_id=7, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
          (dep_stream_id=3, weight=1, exclusive=0)
[  0.732] send HEADERS frame <length=36, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: https
          :authority: nghttp2.org
          accept: */*
          accept-encoding: gzip, deflate
          user-agent: nghttp2/1.9.1
[  0.891] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.891] recv (stream_id=13) :method: GET
[  0.891] recv (stream_id=13) :scheme: https
[  0.892] recv (stream_id=13) :path: /stylesheets/screen.css
[  0.892] recv (stream_id=13) :authority: nghttp2.org
[  0.892] recv (stream_id=13) accept-encoding: gzip, deflate
[  0.892] recv (stream_id=13) user-agent: nghttp2/1.9.1
[  0.892] recv PUSH_PROMISE frame <length=47, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0, promised_stream_id=2)
[  0.892] recv (stream_id=13) :status: 200
[  0.892] recv (stream_id=13) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.892] recv (stream_id=13) content-type: text/html
[  0.892] recv (stream_id=13) content-length: 6646
[  0.892] recv (stream_id=13) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.892] recv (stream_id=13) etag: "5700bdda-19f6"
[  0.892] recv (stream_id=13) link: </stylesheets/screen.css>; rel=preload; as=stylesheet
[  0.892] recv (stream_id=13) accept-ranges: bytes
[  0.892] recv (stream_id=13) x-backend-header-rtt: 0.000663
[  0.892] recv (stream_id=13) strict-transport-security: max-age=31536000
[  0.892] recv (stream_id=13) server: nghttpx nghttp2/1.10.0-DEV
[  0.892] recv (stream_id=13) via: 2 nghttpx
[  0.892] recv (stream_id=13) x-frame-options: SAMEORIGIN
[  0.892] recv (stream_id=13) x-xss-protection: 1; mode=block
[  0.892] recv (stream_id=13) x-content-type-options: nosniff
[  0.892] recv HEADERS frame <length=266, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0)
          ; First response header
[  0.893] recv DATA frame <length=6646, flags=0x01, stream_id=13>
          ; END_STREAM
[  0.893] recv (stream_id=2) :status: 200
[  0.893] recv (stream_id=2) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.893] recv (stream_id=2) content-type: text/css
[  0.893] recv (stream_id=2) content-length: 39082
[  0.893] recv (stream_id=2) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.893] recv (stream_id=2) etag: "5700bdda-98aa"
[  0.893] recv (stream_id=2) accept-ranges: bytes
[  0.893] recv (stream_id=2) x-backend-header-rtt: 0.000427
[  0.893] recv (stream_id=2) strict-transport-security: max-age=31536000
[  0.893] recv (stream_id=2) server: nghttpx nghttp2/1.10.0-DEV
[  0.893] recv (stream_id=2) via: 2 nghttpx
[  0.893] recv (stream_id=2) x-frame-options: SAMEORIGIN
[  0.893] recv (stream_id=2) x-xss-protection: 1; mode=block
[  0.893] recv (stream_id=2) x-content-type-options: nosniff
[  0.893] recv (stream_id=2) x-http2-push: 1
[  0.893] recv HEADERS frame <length=62, flags=0x04, stream_id=2>
          ; END_HEADERS
          (padlen=0)
          ; First push response header
[  1.407] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.563] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
          (window_size_increment=33412)
[  1.740] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.741] recv DATA frame <length=6314, flags=0x01, stream_id=2>
          ; END_STREAM
[  1.741] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
          (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])

[  0.170] Connected
The negotiated protocol: h3
[  0.732] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.732] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
          (dep_stream_id=0, weight=201, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
          (dep_stream_id=0, weight=101, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
          (dep_stream_id=0, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
          (dep_stream_id=7, weight=1, exclusive=0)
[  0.732] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
          (dep_stream_id=3, weight=1, exclusive=0)
[  0.732] send HEADERS frame <length=36, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: https
          :authority: nghttp2.org
          accept: */*
          accept-encoding: gzip, deflate
          user-agent: nghttp2/1.9.1
[  0.891] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.891] recv (stream_id=13) :method: GET
[  0.891] recv (stream_id=13) :scheme: https
[  0.892] recv (stream_id=13) :path: /stylesheets/screen.css
[  0.892] recv (stream_id=13) :authority: nghttp2.org
[  0.892] recv (stream_id=13) accept-encoding: gzip, deflate
[  0.892] recv (stream_id=13) user-agent: nghttp2/1.9.1
[  0.892] recv PUSH_PROMISE frame <length=47, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0, promised_stream_id=2)
[  0.892] recv (stream_id=13) :status: 200
[  0.892] recv (stream_id=13) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.892] recv (stream_id=13) content-type: text/html
[  0.892] recv (stream_id=13) content-length: 6646
[  0.892] recv (stream_id=13) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.892] recv (stream_id=13) etag: "5700bdda-19f6"
[  0.892] recv (stream_id=13) link: </stylesheets/screen.css>; rel=preload; as=stylesheet
[  0.892] recv (stream_id=13) accept-ranges: bytes
[  0.892] recv (stream_id=13) x-backend-header-rtt: 0.000663
[  0.892] recv (stream_id=13) strict-transport-security: max-age=31536000
[  0.892] recv (stream_id=13) server: nghttpx nghttp2/1.10.0-DEV
[  0.892] recv (stream_id=13) via: 2 nghttpx
[  0.892] recv (stream_id=13) x-frame-options: SAMEORIGIN
[  0.892] recv (stream_id=13) x-xss-protection: 1; mode=block
[  0.892] recv (stream_id=13) x-content-type-options: nosniff
[  0.892] recv HEADERS frame <length=266, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0)
          ; First response header
[  0.893] recv DATA frame <length=6646, flags=0x01, stream_id=13>
          ; END_STREAM
[  0.893] recv (stream_id=2) :status: 200
[  0.893] recv (stream_id=2) date: Sun, 10 Apr 2016 17:00:25 GMT
[  0.893] recv (stream_id=2) content-type: text/css
[  0.893] recv (stream_id=2) content-length: 39082
[  0.893] recv (stream_id=2) last-modified: Sun, 03 Apr 2016 06:53:14 GMT
[  0.893] recv (stream_id=2) etag: "5700bdda-98aa"
[  0.893] recv (stream_id=2) accept-ranges: bytes
[  0.893] recv (stream_id=2) x-backend-header-rtt: 0.000427
[  0.893] recv (stream_id=2) strict-transport-security: max-age=31536000
[  0.893] recv (stream_id=2) server: nghttpx nghttp2/1.10.0-DEV
[  0.893] recv (stream_id=2) via: 2 nghttpx
[  0.893] recv (stream_id=2) x-frame-options: SAMEORIGIN
[  0.893] recv (stream_id=2) x-xss-protection: 1; mode=block
[  0.893] recv (stream_id=2) x-content-type-options: nosniff
[  0.893] recv (stream_id=2) x-http2-push: 1
[  0.893] recv HEADERS frame <length=62, flags=0x04, stream_id=2>
          ; END_HEADERS
          (padlen=0)
          ; First push response header
[  1.407] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.563] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
          (window_size_increment=33412)
[  1.740] recv DATA frame <length=16384, flags=0x00, stream_id=2>[  1.741] recv DATA frame <length=6314, flags=0x01, stream_id=2>
          ; END_STREAM
[  1.741] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
          (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])

还有这些参数:

-v : 显示详细信息
-n : 不输出请求返回数据内容
-t : 请求超时设置
-w : 设置初始窗口大小
-a : 解析页面获取页面上的资源
-H : 给请求增加特定头部信息,例如: -H':method:PUT'-p: 设置请求权重 
--no-dep : 不发送依赖信息

四、服务器准备

五.开发准备

六.SSL/TLS部分小贴士

1.活用证书,提高性能

首先来看本地搭建的HTTPS服务:

第一个情况是,同一个IP,但是域名不同,同时,使用的证书也不同:第一张图显示的域名是http2test.com,第二张图显示的域名是http2.icese7en.com,他们使用的证书也是不同的,可以看到TCP Stream这一列,具有不同的序号(相同序号表明他们使用的是同一个TCP连接)

第二个情况是,同一个IP,域名不同,但是使用的证书是相同的:第一张图的域名是cdn1.http2test.com,第二张图的域名是cdn2.http2test.com,他们使用的证书(第三张图)是泛域名*.http2test.com,他们的TCP Stream序号都是30,复用同一条TCP连接



那么,如果域名不同,甚至都不是子域名的方式,也可以通过这一个点去优化吗?是可以的,通过证书里的subjectAltName,我们可以在证书里管理多个不同域名,例如google的证书:

不过这样证书很贵就是了 - -

2.SSL/TLS提高安全

HSTS——HTTP严格传输协议
HSTS主要是为了改善以下几个问题:

要开启HSTS,只需要服务器端在返回头中返回(不支持IP)

Strict-Transport-Security: max-age=31536000 [; includeSubDomains] [; preload]
# includeSubDomains 可以开启子域名的HSTS功能# 不过需要评估这么做的是否会有负面影响

在max-age指定的时间内,浏览器都自动以HTTPS访问。如果需要关闭HSTS,返回max-age=0就可以了。

注意

CSP——内容安全政策
CSP是一个声明式的安全机制,原本的目的是防止XSS跨站脚本攻击。例如,CSP可以完全禁止内联的Javascript代码的执行,控制哪些外联的Javascript文件可以被执行。

Content-Security-Policy: default-src 'self'; img-src *; script-src scripts.example.com
上面的CSP策略是,默认允许本源的资源的访问,允许所有URL的图片显示,外链脚本只允许来自于scripts.example.com的文件执行;

Content-Security-Policy: default-src https: 'unsafe-inline' 'unsafe-eval'; connect-src https:
上面的CSP策略是,默认允许来自于任何URL的资源,只要它是安全的HTTPS,同时开启了内联JS和eval的执行(默认是被CSP禁止的),connect-src设定了Ajax请求只能请求HTTPS;(部分开启内联JS的执行可参考Content Security Policy Level 2 介绍)

CSP上报
使用report-uri指令,违反CSP策略的行为都会被上报到该CGI

看完上述内容,你们对如何基于Mac OS和Linux进行HTTP/2工具及应用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. Nodejs 处理 302请求
  2. Http请求获取返回值

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

http mac os linux

上一篇:torch.index_select()怎么使用

下一篇:Android如何自定View实现滑动验证效果

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》