Sunday面试指南

TCP 超时重传和快速重传有什么区别?SACK 为什么能减少重复发送?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:TCP 怎么知道需要重传?

🙋‍♂️ 我:对方没有收到数据,就会让发送方再发一次。

🧑‍💻 面试官:对方什么都没收到,怎么立即告诉你“没收到”?如果只是 ACK 丢了呢?

🙋‍♂️ 我:发送方得根据确认和计时判断,不是直接知道接收现场。

🧑‍💻 面试官:中间少了一段,后面的数据到了,重复 ACK 能告诉你什么?SACK 又多告诉了什么?

发送方判断的是「哪些数据还没得到确认」,不是拥有接收端的全知视角。

面试速答(60 秒版)

TCP 用字节序号和确认维护可靠传输。发送后没有在重传计时器规定的时间内得到相应确认,可以触发超时重传;超时可能来自数据丢失,也可能是确认丢失或延迟。

经典快速重传利用重复 ACK 作为缺口线索。收到符合条件的三个重复 ACK 后,可以在计时器到期前重传疑似缺失段,但重复确认本身不严格证明一定丢包,乱序也可能造成类似信号。

累积 ACK 主要表示连续数据已经收到哪里;协商后的 SACK 还能报告已经收到的非连续字节区间,帮助发送方识别缺口、减少不必要重发。

实际系统的丢失恢复还有其他改进,不能把经典规则当成所有实现唯一策略。同时,TCP 确认不是业务成功确认,应用超时后的写操作重试仍需幂等设计。

TCP 按确认线索恢复

知识点详解:中间一段没到,后面几段却先到了

ACK 报的是下一个期待字节,不是消息编号

先用一个简化例子:发送五段等长数据,字节区间依次是 [100,200)、[200,300)、[300,400)、[400,500)、[500,600)。

区间右端不包含在内。接收端收到 [100,200) 后,期待下一个字节 200,可以发 ACK=200。

这里的 200 是字节序号,不是“第 200 条业务消息”。TCP 不负责给应用消息划边界,拆帧问题在已有题目中另讲。

现在假设 [200,300) 丢了,后面三段却陆续到达。连续数据仍停在 200 前,接收端不能因为看见最后一段,就把缺口假装填上。

重复 ACK,把缺口线索带回发送方

每次收到后续乱序段,接收端可以继续告知目前期待 200。发送方看到重复的 ACK=200,就知道连续确认没有向前推进,但后续数据仍在到达。

经典 RFC 5681 快速重传以三个符合条件的重复 ACK 作为丢失线索,不必一直等 RTO 到期。

这里有个容易数错的地方:确认第一段的 ACK=200 是首次确认。后面三个乱序段各自引出的 ACK=200,才是三个重复 ACK,不能把第一次也算进去。

乱序、重复数据或 ACK 复制,也可能造成重复确认,所以这是恢复算法的判断规则,不是对网络现场的绝对证明。

缺了 200,后面到了也不能跳过

没有足够后续数据,快速重传也可能等不到

假设丢掉的是最后一段,后面没有更多数据到达接收端,就可能没有足够重复 ACK 作为快速重传触发信号。

此时,超时重传仍然重要。它根据未被确认的数据和计时器推进恢复,而不是要求接收端主动知道发送方还有哪段丢了。

RFC 6298规定了 RTO 的计算与退避。它不是所有连接统一写死的一秒循环;需要结合往返时间测量及其变化,连续超时时还会退避。

ACK 丢了也可能让发送方重传已经到达的数据。接收端按序号识别重复,不需要把相同字节作为另一份新应用数据交付。

SACK 多带了一张“已收到区间”的清单

在中间缺 [200,300)、后面 [300,600) 已经到达时,仅有累积 ACK=200,主要说明连续确认停在哪里。

如果两端按约定启用 SACK,接收端还可以报告 [300,600) 这段已经收到。发送方因此拥有更具体的信息,能够重点处理缺口,而不是把所有尚未累积确认的数据都当成同样未知。

RFC 2018明确说明 SACK 不改变 ACK 字段的累积含义,它是附加区间信息。不是把 ACK=200 改成 ACK=600,跨过缺失部分。

SACK 的信息也需要实际恢复算法利用。它帮助更准确地判断重发范围,不保证网络再也丢包,也不意味着每次都完全不会重复发送。

ACK 没前进,不等于后面都没收到

快速重传、快速恢复、拥塞控制,不能全叫重发

快速重传回答“何时先重发疑似缺失段”。

快速恢复和拥塞控制还会调整发送节奏,避免在可能拥塞的网络上继续无节制发送。两者有联系,但不是同一动作的两个名字。

现代实现还可能结合其他丢失检测机制。面试如果问经典算法,可以先说明经典三个重复 ACK;如果问 Linux 某版本的实际表现,就要核对该版本、配置和协议选项,不能只背教材输出固定结论。

为什么 TCP 可靠,也不能证明一次订单已经成功?

TCP ACK 说明相应字节在传输层的接收进展,不保证应用已经完成解析、数据库提交或业务处理。

假设客户端已经把请求发出,等待业务响应时超时。可能是服务端没处理,也可能是处理完成后响应延迟或丢失。

因此,应用重复写入需要自己的请求身份和幂等规则。TCP 重传一般负责同一连接的字节恢复,应用重试则可能发起一次新的业务请求,不能把两者混为同一种去重。

面试官继续追问

没收到 ACK,就表示数据一定丢了吗?

不一定。数据、ACK 或路径延迟都可能影响确认。发送方按已有信号处理未知状态。

三个重复 ACK 是所有 TCP 实现唯一重传条件吗?

不是。它是经典快速重传规则。实际恢复机制还受实现版本和协商能力影响。

SACK 可以解决粘包吗?

不能。它帮助传输层报告收到的字节区间,不提供业务消息边界。应用仍需自己的帧格式。

面试速记卡

  • 序号:TCP 按字节跟踪,ACK 表示下一期待字节。
  • 超时重传:等待确认到期后恢复,RTO 根据测量并可退避。
  • 快速重传:经典规则利用三个重复 ACK 提前识别缺口。
  • SACK:补充已收到的非连续区间,不改变累积 ACK。
  • 业务边界:传输确认不等于处理成功,应用重试另需幂等。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历