這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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 = getCertificatepln, 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