TCP 三次握手跟网页速度有什么关系?

HTTP1周前发布 admin
138 0

打开一个网页,你可能觉得”点一下就该出来了”,但在这一瞬间背后,浏览器和服务器之间其实要先”打招呼”,确认彼此都在线、都准备好了,才能开始真正传输数据。这个”打招呼”的过程,就是 TCP 三次握手。

很多人觉得这是底层网络的事,跟前端、跟网页速度没啥关系。但恰恰相反——握手这几毫秒到几十毫秒的开销,在移动网络、弱网环境下,经常是页面”慢半拍”的元凶之一。今天就用大白话把这事儿捋清楚。

先搞懂:三次握手到底在干嘛

TCP 是一种”可靠”的传输协议,发数据之前双方要先确认几件事:你能听到我说话吗?我能听到你说话吗?咱俩都准备好了吗?

具体分三步:

  1. 客户端说:”我要连你了”(SYN)
  2. 服务器说:”收到,我也准备好了”(SYN+ACK)
  3. 客户端说:”好,那我们开始吧”(ACK)

这三步走完,一条 TCP 连接才算真正建立。注意,这时候一个字节的业务数据还没传呢——握手只是”建立信道”,真正的 HTTP 请求要等握手结束之后才能发出去。

关键点:握手要花时间,而且是”跑腿”的时间

这三步不是在本地完成的,每一步都要在客户端和服务器之间跑一个来回。网络里衡量”跑一个来回要多久”的指标叫 RTT(Round-Trip Time,往返时延)

三次握手里,第一步和第二步加起来正好是一个完整的往返(客户端发出 SYN,等到服务器的 SYN+ACK 回来),所以三次握手总共要消耗大约 1 个 RTT,业务数据才能开始传输。

这个 RTT 有多大,取决于物理距离和网络质量:

  • 同一个城市内,RTT 可能只有几毫秒到十几毫秒
  • 跨省或者跨国访问,RTT 可能是几十到上百毫秒
  • 4G/5G 弱信号或者国际链路,几百毫秒也很常见

单看一次连接,1 个 RTT 好像不算什么。但网页加载往往不是”建一次连接”这么简单。

为什么这会拖慢网页:HTTPS 让开销翻倍

现在几乎所有网站都用 HTTPS,而 HTTPS 是在 TCP 握手之上又叠加了一层 TLS 握手,用来协商加密方式、交换密钥。

也就是说,完整的连接建立流程是:

TCP 三次握手(约 1 个 RTT) → TLS 握手(约 1-2 个 RTT,取决于 TLS 版本)

如果用的是 TLS 1.2,通常还需要额外 2 个 RTT;TLS 1.3 优化到了 1 个 RTT,配合 0-RTT 恢复机制甚至可以做到”不用等”。但不管怎么优化,这些握手加起来,往往会让首次连接的建立时间达到 2-3 个 RTT。

举个例子:如果 RTT 是 100 毫秒(比如访问一个物理距离较远的服务器),光是把连接”建立”起来,业务数据还没开始传,用户就已经等了 200-300 毫秒。这还没算上 DNS 查询、服务器处理请求、传输响应内容的时间。

对于追求”首屏秒开”的网页来说,这个开销相当可观。

一个网页要建立”好多次”连接

更麻烦的是,一个网页通常不止请求一次。HTML、CSS、JS、图片、字体、接口数据……如果每一个资源都要重新走一遍”三次握手 + TLS 握手”,那开销会被成倍放大。

好在浏览器和服务器早就在想办法解决这个问题:

  • HTTP/1.1 的 Keep-Alive:同一个 TCP 连接可以复用,发完一个请求不用断开,接着发下一个请求,避免了重复握手。
  • HTTP/2 的多路复用:一个连接上可以同时并发多个请求,不再需要为每个资源单独开连接。
  • HTTP/3(基于 QUIC):更进一步,把传输层从 TCP 换成了基于 UDP 的 QUIC,连接建立和加密协商合并在了一起,进一步压缩了握手带来的延迟,并且解决了 TCP 队头阻塞的问题。

也就是说,”三次握手拖慢网页”这个问题,行业里其实一直在通过协议升级来缓解,核心思路就是:能复用连接就别重新握手,能合并握手步骤就别分开做

那前端和运维能做点什么

虽然握手本身是传输层的事,前端和后端工程师没法直接改协议,但可以通过一些手段减少它的影响:

  • 开启并善用 Keep-Alive / HTTP 长连接,避免重复建连
  • 升级到 HTTP/2 或 HTTP/3,减少并发请求需要的连接数
  • 使用 TLS 1.3,减少加密握手的往返次数
  • 用 CDN 就近部署,把服务器物理距离拉近用户,直接降低 RTT
  • 减少不必要的第三方域名请求,因为每多一个域名,往往意味着多一次独立的握手过程
  • DNS 预解析、预连接(dns-prefetchpreconnect),让握手提前在浏览器空闲时完成,而不是等用户点击才开始

这些手段单独看可能都不起眼,但叠加起来,往往能省下几十到上百毫秒的白屏时间——对于用户体验而言,这是能被明显感知的差别。

小结

三次握手看着是个很”底层”、很”网络”的知识点,但它跟每一次网页打开的体验都息息相关。简单说就是:

  • 握手是”建立信任”的过程,业务数据得等它走完才能传
  • 握手要消耗真实的网络往返时间(RTT),而且 HTTPS 会让这个开销叠加
  • 一个网页需要的连接越多,握手的开销就被放大得越明显
  • 复用连接、升级协议、缩短物理距离,是缓解这个问题的核心思路

理解这一层,再回头看”网页为什么慢””为什么要上 CDN””为什么 HTTP/2 更快”,很多事情就说得通了。

© 版权声明

相关文章

暂无评论

none
暂无评论...