DNS 重传和超时 PCAP 分析:查找缓慢的解析器、丢失的查询和损坏的响应

如何通过数据包捕获来诊断 DNS 超时、重传、无响应、SERVFAIL、UDP 丢失、TCP 回退、解析器延迟和应用程序延迟。

域名解析超时, DNS重传, 粒子电容分析, 解析器延迟, 数据包捕获, DNS 故障排除

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 -->