跳转至

02. 网络进阶:重传、拥塞控制、长连接、WebSocket(深挖版)

如果说上一章更偏"网络基础面试必答题",这一章更像二面三面常见的追问区:

  • TCP 丢包后到底怎么重传?
  • 拥塞控制和流量控制到底差在哪?
  • 长连接是不是只有好处没有代价?
  • HTTP/2 已经多路复用了,为什么还会卡?
  • WebSocket 和 HTTP、TCP 各是什么关系?

这些问题最怕答成术语堆砌。真正有说服力的回答,应该能把"机制、触发条件、收益、代价"串起来。

本章建议按“先理解知识主线,再练问答表达,最后吃透边界条件”的顺序阅读:

  • 先把TCP 重传机制、拥塞控制、慢启动
  • 再展开长连接/短连接、HTTP 版本差异、队头阻塞、WebSocket
  • 最后把HTTP/2 多路复用原理、QUIC/HTTP/3、长连接工程判断

先把这一章的知识骨架搭起来

这章是在前一章基础上继续追问:连接建立之后,数据在不稳定网络中究竟怎样被重传、限速、复用和长期维护。所以重传、流量控制、拥塞控制、长连接、HTTP/2、WebSocket 看似跨越 TCP 和 HTTP,实际上都在围绕“高效又稳定地传输数据”展开。

读这章时,可以先把问题分成三类:第一类是“包丢了怎么办”,对应超时重传、快速重传、滑动窗口;第二类是“网络和接收方承受不了怎么办”,对应拥塞控制与流量控制;第三类是“连接要长期复用怎么办”,对应 keep-alive、HTTP/2 多路复用、WebSocket 持久双向通信。

这样你既能答网络机制,也能落到服务性能与用户体验。


第一部分:先把概念和主线讲清楚

进入问答前,先把最小前置知识补齐

这一章是在前一章基础上继续深挖“连接建立以后,数据如何稳定高效地传”。因此要先把三个问题分清:包丢了怎么办、接收方或网络扛不住怎么办、连接要长时间复用怎么办。

超时重传和快速重传回答的是“数据丢了怎么办”;滑动窗口和流量控制回答的是“接收方处理不过来怎么办”;拥塞控制回答的是“整个网络扛不住怎么办”;长连接、HTTP/2 多路复用和 WebSocket 则在处理“同一条连接如何反复复用”。

把这三层看清楚,后面的细节才不容易混。


1. TCP 重传机制有哪些?

标准回答

常见包括:

  • 超时重传(RTO)
  • 快速重传(收到多个重复 ACK 时触发)

更深入的理解

TCP 不可能假设网络永不丢包,所以它必须在"包可能丢、ACK 可能丢、时延可能抖动"的情况下,尽量恢复可靠传输。

重传的核心问题不是"会不会重发",而是:

  • 什么时候判断该重发
  • 重发哪一段
  • 如何尽量别把网络打得更堵

1.1 超时重传(RTO)

如果发送方在一定时间内没有收到 ACK,就会认为对应数据可能丢失,触发重传。

为什么 RTO 不能设死?

因为网络 RTT 是动态变化的:

  • 太短:容易误判,导致不必要重传
  • 太长:恢复太慢,吞吐受影响

所以 RTO 通常会基于历史 RTT 估算动态调整。

1.2 快速重传

如果发送方连续收到多个针对同一位置的重复 ACK,通常意味着:

  • 后面的数据到了
  • 但中间某段丢了

这时不必等 RTO 超时,可以提前重传缺失段。

为什么常说"3 个重复 ACK"?

这是经典实现中的经验阈值:

  • 太少可能只是乱序
  • 达到一定重复次数,丢包概率更大

面试高分点

TCP 重传的目标不是"无脑重发",而是在可靠恢复和避免额外拥塞之间找平衡。RTO 偏保守,快速重传偏激进,两者是互补关系。


2. 什么是拥塞控制?

标准回答

拥塞控制是 TCP 为防止网络整体过载而采取的一组发送速率调节机制。

为什么它和流量控制不是一回事?

  • 流量控制:别把接收方打爆
  • 拥塞控制:别把网络打爆

流量控制看的是对端接收能力;拥塞控制看的是整条网络路径承载能力。

常见阶段

  • 慢启动
  • 拥塞避免
  • 快速重传
  • 快速恢复

2.1 慢启动

刚开始不知道网络能承受多少数据,所以先小心试探发送速率,然后指数级增长。

为什么叫"慢启动",但增长其实挺快?

"慢"不是指数值增长慢,而是相对于一上来就把链路打满来说,它是逐步探测网络容量。

2.2 拥塞避免

当窗口增长到某个阈值后,不再指数增长,而改为更平缓的线性增长。

目的:

  • 降低一下子冲爆网络的风险
  • 更稳地逼近可用带宽

2.3 快速重传 + 快速恢复

当检测到疑似丢包时:

  • 不一定退回最小发送窗口重新来
  • 而是适度收缩,再继续传

这比"每丢一次就回到原点"更高效。

一句总结

拥塞控制本质是在持续探测网络容量:有余量就加速,疑似拥塞就减速。


3. 为什么丢包不一定等于网络差?

这是很适合拉开理解深度的追问。

原因

丢包可能来自:

  • 网络拥塞
  • 设备缓存溢出
  • 无线链路抖动
  • 校验失败
  • 路由切换
  • 接收端处理不过来

所以:

丢包是现象,不是单一原因。

面试更强表达

不要把"发现丢包 → 一定是网络拥塞"说得太绝对。更准确是:

  • TCP 往往把丢包当作拥塞信号来处理
  • 但现实中丢包成因可能更复杂

第二部分:围绕高频追问继续展开

4. 长连接和短连接区别?

短连接

每次请求都新建连接,用完即断开。

长连接

多个请求复用同一连接,减少握手和挥手开销。

长连接为什么重要?

因为建连和断连都不是免费的:

  • TCP 三次握手、四次挥手有时延
  • TLS 握手也有成本
  • 频繁创建 socket 会增加系统开销

对于高频请求场景,长连接通常能显著改善:

  • 延迟
  • 吞吐
  • CPU 开销
  • 连接管理效率

但长连接不是没有代价

它会引入新的问题:

  • 空闲连接占资源
  • 连接保活与心跳管理
  • 服务端 FD 压力
  • 负载均衡不再"每请求重新分配"
  • 长期连接上的单点抖动更明显

面试高分点

长连接的本质是用"连接常驻成本"换"频繁建连成本下降"。是否划算,取决于请求频率、连接规模和服务端资源上限。


5. HTTP/1.1、HTTP/2、HTTP/3 有什么区别?

HTTP/1.1

  • 文本协议
  • 默认长连接
  • 支持 Keep-Alive 语义
  • 存在应用层队头阻塞问题

HTTP/2

  • 二进制分帧
  • 多路复用
  • 头部压缩
  • 同一 TCP 连接上并发多个流
  • 允许服务端推送(但现实使用有限)

HTTP/3

  • 基于 QUIC(运行在 UDP 上)
  • 把连接建立、可靠传输、加密协商做了更紧密整合
  • 改善 TCP 层丢包导致的跨流阻塞问题
  • 连接迁移更友好

面试最容易说浅的地方

很多人只会说:

  • 1.1 文本
  • 2 多路复用
  • 3 基于 UDP

这不够。更强的说法是:

HTTP/2 主要解决应用层并发复用效率问题,但底层仍受 TCP 队头阻塞影响;HTTP/3/QUIC 则进一步把问题下探到传输层,减少单个丢包对整条连接所有流的拖累。


6. 什么是队头阻塞?

标准回答

队头阻塞指前面的数据包或请求未处理完成,导致后续请求即使准备好了也无法继续处理。

场景区分

6.1 HTTP/1.1 层面的队头阻塞

即使同一连接上后面的请求逻辑上已经准备好了,也可能被前一个响应卡住。

6.2 TCP 层面的队头阻塞

TCP 要保证有序交付。如果前面某段丢了,后面的段即使到了,也不能先直接交给上层完整消费。

为什么这点重要?

因为很多人误以为 HTTP/2 多路复用后就彻底没阻塞了。实际上:

  • HTTP/2 解决了一部分应用层问题
  • 但 TCP 层有序字节流的限制还在

这也是 HTTP/3/QUIC 重要的背景之一。


7. WebSocket 是什么?

标准回答

WebSocket 是在单个 TCP 连接上进行全双工通信的协议,适合实时通信场景,如聊天、推送、实时协作。

它和 HTTP 的关系

  • 建立阶段通常基于 HTTP Upgrade
  • 完成升级后,不再是传统的一问一答式 HTTP 响应模型
  • 连接变成可双向主动收发的持久通道

它解决了什么问题?

传统 HTTP 更适合:

  • 请求-响应
  • 客户端主动拉取

而很多实时场景需要:

  • 服务端主动推送
  • 高频低延迟消息交换
  • 双向通信

这时 WebSocket 更自然。

面试高分点

WebSocket 并不是"替代 HTTP",而是补足 HTTP 在实时双向通信上的不足。


8. WebSocket 和长轮询有什么区别?

长轮询

客户端发请求后,服务端先挂着,等有消息再返回;然后客户端再发下一次请求。

WebSocket

一次建立连接后,双方都能随时发消息。

差异

  • 长轮询本质仍是多次 HTTP 请求
  • WebSocket 是持久双向通道
  • 高并发实时场景下,WebSocket 通常更省开销、更自然

但长轮询也不是完全没价值:

  • 部署更简单
  • 兼容性可能更容易
  • 某些弱实时场景够用

9. 长连接是不是一定比短连接好?

不是。

这是非常典型的面试反问。

长连接适合:

  • 高频访问
  • 实时交互
  • 建连成本高
  • 连接可以被稳定复用

短连接可能更合适:

  • 低频请求
  • 海量客户端但不常活跃
  • 中间网络设备对长连接不友好
  • 业务模型就是轻量短请求

一句总结

连接模型的选择不是教条,而是频率、规模、资源占用和网络环境的综合权衡。


第三部分:把难点、边界和代价吃透

10. HTTP/2 一定比 HTTP/1.1 快吗?

不一定。

虽然 HTTP/2 在大多数现代场景下更先进,但性能表现仍依赖:

  • 请求规模
  • 网络质量
  • 服务端实现
  • 代理链路
  • 是否发生丢包

为什么不一定?

如果场景非常简单:

  • 请求少
  • 连接短
  • 头部很小
  • 网络很好

那 HTTP/2 的协议复杂度未必带来明显收益。

此外,如果单条 TCP 连接丢包明显,HTTP/2 的多个流也会一起受影响。

更强表达

HTTP/2 的优势通常在并发复用和头部压缩上,但它不是在所有小规模场景都无条件碾压 HTTP/1.1。


11. QUIC / HTTP/3 为什么更适合移动网络?

原因一:连接迁移更友好

移动网络下,用户可能从 Wi-Fi 切到蜂窝网络,底层 IP/端口发生变化。

传统 TCP 连接对这种变化更脆弱;QUIC 通过连接 ID 等机制让迁移更自然。

原因二:把传输和加密协商整合得更紧

能减少握手时延,改善弱网体验。

原因三:降低跨流相互拖累

某个流出问题,不一定把整条连接上所有流都一起卡死得那么严重。


12. 一组典型追问链

  1. TCP 怎么重传?
  2. RTO 和快速重传分别解决什么问题?
  3. 拥塞控制和流量控制差别是什么?
  4. 为什么网络一丢包,吞吐可能明显下降?
  5. 长连接和短连接各自适用什么场景?
  6. HTTP/2 为什么已经多路复用还会受阻塞影响?
  7. HTTP/3 / QUIC 的核心改进到底在哪?
  8. WebSocket 和 HTTP/长轮询是什么关系?

这条链很适合后端、基础架构、网关、中间件岗位继续往深处问。


13. 一份更像面试现场的总结回答

网络进阶题的关键,不是背出"RTO、快重传、慢启动、HTTP/2、WebSocket"这些名词,而是把它们放回协议设计目标里理解。TCP 重传解决的是在不可靠网络里恢复可靠传输,拥塞控制解决的是别把整个网络打爆,长连接解决的是频繁建连成本,HTTP/⅔ 则是在并发复用和阻塞控制上持续演进。WebSocket 的价值也不是替代 HTTP,而是提供更适合实时双向交互的通信模型。真正好的回答,是既能说清机制,也能说清代价和适用边界。


14. 复习建议

如果你想把这一章练到能扛追问,至少做到:

  • 能解释 RTO 和快速重传的区别
  • 能区分流量控制与拥塞控制
  • 能把长连接的收益和代价都说出来
  • 能讲清 HTTP/2 仍受 TCP 队头阻塞影响
  • 能说明 HTTP/3 / QUIC 为什么出现
  • 能把 WebSocket 放回"实时双向通信"语境里理解

做到这里,这一章就不再只是术语背诵,而是真正开始接近协议理解。