Go的http/2使用也非常简单,但是必须和TLS一起使用。
“golang.org/x/net/http2”
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“hello http2”))
})
http2.ConfigureServer(&srv, &http2.Server{})
go func() {
log.Fatal(srv.ListenAndServeTLS(“server.crt”, “server.key”))
}()
“golang.org/x/net/http2”
“golang.org/x/net/http2/h2c”
http2.ConfigureServer(s, &http2.Server{})
log.Fatal(s.ListenAndServe())
目前浏览器对http/2都是采用TLS的方式,所以用浏览器访问这个服务的话会退化为http/1.1的协议
https://www.cnblogs.com/gao88/p/9840609.html
HTTP Upgrade
为了更方便地部署新协议,HTTP/1.1 引入了 Upgrade 机制,它使得客户端和服务端之间可以借助已有的 HTTP 语法升级到其它协议。
要发起 HTTP/1.1 协议升级,客户端必须在请求头部中指定这两个字段:
Connection: Upgrade
Upgrade: protocol-name[/protocol-version]
客户端通过 Upgrade 头部字段列出所希望升级到的协议和版本,多个协议之间用英文逗号和空格(0x2C, 0x20)隔开。除了这两个字段之外,一般每种新协议还会要求客户端发送额外的新字段,这里略过不写。
如果服务端不同意升级或者不支持 Upgrade 所列出的协议,直接忽略即可(当成 HTTP/1.1 请求,以 HTTP/1.1 响应);如果服务端同意升级,那么需要这样响应:
HTTP
HTTP/1.1 101 Switching Protocols
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
[… data defined by new protocol …]
使用过 WebSocket,应该已经对 HTTP Upgrade 机制有所了解。
显然,这个机制也可以用做 HTTP/1.1 到 HTTP/2 的协议升级。例如:
HTTP
GET / HTTP/1.1
Host: example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
在 HTTP Upgrade 机制中,HTTP/2 的协议名称是 h2c,代表 HTTP/2 ClearText。如果服务端不支持 HTTP/2,它会忽略 Upgrade 字段,直接返回 HTTP/1.1 响应,例如:
HTTP
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html
…
如果服务端支持 HTTP/2,那就可以回应 101 状态码及对应头部,并且在响应正文中可以直接使用 HTTP/2 二进制帧:
HTTP
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c
[ HTTP/2 connection … ]
https://imququ.com/post/protocol-negotiation-in-http2.html
用curl命令测试
curl -ivX PATCH –http1.0 -H
https://httpwg.org/specs/rfc7540.html
https://halfrost.com/http2_begin/
HTTP/2 最大限度的兼容 HTTP/1.1 原有行为:
在应用层上修改,基于并充分挖掘 TCP 协议性能。
客户端向服务端发送 request 请求的模型没有变化。
scheme 没有发生变化,没有 http2://
使用 HTTP/1.X 的客户端和服务器可以无缝的通过代理方式转接到 HTTP/2 上。
不识别 HTTP/2 的代理服务器可以将请求降级到 HTTP/1.X。
字符串 “h2” 标识 HTTP/2 使用传输层安全性(TLS)TLS12的协议。该标识符用于 TLS 应用层协议协商(ALPN)扩展TLS-ALPN字段以及识别 HTTP/2 over TLS 的任何地方。
“h2”字符串被序列化为 ALPN 协议标识符,作为两个八位字节序列:0x68,0x32。
字符串 “h2c” 标识通过明文 TCP 运行 HTTP/2 的协议。此标识符用于 HTTP/1.1 升级标头字段以及标识 HTTP/2 over TCP 的任何位置。
“h2c” 字符串是从 ALPN 标识符空间保留的,但描述了不使用 TLS 的协议。协商 “h2” 或 “h2c” 意味着使用本文档中描述的传输,安全性,成帧和消息语义。
https://www.anquanke.com/post/id/220996
https://juejin.cn/post/6844903626280812551
https://echo.labstack.com/cookbook/http2/
https://segmentfault.com/a/1190000037438011
单数目前浏览器对http/2都是采用TLS的方式,所以用浏览器访问这个服务的话会退化为http/1.1的协议,测试的话你可以使用Go实现客户端的h2c访问。
https://colobu.com/2018/09/06/Go-http2-%E5%92%8C-h2c/
https://www.bookstack.cn/read/echo-v3-zh/cookbook-http2.md
https://www.infoq.cn/article/vibfhhmpf7hmnnw4fhrx
https://www.qedev.com/dev/211853.html
https://stackoverflow.com/questions/41894411/how-to-force-curl-to-ask-for-http-1-1-or-maybe-theres-another-issue-not-sure