前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >相同的负载下, HTTPS数据包可能比 HTTP大N倍

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

作者头像
用户11547645
发布2025-03-07 16:05:02
发布2025-03-07 16:05:02
6000
代码可运行
举报
文章被收录于专栏:萝卜要加油萝卜要加油
运行总次数:0
代码可运行

背景

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

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

代码语言:javascript
代码运行次数:0
复制
func helloHandler(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintf(w, "Hello, World!")  
}  

var port int

funcinit() {  
    flag.IntVar(&port, "port", 8082, "port to listen on")  
    flag.Parse()  
}  
funcmain() {  

    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

代码语言:javascript
代码运行次数:0
复制
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 中的连接建立和关闭开销,提升性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜要加油 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档