别着急,坐和放宽
使用社交账号登录
GET /index.html。随着互联网的发展,仅传输文字已无法满足需求。
Expires 和 Last-Modified。HTTP/1.1 是目前互联网上使用最广泛的协议版本,它主要解决了连接复用问题。
Connection: keep-alive(默认开启)。Cache-Control (如 max-age, no-cache),提供了比 HTTP/1.0 更精准的缓存策略。ETag (实体标签),通过内容哈希校验资源是否变更,比时间戳更可靠。Host 头。这使得虚拟主机 (Virtual Hosting) 成为可能,即一台物理服务器可以托管多个域名。PUT, DELETE, OPTIONS, PATCH 等方法,为后来的 RESTful API 奠定了基础。Range 头,允许请求资源的特定部分(如视频拖拽播放)。虽然 Keep-Alive 复用了连接,但 HTTP/1.1 的请求处理依然是串行的。
HTTP/2 是对 HTTP 传输层的彻底重构,旨在应用层解决性能瓶颈。
103 Early Hints。HTTP/2 虽然解决了应用层的队头阻塞,但将所有数据都压在一个 TCP 连接上,导致了TCP 层面的队头阻塞。
为了解决 TCP 的固有缺陷,HTTP/3 抛弃了 TCP,改用基于 UDP 的 QUIC 协议。
HTTP/3 将传输层从 TCP 换成了 UDP,并在应用层(用户态)实现了可靠传输机制。
在 Go 语言中,启用 HTTP/2 非常简单,因为标准库 net/http 原生支持。启用 HTTP/3 则需要引入 quic-go。
只要开启 TLS (HTTPS),Go 会自动协商升级到 HTTP/2。
同理,使用 StartTLS 即可。
需要使用 github.com/quic-go/quic-go/http3 包。
| 场景 | 推荐协议 | 技术理由 |
|---|---|---|
| 微服务内部调用 (RPC) | gRPC (HTTP/2) | 追求极致性能、多语言支持、二进制传输。gRPC 基于 HTTP/2 设计。 |
| 简单的内部 API / 调试 | HTTP/1.1 | 文本协议易于调试(curl/postman),无 TLS 证书负担,部署简单。 |
| 面向公网的 Web 服务 | HTTP/2 (必须) | 当前行业标准。多路复用显著提升加载速度,且浏览器强制要求 HTTPS。 |
| 移动端 App / 弱网环境 | HTTP/3 | 0-RTT 建连和抗丢包能力,能显著改善移动网络(4G/5G/Wi-Fi 切换)下的用户体验。 |
| 实时互动 (直播/游戏) | HTTP/3 或 WebSocket | 利用 UDP 的低延迟特性。 |
总结:对于绝大多数公网 Web 应用,HTTP/2 + HTTPS 是标准配置。如果你专注于移动端体验优化,应该开始尝试 HTTP/3。
package main
import (
"log"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
// c.Request.Proto 将显示 "HTTP/2.0"
c.String(200, "Protocol: "+c.Request.Proto)
})
// HTTP/2 强制要求 HTTPS
// 使用 mkcert localhost 生成本地测试证书
log.Println("Gin running on https://localhost:8443")
if err := r.RunTLS(":8443", "server.crt", "server.key"); err != nil {
log.Fatal(err)
}
}
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Protocol: "+c.Request().Proto)
})
e.Logger.Fatal(e.StartTLS(":8443", "server.crt", "server.key"))
}
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/quic-go/quic-go/http3"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
// 关键:添加 Alt-Svc 头,告知浏览器该服务支持 HTTP/3
c.Header("Alt-Svc", `h3=":443"; ma=2592000`)
c.String(200, "Hello via "+c.Request.Proto)
})
// 启动 HTTP/3 服务器 (监听 UDP)
go func() {
server := http3.Server{
Addr: ":443",
Handler: r,
}
log.Println("HTTP/3 server listening on :443")
err := server.ListenAndServeTLS("server.crt", "server.key")
if err != nil {
log.Fatal(err)
}
}()
// 同时启动 HTTP/1.1 & HTTP/2 (监听 TCP) 作为兼容降级
log.Println("HTTP/1.1 & HTTP/2 server listening on :443")
err := http.ListenAndServeTLS(":443", "server.crt", "server.key", r)
if err != nil {
log.Fatal(err)
}
}