TCP SACK 与 DSACK——诊断丢包和选择性确认重排序
诊断 Wireshark PCAP 中的 TCP SACK、DSACK 和 sack_perm 选项。涵盖选择性确认、数据包丢失恢复、重新排序、重复 ACK 和虚假重传。
当选择性确认可用时,TCP 重传分析会变得更加精确。当跟踪显示重复的 ACK、重传和乱序数据包但根本原因尚不清楚时,用户会搜索“TCP SACK pcap”、“DSACK Wireshark”、“重复的 SACK”、“虚假重传”、“TCP 重新排序与数据包丢失”和“选择性 ACK 数据包捕获”。
PCAP 手术很有用,因为 TCP 选项中包含 SACK 证据。如果删除错误的数据包、丢失握手或将 ACK 与数据分开,诊断就会变得很弱。
SACK 添加了什么
传统的 TCP ACK 确认下一个预期字节。如果一个数据段丢失,但后面的数据段到达,接收方只能继续确认间隙。
SACK 让接收者说:“我仍然错过了这个较早的范围,但我已经收到了这些较晚的范围。”
这有助于区分:
- 实际丢包情况。
- 无序交货。
- 重复的数据包。
- 接收者行为。
- 发件人恢复行为。
SACK 必须协商
SACK 能力是在 SYN 和 SYN-ACK 中协商的。如果在握手之后开始捕获,您可能不知道 SACK 是否被允许。
始终保留:
- SYN.
- SYN-ACK.
- SACK 允许的选项。
- 窗口比例选项。
- 时间戳选项(如果存在)。
这就是为什么“重传周围的小 pcap”可能是不够的。
具有 SACK 块的重复 ACK
重复的 ACK 并不都意味着同样的事情。带有 SACK 块的重复 ACK 可以准确地告诉发送方哪些后续字节范围到达。
检查证据:
- 确认号。
- SACK 左边缘和右边缘。
- 重复的 SACK 块。
- 新的 SACK 信息。
- 稍后是否会出现丢失数据。
- 重传是否填补了空白。
这比仅仅计算重复的 ACK 强得多。
数据包丢失与重新排序
如果一个数据段迟到但没有丢失,SACK 可能会显示较晚的数据已被接收。发送方可能会重传,然后原始数据包也可能到达。这看起来可能很混乱。
问题:
- 原来的路段迟到了吗?
- 重传是否先到达?
- DSACK 后来报告了重复数据吗?
- 是否存在对数据包重新排序的路径?
- 突发是否跨越多个链路、隧道或负载平衡路径?
PCAP 手术可以帮助隔离确切的序列范围并比较数据包顺序。
DSACK 是什么意思
重复 SACK 可以报告收到重复数据。这对于识别虚假重传或重新排序很有用。
DSACK 证据可能表明:
- 发件人不必要地重传。
- 网络延迟传送原始数据。
- 捕获点看到重复项。
- 接收方收到原始字节和重传字节。
- 中间盒重复数据包。
这与“数据包丢失”是不同的结论。
虚假重传
重传并不总是丢失的证明。它可能由以下因素触发:
- Reordering.
- 延迟 ACK 行为。
- 捕获卸载工件。
- 重传超时时间太小。
- ACK 压缩。
- 虚拟化时序。
- 路径不对称。
SACK 和 DSACK 有助于证明数据是否确实丢失或只是延迟。
占领点很重要
如果 pcap 是单向的或在 NAT 之后进行,则 SACK 解释可能会很棘手。数据包可能不存在于您的捕获点,但存在于接收器处。
有用的做法:
- 比较发送方和接收方的捕获。
- 保持时间戳同步。
- 保留序列号。
- 避免修剪仅 ACK 数据包。
- 记下卸载和捕获位置。
没有 ACK 数据包的 SACK 分析就不是分析。
调试清单
使用此工作流程:
- 保持 TCP 握手。
- 确认允许 SACK。
- 找到第一个重复的 ACK。
- 解码 SACK 块。
- 将 SACK 范围映射到数据包。
- 识别重传的序列范围。
- 检查 DSACK。
- 将损失与重新排序分开。
- 检查捕获点并卸载上下文。
- 保留恢复事件前后的数据包。
最终诊断
TCP SACK 和 DSACK 为数据包丢失、重新排序、重复传送和虚假重传提供了精确的证据。关键是保留握手选项、仅 ACK 数据包、SACK 块和重传序列范围。
PCAP 手术有助于保持证据完整,因此 TCP 丢失分析可以超越一般的重复 ACK 计数。