QUIC,简单来说,就是使用UDP的传输协议,根据Google自己的报告,速度可以加快30%。 主要优点有:
1. 快速建立链接(不用3次握手和TLS4次握手)
2. 多路复用
3. 改进的流控
4. 快速SSL/TLS握手
5. 适合移动用户访问
这么好的性能,当然要赶紧用Go试试看。
https://github.com/lucas-clemente/quic-go
示例中的代码也很简单。
http.Handle("/", http.FileServer(http.Dir(wwwDir)))
h2quic.ListenAndServeQUIC("localhost:4242", "/path/to/cert/chain.pem", "/path/to/privkey.pem", nil)
不过在实践里,还是碰到了2个坑。
TLS配置
因为我的服务是一个http.Handler, 所以quic需要重新配置TLSconfig,否则就会报错。 下面是示例代码
quic := &h2quic.Server{Server: server}
quic.TLSConfig = &tls.Config{}
quic.TLSConfig.GetCertificate = getCertificate
pln, err := net.ListenPacket("udp", cfg.Listen)
if err != nil {
log.Fatal(err)
}
log.Print("listen quic on udp:%s", cfg.Listen)
go quic.Serve(pln)
HEADER设置
成功启用后,Chrome中的SPDY插件并没有出现绿色的标志,还是继续使用HTTP2,经过查找后,发现Google在自家的header中添加了
writer.ResponseWriter.Header().Add("alt-svc", `quic=":443"; ma=2592000; v="38,37,36"`)
其中
- ma是过期时间,单位是秒
- v是指支持的quic版本
- alt-svc是alternative-service的缩写
- quic中是quic的端口,我指定了443
最后通过在chrome地址栏中输入
chrome://net-internals/#quic