一句话:"TCP 靠 ACK 确认知道对方收没收到,靠重传保证丢了就重发,靠滑动窗口控制速度不淹没对方,靠拥塞控制不搞崩网络。"
TCP 通过序号 + 确认 + 重传 + 校验 + 流量控制 + 拥塞控制六大机制保证可靠传输,核心是让发送方知道「发了什么、丢了没有、对方收到没有、要不要减速」。
| 机制 | 作用 | 解决的问题 |
|---|---|---|
| 序号(Sequence Number) | 标记每个字节的位置 | 数据丢失/乱序/重复 |
| 确认号(ACK) | 告诉对方"收到哪了" | 丢包检测 |
| 超时重传 | 定时器超时未收到 ACK 就重发 | 丢包 |
| 快速重传 | 收到 3 个重复 ACK 立即重传(不用等超时) | 丢包快速恢复 |
| 校验和(Checksum) | 检查数据完整性(传输中是否出错) | 数据损坏 |
| 流量控制(滑动窗口) | 接收方告诉发送方"我能接多少" | 接收方处理不过来 |
| 拥塞控制 | 发送方根据网络状况调整速度 | 网络过载 |
| TCP | UDP | |
|---|---|---|
| 可靠性 | 可靠(有序号/确认/重传) | 不可靠(发了就不管) |
| 连接 | 面向连接(三次握手) | 无连接 |
| 速度 | 较慢(要确认) | 快(不确认) |
| 场景 | 文件传输、网页、邮件 | 视频直播、DNS、游戏 |
| 滑动窗口 | 拥塞控制 |
|---|---|
| 接收方能力 | 网络能力 |
| 告诉发送方"我能接多少" | 发送方根据网络状况调整 |
| 防止淹没接收方 | 防止搞崩网络 |
| 两个窗口取最小值决定发送速度 |
| 序号(Seq) | 校验和(Checksum) |
|---|---|
| 判断重复/乱序(这个包见过没) | 检查数据完整性(传输中坏了没) |
| 接收方据此丢弃重复包、重排乱序包 | 接收方据此丢弃损坏包 |
| 核心机制 | 辅助校验 |
累积确认(Cumulative ACK):ACK 号表示"该号之前的所有字节都收到了",不用逐包确认。丢一个包只重传该包之后未确认的部分,不是全重传。
| 三次握手 | 四次挥手 | |
|---|---|---|
| 目的 | 建立连接 | 断开连接 |
| 次数 | 3 次 | 4 次 |
| 为什么 | SYN+ACK 合并(两次) | FIN 和 ACK 分开(半关闭) |
| 确认内容 | 确认双方收发能力 | 确认双方都知道连接关闭 |
两次握手的问题:旧的 SYN 延迟到达 → 服务器以为是新连接 → 分配资源等待 → 客户端没发起 → 浪费资源。三次握手让服务器确认客户端能收能发。
为什么挥手四次:TCP 是全双工,一方发 FIN 只表示"我不发了",但还能接收。对方可能还有数据要发,所以 ACK 和 FIN 分开发送(半关闭状态)。
| 相邻概念 | 关系 | 孤立理解会犯的错 |
|---|---|---|
| UDP | TCP 的对照组,UDP 没有序号/确认/重传,所以不可靠但快 | 以为 UDP 一定丢包 |
| 进程 vs 线程 | TCP 连接是进程级别的,线程共享地址空间不涉及 TCP | 把 TCP 连接当线程间通信 |
| 僵尸/孤儿进程 | TCP 连接的进程退出后,连接会关闭;父进程不回收连接资源可能泄漏 | 混淆进程回收和连接回收 |
| 滑动窗口 vs 拥塞控制 | 滑动窗口 = 接收方能力;拥塞控制 = 网络能力。两个窗口取最小值 | 只记一个忘了另一个 |
| 三次握手 vs 四次挥手 | 握手两次合并(SYN+ACK),挥手两次分开(FIN 和 ACK 分开)因为半关闭 | 混淆握手和挥手的次数差异 |
2026-08-26
每主题一页,复习时只翻本目录。