相同的负载, HTTPS数据包可能比 HTTP大10倍

HTTPS请求比HTTP请求大约多10倍,因TLS握手占用大量数据。视场景需求可考虑使用HTTP优化性能。

 

缘起

最近上线了一个新服务,有一个采集接口占用的带宽比较多,这个接口很简单,我有点好奇,一个https 请求会传输多少数据, 他会比HTTP请求多多少数据?

我写了一个demo在本地测试一下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
func helloHandler(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintf(w, "Hello, World!")  
}  
  
var port int  
  
func init() {  
    flag.IntVar(&port, "port", 8082, "port to listen on")  
    flag.Parse()  
}  
func main() {  
  
    http.HandleFunc("/", helloHandler)  
    fmt.Println(fmt.Sprintf("Starting server at port %d", port))  
    if err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil); err != nil {  
       fmt.Println("Error starting server:", err)  
    }  
}

然后在本地使用 caddy 提供https

1
2
3
4
5
6
7
8
http://your-domain.com {
    reverse_proxy 127.0.0.1:8082
}

https://your-domain.com {
    reverse_proxy 127.0.0.1:8082
    tls internal
}

最后用wireshark抓包,我惊奇的发现。 一个简单的HTTPS 请求会传输2164 个 bytes 数据。

假设 并发为500QPS,那么这个接口所需要的带宽为:
2164×8×500/1000000 ≈ 8.656Mbps

HTTPS全称是:HTTP over TLS,每次建立新的TCP连接通常需要进行一次完整的TLS Handshake。在握手过程中,客户端和服务器需要交换证书、公钥、加密算法等信息,这些数据占用了较多的字节数。
TLS Handshake的内容主要包括:

  • 客户端和服务器的随机数
  • 支持的加密算法和TLS版本信息
  • 服务器的数字证书(包含公钥)
  • 用于生成对称密钥的“Pre-Master Secret”
    这个过程不仅耗时,还会消耗带宽和CPU资源。
    因此想到最粗暴的解决方案也比较简单,就是直接使用 HTTP,省去TLS Handshake的过程,那么自然就不会有 TLS 的传输了。
    那么是否真的有效呢?验证一下就知道。


相同的请求,http接口只需要 223 bytes,大约只需要https请求的 1/10。

结论

在绝大多数情况下,HTTPS 是首选,提供了更好的安全性和SEO,但是在一些内部网络或者高性能需求的受控环境,还有传输非敏感数据的时候,比如内网数据采集等,可以选择使用HTTP来优化性能。
当然,https 也可以优化 TLS Handshake 这个过程,那就是 Keep-AliveKeep-Alive是一种连接复用机制,允许在一次 TCP 连接上进行多次请求-响应交互,而无需为每个请求都建立新的连接。它显著减少了 HTTPS 中的连接建立和关闭开销,提升性能。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 16:06 CST
使用 Hugo 构建
主题 StackJimmy 设计