1. 重传机制概述:为什么需要重传?

各位同学,咱们开始这门课之前,先聊一个最基础的问题——重传。

说白了,重传就是数据丢了,再发一次。听起来很简单对吧?但我在项目里见过太多人,把重传当成「万能药」。丢包了?重传。延迟高?重传。结果呢?网络反而更堵了。

嗯,这里要搞清楚一件事:重传不是目的,是手段。我们的目标不是「把包重传出去」,而是「让数据可靠到达」。

1.1 为什么需要重传?

网络传输不是完美的。数据包在传输过程中,可能被路由器丢弃、被噪声干扰、被缓冲区溢出挤掉。你想想看,如果发出去一个包,对方没收到,那怎么办?

答案就是:让发送方知道「没收到」,然后重新发一次。

我在一个金融交易系统的项目中遇到过这种情况:交易指令丢了一个包,整个订单就废了。那时候我才真正意识到,重传不是「锦上添花」,而是「雪中送炭」。

核心原因就三个:
  • 物理层不可靠:信号衰减、电磁干扰、线缆故障
  • 网络层拥塞:路由器队列满,直接丢包
  • 接收端处理不过来:缓冲区溢出,数据被丢弃

所以,重传机制存在的意义,就是对抗这些不可靠因素,保证数据最终能完整到达对端。

1.2 重传对网络性能的影响

重传不是免费的。每一次重传,都意味着:

  • 带宽浪费:同样的数据发了两次,有效吞吐量下降
  • 延迟增加:等待重传超时,RTT 被拉长
  • 拥塞加剧:重传的包可能进一步挤占网络资源

我给你们看一个真实数据。这是我之前在一个 CDN 节点上抓到的:

场景 重传率 平均延迟 吞吐量
正常网络 0.1% 20ms 950 Mbps
轻度丢包 2% 45ms 720 Mbps
中度丢包 8% 120ms 380 Mbps
严重丢包 20% 350ms 80 Mbps

看到了吗?重传率从 0.1% 升到 2%,吞吐量直接掉了 24%。这就是为什么我们要精准定位重传原因,而不是盲目重传。

我曾经踩过的坑:

有一次线上故障,重传率飙到 15%。我第一反应是「网络有问题」,结果查了半天,发现是应用层把 TCP_NODELAY 设错了,导致小包堆积触发大量超时重传。所以,重传问题不一定是网络层的锅,应用层、传输层、甚至物理层都可能背锅。

1.3 课程目标与学习路径

这门课的目标很明确:让你能快速定位重传问题,并给出优化方案。

具体来说,学完这门课,你应该能:

  1. 看懂抓包:一眼识别重传、快速重传、SACK 等标志
  2. 定位根因:是丢包?是延迟?是拥塞?还是应用层问题?
  3. 给出方案:调整参数、优化代码、升级硬件,选最合适的
  4. 验证效果:用数据说话,重传率降了多少?延迟降了多少?

学习路径我建议这样走:

  • 基础篇(第1-5章):搞懂重传的底层原理,TCP/UDP/QUIC 的重传差异
  • 工具篇(第6-10章):学会用 Wireshark、tcpdump、iperf 等工具抓包分析
  • 实战篇(第11-20章):真实案例,从金融交易到视频直播,逐个拆解
  • 优化篇(第21-30章):参数调优、协议升级、架构改造,给出可落地的方案
我的个人建议:

别急着跳着看。重传这东西,基础不牢,后面分析案例时会一头雾水。我见过太多人直接跳到「优化篇」,结果连 RTO 怎么算的都不清楚,调参数全靠猜。

好,咱们先看一张图,把本章的知识体系串起来:

重传机制知识体系 为什么需要重传? 物理层不可靠 网络层拥塞 接收端溢出 重传对网络性能的影响:带宽浪费 · 延迟增加 · 拥塞加剧 课程目标:看懂抓包 → 定位根因 → 给出方案 → 验证效果 基础篇(1-5章) 工具篇(6-10章) 实战篇(11-20章) 优化篇(21-30章) 建议按顺序学习,基础不牢后面容易卡住

这张图把本章的核心逻辑串起来了。从「为什么需要重传」出发,到三个根本原因,再到重传对性能的影响,最后落到课程目标和学习路径上。你每次回头看这张图,都能更清楚自己学到哪了。

好,第一章就到这里。记住一句话:重传不是敌人,盲目重传才是。后面我们会一步步拆解,怎么让重传变得「聪明」起来。