只因把 https 改成 http,带宽减少了 70%!

科技   2024-11-08 11:01   山西  
今天咱们来聊聊一个看似不起眼但却很有“杀伤力”的小操作:从 HTTPS 改成 HTTP,居然让带宽减少了 70%!🤯 是不是有点匪夷所思?别急,听我慢慢道来。
事情是这样的,某个高并发的采集服务刚上线没多久,负责数据采集的这条 100M 专线带宽就直接爆掉了。
要知道,这条专线除了这个采集服务压根没有其他任务,基本可以确定就是它在疯狂占带宽。让人纳闷的是,这个服务的请求只是普通的 GET 请求,没有携带什么大数据量,那为啥上行带宽会被瞬间塞满呢?🤔

初步排查:哪里消耗了带宽?

既然带宽莫名其妙地被吃满了,那我们程序员的本能就是去查数据包啊!用 Charles 抓包一看,果然“真凶”现身了:一个小小的请求,居然需要 1.68 KB 的流量,其中仅 TLS 握手(Handshake)就占了 1.27 KB。这玩意儿可是个不小的“流量杀手”啊!感觉就像吃个外卖结果送餐费比餐费还高,心里有点小崩溃。

TLS Handshake是什么来头?

那可能有小伙伴问了:“TLS 握手是什么?”其实,简单来说,TLS(Transport Layer Security)就是 HTTPS 安全协议的一部分,它负责在你和服务器之间建立加密通道,保证数据传输的安全性。
而这个握手过程就是服务器和客户端在正式传输数据前的一次“对暗号”,双方确认彼此身份的同时商量好加密的规则。说白了,这就是一种防止中间人攻击的措施,确保你和服务器的通信不被偷窥或篡改。
但是,TLS 握手的代价是比较“昂贵”的。为什么呢?因为它的协议设计需要大量的“问候语”和“暗号”(比如交换证书、验证、密钥生成等),每次握手都会额外产生相对较大的流量。尤其是在高并发场景下,频繁的 TLS 握手真的很耗带宽。

一个带宽的简单计算

从抓包的数据看,一个请求 1.68 KB,其中 TLS 握手就占 1.27 KB。假设并发数是 20000,那实际带宽需求就是:

怪不得 100 Mbps 的带宽会爆掉,这回总算找到原因了吧?这个计算结果非常“扎心”,也就是高并发下 HTTPS 的确可能会吃掉你大量的带宽,甚至直接拖垮整个网络。
既然发现问题,那解决问题的思路就清晰了——换成 HTTP 试试!把 HTTPS 改成 HTTP 后,瞬间“减负”了 70%。原因也很简单:HTTP 是明文传输,不需要什么握手认证,这样直接跳过了 TLS 握手这一步,流量自然也就小了很多。

可是,直接用 HTTP 安全性不是问题吗?

我知道,这时候大家肯定有点担心:HTTP 没有加密,安全性还要不要了?这里有一个小小的背景补充:对于数据采集服务来说,如果数据本身并不涉及敏感信息,那么选择 HTTP 反而是一种更合适的做法。
咱们在工程上经常要做取舍,不是所有情况下都必须“上最贵的”。有时候牺牲一点安全性,用 HTTP 可以节省很多带宽,还是挺划算的。🤑
当然,并不是每个场景都能轻松换成 HTTP,如果数据传输中有用户隐私或者财务信息,那还是老老实实用 HTTPS 吧!比如在线支付、用户登录等,绝对不能因为省带宽而牺牲用户隐私。况且现在浏览器基本上都强制要求敏感信息传输用 HTTPS 了,这种场景还坚持 HTTP 就是作死了。

如果非要用 HTTPS,有没有降低带宽占用的方案?

其实还是有一些技巧可以减少 HTTPS 的流量消耗,下面简单分享几个实用的做法:
  1. 减少连接重建:可以用 HTTP/2 或者 HTTP Keep-Alive 来减少握手频率,让连接复用,不必每次请求都重新握手。代码如下:
    import requests

    session = requests.Session()
    session.keep_alive = True  # 开启 Keep-Alive
    response = session.get("https://example.com")
    这样复用连接之后,后续的请求会减少握手过程,带宽也能省不少。
  2. 启用 TLS Session Resumption:在服务器端配置 TLS 会话恢复(Session Resumption),这样客户端在短时间内的重复访问可以复用以前的会话信息,从而避免重新握手。比如 Nginx 配置里可以加上:
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    这样可以存储会话信息,复用后续请求的 TLS 连接,减少握手的带宽开销。
  3. 压缩 HTTPS 请求:虽然 TLS 本身已经有压缩算法,但在数据较大的情况下,还是可以进一步用 GZIP 压缩来优化传输。常见的 Web 服务器如 Apache、Nginx 都支持设置 GZIP,比如在 Nginx 中可以开启 GZIP:
    gzip on;
    gzip_types text/plain application/json;
    配置完压缩后,传输的数据包大小可以进一步减少,带宽占用也就小一些。
所以这次的案例告诉我们:在高并发的场景下,HTTPS 的带宽占用确实不能忽视。如果你的服务中传输的数据不涉及敏感信息,或许 HTTP 反而是一种更“经济适用”的方案。
当然,如果有安全性要求,那就得选择上面的这些优化方案,让 HTTPS 的成本尽可能降低。
总之,程序员的日常就是在性能和安全之间来回拉扯,有时候还真得灵活应对。也许,下次再遇到类似问题的时候,先想想数据传输的成本,说不定有意想不到的省带宽奇招呢!
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。
🔥东哥私藏精品 热门推荐🔥
东哥作为一名超级老码农,整理了全网最全《Java高级架构师资料合集》
资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。

Java面试那些事儿
回复 java ,领取Java面试题。分享AI编程,Java教程,Java面试辅导,Java编程视频,Java下载,Java技术栈,AI工具,Java开源项目,Java简历模板,Java招聘,Java实战,Java面试经验,IDEA教程。
 最新文章