VisualEther Case Study · Web Performance

QUIC & TCP Retransmissions·Noisy Google Capture

Authoring explore/sessions FXT + hosts.txt for a mixed DNS / TLS / QUIC / HTTP-3 / HTTP-2 browsing capture, coalescing IPv4 and IPv6 onto single lifelines, then tracing every TCP and QUIC retransmission back to the server behind it.

Pcap: www.google.com.pcapng
01UserAuthor FXT + hosts.txt

Generate explore.fxt.xml, sessions.fxt.xml and hosts.txt from www.google.com.pcapng.

(mid-task) Consider coalescing the IPv4 and IPv6 axis if they represent the same machine.

02ClaudeCombine samples & render

Capture: 1,388 packets. analyze_capture detected 11 protocols — DNS, TLS, QUIC, HTTP/3, HTTP/2, mDNS, LLMNR, NetBIOS-NS, ARP, TCP, IPv6 — with a sidecar sslkeylog.log for TLS/QUIC decryption. The best single sample (http3) covered only ~82%, so I authored by combining two built-in samples.

FXT composition strategy

Source sampleCovers
http3DNS, TCP, TLS, QUIC, HTTP/3, QPACK, HTTP/2, HTTP/1.x — the dominant browsing traffic
mdns_llmnrmDNS, LLMNR, NBNS, ARP, SSDP — the “noise”

Priority gotcha. mDNS and LLMNR reuse the dns.* field names, so the grafted name-resolution templates run at priority 110 — above the generic DNS templates at 100. Otherwise the unicast DNS Query/Response templates would steal multicast packets and mislabel them. auto-v6="true" auto-generates the IPv6 (udpv6/tcpv6) variants.

Validation & render

FileTemplatesPCAP coverage
explore.fxt.xml10262% (826 frames)
sessions.fxt.xml67 (+6 session types)49%

The uncovered remainder is the high-volume bare QUIC 1-RTT data the templates deliberately skip to keep the diagram readable. Session outcomes from extract_sessions:

TypeOutcomeCount
dns-querysuccess::dns-resolved5
http3-streamsuccess::http3-2xx27
http3-streamincomplete::no-close3
http2-streamsuccess::http2-2xx5
http2-streamincomplete::no-close1
quic-connectionincomplete::no-close4
tcp-connectionsuccess::graceful-fin3
tcp-connectionincomplete::no-close4

Coalescing IPv4 + IPv6 lifelines

The diagram axis groups by the name in hosts.txt, so giving an address pair one name collapses both families into a single lifeline. Three machines appeared under both families:

MachineIPv4IPv6Shared name
Client192.168.0.21fe80::ea41:25df:ab56:5e55Client-PC
mDNS group224.0.0.251ff02::fbmDNS-Multicast
LLMNR group224.0.0.252ff02::1:3LLMNR-Multicast

Finally, materialize_config wrote visualether.toml (TLS keylog + hosts.txt wired in) so a downstream visualether generate needs no flags.

03UserAny retransmissions?

Do we see QUIC and TCP retransmissions?

04ClaudeTCP & QUIC retransmit counts

Yes — both are present. Checked directly with tshark expert-info filters rather than inferred from the diagram.

TCP retransmissions

Framestcp.streamDirectionCount
693, 694, 6951074.125.199.94Client-PC3
(dup-ACK / out-of-order)mixed4

Three back-to-back retransmitted segments on a single Google server stream, plus 4 minor loss-signal frames.

QUIC retransmissions

Five retransmissions — frames 1102, 1103, 1106, 1107, 1260 — detected via Wireshark’s quic.retransmission expert field (which needs the keylog to see into the encrypted stream — which we have).

In the diagrams

  • TCP retransmits render in tangerine (“🔄 TCP Retransmission”, priority 155).
  • QUIC retransmits render at priority 210 — deliberately above HTTP/3 (200) so a retransmitted H3 STREAM frame is classified as a loss event, not normal HEADERS/DATA.
  • Both are bookmark="true", so they show in the bookmark sidebar.

So this is a lightly lossy trace — not a major problem. Want me to pull the SNI / authority behind stream 10 and the QUIC frames so you can see which server/page they belonged to?

05UserWhich servers?

Yes.

06ClaudeMapping loss to hosts

Every retransmission ties back to ancillary content loaded while rendering www.google.com.

TCP retransmissions → www.gstatic.com

TCP stream 10 = Client-PCwww.gstatic.com (74.125.199.94:443), HTTP/2 over TLS (SNI confirmed). Frames 693–695 are three 1412-byte TLS Application Data segments — the bulk body of the gstatic asset responses, i.e. the JavaScript/CSS for Google’s “One Google” top bar:

frame 680 → /og/_/js/k=og.asy.en_US…   (JS)
frame 717 → /og/_/ss/k=og.asy…        (CSS)

QUIC retransmissions → two connections

Mapping each retransmit’s quic.connection.number to its SNI:

FramesQUIC connServer (SNI)Direction / content
1102, 11032ogads-pa.clients6.google.com (142.250.73.106)server → client
1106, 11072ogads-pa.clients6.google.comclient → server; frame 1107 carries the H3 request /$rpc/…AsyncDataService/GetAsyncData
12603play.google.com (74.125.20.101)server → client

Connection 2 (4 of the 5 QUIC retransmits) is the OneGoogle AsyncData gRPC call — gRPC over HTTP/3 to ogads-pa.clients6.google.com that populates the dynamic bits of the One Google bar (account / notifications). Loss hit both directions. Connection 3 is a single retransmit toward play.google.com.

SNI per QUIC connection

ConnSNIServer IPRetransmits
0www.google.com142.251.157.119none
1www.gstatic.com74.125.199.94none (QUIC)
2ogads-pa.clients6.google.com142.250.73.1064
3play.google.com74.125.20.1011

Bottom line

  • Static assets www.gstatic.com over TCP/HTTP-2 — 3 retransmits on the OneGoogle JS/CSS bundle.
  • Dynamic RPC ogads-pa.clients6.google.com over QUIC/HTTP-3 — 4 retransmits on the GetAsyncData call, plus 1 stray to play.google.com.
  • Main page the www.google.com QUIC connection (conn 0) saw no retransmissions at all.

Light, transient loss during a normal page load on the OneGoogle bar machinery — nothing pointing at a persistent problem with any one server.

Method. Configs authored and rendered with VisualEther via its MCP integration with Claude — analyze_capture → author explore.fxt.xml / sessions.fxt.xml from combined samples → extract_endpoints for hosts.txtvalidate_fxtmaterialize_configexplore + extract_sessions. Retransmission counts and host/SNI mapping cross-checked with tshark expert-info and quic.connection.number / tcp.stream queries against the TLS-key-decrypted pcap.