DNS 重传和超时 PCAP 分析:查找缓慢的解析器、丢失的查询和损坏的响应
如何通过数据包捕获来诊断 DNS 超时、重传、无响应、SERVFAIL、UDP 丢失、TCP 回退、解析器延迟和应用程序延迟。
DNS 故障通常伪装成应用程序故障。浏览器显示无法访问某个站点。 API 客户端显示超时。服务在打开连接之前需要五秒钟的时间。用户搜索“DNS 超时 pcap”、“DNS 重传 Wireshark”、“DNS 查询无响应”、“DNS 解析器数据包捕获缓慢”和“SERVFAIL 与超时”,因为可见错误很少解释是否名称解析失败、解析器缓慢或网络丢失数据包。
如果您保持 DNS 查询、响应、计时、重传和回退行为完好无损,则数据包捕获可以准确地回答这个问题。
PCAP 手术很有用,因为 DNS 证据通常埋藏在大痕迹中。您可能需要隔离一个客户端、一个解析器、一个域和一个时间窗口,同时保留时间戳和请求 ID。
健康的 DNS 交换是什么样的
基本的 UDP DNS 交换很短:
Client -> Resolver: Query A example.com
Resolver -> Client: Response A example.com 93.184.216.34
The important fields are:
DNS timeout vs DNS error
Retransmission and retry behavior
A trace may show:
0.000 Client -> 8.8.8.8 Query example.com
1.000 Client -> 8.8.8.8 Query example.com
2.000 Client -> 1.1.1.1 Query example.com
2.030 1.1.1.1 -> Client Response example.com
这表明第一个解析器没有及时响应,而第二个解析器则及时响应。应用程序延迟包括等待第一个解析器所花费的时间。
丢失查询与丢失响应
对于一个捕获点,您可能不知道查询或响应是否丢失。捕捉位置很重要。
如果您在客户端上捕获并看到查询离开但没有响应到达,则响应可能已丢失、被阻止、延迟或从未生成。如果您在解析器上捕获但从未看到查询,则查询在到达解析器之前已丢失或在路径上被阻止。如果解析器看到并回答查询,但客户端从未看到响应,则损失发生在返回路径上。
有两个捕获更强:
- 客户端捕获
- 旋转变压器端捕获
它们一起可以证明数据包是在解析器之前、解析器之后还是在客户端主机内消失。
UDP 碎片和大型 DNS 响应
由于 DNSSEC、许多记录、TXT 记录或 EDNS0 缓冲区大小,DNS 响应可能会变得很大。大型 UDP 响应可能会分段。碎片可能无法跨越防火墙或 NAT 设备。
症状包括:
- 小型 DNS 查询有效。
- 大量响应超时。
- DNSSEC 域失败的频率更高。
- TCP 回退成功。
- 带有截断位的响应会导致通过 TCP 重试。
如果解析器设置了截断位,则客户端可以通过 TCP 重试。这是正常的。如果 TCP 回退被阻止,用户可能会看到 DNS 超时或间歇性故障。
基于 TCP、DoT 和 DoH 的 DNS
经典 DNS 使用 UDP 和 TCP 端口 53。现代环境可能使用基于 TLS 的 DNS 或基于 HTTPS 的 DNS。正常的数据包捕获可能不会暴露加密 DNS 的域名,但它仍然可以显示时间、连接、重试和服务器可达性。
分析应用程序延迟时,首先确定使用哪个解析器路径。浏览器可以使用 DoH,而系统工具则使用操作系统解析器。这可以解释为什么“nslookup”可以工作但浏览器失败,或者为什么一个应用程序很慢而另一个应用程序却不慢。
搜索域和重复查询
企业和 VPN 环境通常会附加搜索域。对“service”的简单查找可能会产生如下查询:
service.corp.example.com
service.office.example.com
service
Checklist for DNS PCAP analysis
Use this process:
Final diagnosis
<!-- pcap-localized-evidence-foundation-v1:start -->用数据包证据回答“DNS 重传和超时 PCAP 分析:查找缓慢的解析器、丢失的查询和损坏的响应”
直接答案是:分析器 label 或应用消息不能单独确定原因。应从 capture point 与 flow direction 开始,证明最后成功的 protocol boundary 和首个失败 boundary。另一位 reviewer 必须能找到支撑句子的 packet、gap 或 interval,并知道什么证据可以否定判断。
把抓包放到路径地图上
记录 client、server,以及中间的 proxy、load balancer、NAT 或 firewall。写明 interface、位置、clock、OS 和可见方向。client 附近的 capture 证明什么到达 client,但不能证明 server 没发送;server 附近只证明该位置的出口。对比两个观察点前,修正 clock offset,并按 flow tuple、TCP sequence 或 transaction ID 对齐。
检查 snap length、dropped packets、offload、capture filter、ring buffer 和开始时间。host 上的 bad checksum 可能是 offload artifact。大 segment 可能来自 GRO/TSO,并非 wire 上的一个 packet。有限文件里缺少 packet,不能在证明观察点本应看到它之前写成 network loss。
按顺序读取边界
| 边界 | 成功证据 | 有效失败证据 |
|---|---|---|
| Link/IP | direction、addresses、route 一致 | ARP/NDP 缺失、ICMP、MTU、asymmetry |
| TCP | SYN、SYN-ACK、ACK、sequence 正确 | retransmission、RST、zero window、timeout |
| TLS | ClientHello、ServerHello、handshake 推进 | alert 或 SNI/ALPN/certificate boundary |
| Application | 完整 request 与对应 response | status、gap 或提前 close |
| User | response time 或 failure window | stall 对应已证实边界 |
在第一个没有成功证据的边界停止。TCP 未建立时不要先解释 HTTP。request 到达 proxy 却未出现在 upstream,边界位于 proxy 或其路径;upstream 已收到但 timeout 前没有 response,应通过 ACK 与 bytes 推进区分 application delay 与 network loss。
分开 observation 与 hypothesis
observation 可以指到记录:“client 发送到指定 sequence,sender 重复同一 segment 三次,本观察点没有出现推进 ACK。”hypothesis 是“路径丢失 segment”。另一位置的 capture 或 dropped records 可能否定它。为每个假设写一项支持证据与一项反证。
retransmission 或 duplicate ACK 不能自动分配责任。reordering、loss、capture artifact、receiver delay 会产生相似 label。关联 direction、sequence、ACK、SACK、RTT、window 与 application timing。DNS/DHCP 对齐 transaction ID 与 attempts,HTTP 对齐 request/response,TLS 对齐 handshake direction。
编辑前保全原件
计算 original checksum,并保持原件不变。filter、trim、redaction 在 working copy 上完成。记录 input、operation、时间、前后 packet count、output checksum 与理由。timestamp rewrite 或删除 packets 后,该副本不再适合某些 timing 或 sequence 结论。
addresses 与 identifiers 使用一致 aliases,保持 endpoint 可追踪。不能删除判断所需的 port、direction、length。secret mapping 单独保存。通过抓取与导出范围和 PCAP Surgery 概览检查派生文件。
发布前 QA
title 与 answer 是否回答同一 flow?每个 duration 是否写明 clock 与观察点?首个 failure boundary 是否明确?有没有 alternative explanation?复测是否只改一项?original 是否保留?限制结论:“该文件证明指定 interval 的 client 附近行为,不证明 server 内部执行。”
Semrush 验证的一般词 PCAP analyzer 只由产品页负责。技术博客保持自身问题,不编造 volume 或 KD。
<!-- pcap-localized-evidence-foundation-v1:end --><!-- pcap-localized-flow-verdicts-v1:start -->flow 台账与排除实验
围绕“DNS 重传和超时 PCAP 分析:查找缓慢的解析器、丢失的查询和损坏的响应”为每个方向建立一行:endpoint aliases、首末 packet、已发送和已确认 bytes、resets、retransmissions、requests、responses。相同 hostname 不等于同一连接,source port、开始时间、TCP initial sequence 用于区分 sessions。经过 NAT 或 proxy 时记录 flows 的对应关系,不期待 sequence 或 ports 相同。
计算 TCP,不数 labels
追踪 receiver 的 next expected sequence。payload 按长度推进 sequence,SYN 与 FIN 也各占一个编号。较高 segment 到达后持续 Duplicate ACK,支持 loss 或 reordering。SACK blocks 说明哪些 ranges 到达,但不能证明丢失位置。sender 侧看到 retransmission 而 receiver 侧没有,应检查中间 path;sender capture 连 original 都没有,应检查 capture loss 或 offload。
区分 duplicate ACK 后的 fast retransmit 与沉默后的 RTO。比较事前 RTT、advertised window、zero-window probes、burst 与 transfer size。overlap、spurious retransmission、从 flow 中段开始抓取都会改变 analyzer label,label 数量不等于 loss 数量。
用边界测量时间
使用 request first byte、request complete、response first byte、response complete。TTFB 不自动等于 server time。response 前 retransmission 可能增加 network delay;request 已完整 ACK 后长时间沉默更支持 application wait。写明数值、unit、clock、point。
两个观察点先在双方向匹配特征 packet,估算 offset,再使用各文件内部 intervals。clock 不确定时给 range。成功与失败 window 应保持相近 duration 与 load。
协议专项问题
DNS 检查 ID、name、type 与 retry resolver;DHCP 检查同一 client identifier 的 Discover/Offer/Request/ACK;TLS 找各方向最后 handshake message 与 alert;HTTP 识别 4xx/5xx 生成者及 upstream flow;TCP close 识别 FIN/RST sender 与未 ACK bytes。
决定性实验与交付
选择两个竞争 hypothesis 和一个区分实验。另一端 capture 区分 network loss 与 measurement loss;test 中关闭 offload 检查 artifact;固定 path 发送相同 request 检查 intermittency;upstream log 对照 packet boundary 检查 application delay。执行前先写预期。
reviewer 能用 metadata 重复计算、找到同一 boundary 并理解限制,才算验收。交付 original/derived checksums、filter、packet ranges、trim/redaction 操作,以 owner、next action 和可测量 close 条件结束。
<!-- pcap-localized-flow-verdicts-v1:end -->