Network Test Guide
A reference for the desktest.net Network Test. This is a reachability check, not a speedtest. It confirms the browser is online, that DNS resolves, that public HTTPS endpoints answer, and that a WebSocket upgrade is allowed through the local egress path. Use it to triage "page won't load" tickets before you blame the app.
What does the Network Test check?
The tool does not measure throughput. It answers a narrower question: can this browser, on this workstation, on this network, actually get out? Three steps run in order:
- Browser-reported connectivity. Reads
navigator.onLinefor the basic up/down signal, plus the Network Information API (navigator.connection) for effective type, downlink Mbps, and RTT hint. Chromium browsers expose the connection API; Firefox and Safari do not. - DNS and HTTPS reachability. Probes five public endpoints in parallel, each with a 5 second timeout: no-cors GETs to
cloudflare.com,google.com,1.1.1.1(a raw IP, so it still works when DNS is down), andmicrosoft.com, plus a real DNS-over-HTTPS query todns.googlewhose JSON answer is actually read. Spreading across providers reduces the odds that one allow-list covers them all. Per-target RTT is captured via the Performance API. Separately, a readable check against the site's own Cloudflare Worker (echo.desktest.net) confirms genuine reachability (a captive portal or TLS-intercepting proxy block page cannot forge its JSON reply) and reports the egress IP and Cloudflare edge. - WebSocket upgrade. Opens a single
wss://connection toecho.desktest.net, sends a token, waits for the echo, 8 second timeout. Many corporate firewalls allow HTTPS but drop the WebSocket upgrade frame. Slack, Teams, Zendesk, and most remote-deposit pages all need this to work.
When should I run this?
- Page-won't-load triage. User says "the app is down." Run this first. If steps 2 or 3 fail, it is the network, not the app.
- Isolating local Wi-Fi from a real internet outage. Step 1 fail means the workstation is not on a network. Step 1 pass + step 2 fail means the workstation thinks it has a network but cannot reach anything public.
- Verifying DNS. Zero of 5 targets responding is almost always DNS, a captive portal, or a misconfigured proxy.
- After a corporate proxy change. Run this from a workstation in the affected segment before users start filing tickets.
- Before a remote-deposit session. Remote-deposit pages need a long-lived WebSocket. If step 3 fails here, the deposit will not work later.
Reading the results
Each step renders a row with a status badge: Pending (grey), Running (yellow), Pass (green), or Fail (red). Step 2 also shows a per-target table with host, status, and RTT in milliseconds as each probe lands.
The verdict panel at the top summarises the run with a likely cause and a recommended next step. It reflects the common real-world reason for each failure. If the verdict does not fit your case, the expanded fix block under the failing row covers the rest.
Copy Diagnostic Report copies a plain-text report: timestamps, user agent, connection-API readout, every probe target with its RTT or error, the WebSocket open and echo timings, and the overall verdict. Paste it into a ticket or an email to the network team.
Common failures and fixes
Each failure path produces a specific named diagnosis. Each diagnosis maps to a concrete fix. They are listed below in the order they appear in the run.
offline: navigator.onLine is false
The browser reports no network. The workstation is not on Wi-Fi or ethernet, or it is in airplane mode. Step 2 and 3 will almost certainly fail too, so the run stops here.
- Look at the Wi-Fi or ethernet icon in the system tray (Windows) or menu bar (macOS). It should not show a disconnect or warning glyph.
- Toggle airplane mode off if it is on.
- Unplug and replug the ethernet cable. For Wi-Fi, forget the network and re-join.
- If still offline, reset the network adapter from an admin command prompt:
ipconfig /releasethenipconfig /renew. Flush the resolver cache too:ipconfig /flushdns. - Re-run the Network Test once the tray icon shows connected.
slow-connection: effective type is 2g or slow-2g
The Network Information API reports the link is measurably slow (cellular 2G class). Reachability below may pass, but normal web apps will feel unusable. This warning fires when effectiveType is 2g or slow-2g.
- Move closer to the access point, or switch from Wi-Fi to wired.
- Check if a tethered phone or weak hotspot is the active connection.
- If this is the only connection available, expect timeouts on heavier apps. There is no fix at the browser layer.
dns-failure: zero of 5 targets responded
None of the five public endpoints answered. Either DNS resolution is failing entirely, or every outbound HTTPS request is being blocked. Both look identical from inside the browser.
- From a command prompt:
nslookup cloudflare.com. If that fails too, DNS is the problem. Try setting the workstation's DNS to1.1.1.1or8.8.8.8temporarily. - Flush the DNS cache:
ipconfig /flushdns. - Open
https://www.cloudflare.comin a regular tab. If it errors, the workstation has no working HTTPS egress at all. - On corporate Wi-Fi, check for a captive portal that has not been signed in to. Open any plain HTTP site to trigger the redirect.
- If a VPN is connected (Cisco AnyConnect, GlobalProtect, Zscaler ZIA tunnel), disconnect and re-test. A half-up VPN often kills all egress.
- Check antivirus or endpoint protection logs (Sophos, CrowdStrike, SentinelOne) for blocked HTTPS connections.
partial-reach: 1 or 2 of 5 targets responded
Some endpoints reached, others did not. This is the signature of a corporate proxy or content filter with an inconsistent allow-list. It lets through what it knows about and drops the rest. Whatever the user was trying to open is probably on the blocked side.
- Note which targets passed and which failed from the per-target table. That list is the evidence you hand the network team.
- A TLS-intercepting proxy (Cisco Umbrella, Sophos, Fortinet, Zscaler, Netskope) may be rejecting unrecognised destinations on category grounds.
- Ask whoever runs the network for the egress allow-list and confirm whether the target app's hostnames are on it.
- Confirm whether the workstation is going through the corporate proxy at all.
netsh winhttp show proxyon Windows shows the system-wide proxy setting.
websocket-blocked: WebSocket upgrade rejected
Step 2 passed (HTTPS works) but step 3 failed. The TCP and TLS handshake to echo.desktest.net completed, but the WebSocket upgrade either never finished or was dropped. Common on stricter Fortinet, Sophos, Palo Alto, and Netskope rulesets that do not pass HTTP upgrade frames by default.
- Have the network team allow
wss://upgrades on the egress rules used by this workstation segment. - If a TLS-intercepting proxy is in the path, confirm it is configured to handle the WebSocket protocol rather than terminating at the first 101 response.
- Check endpoint protection for "deep packet inspection" on outbound 443 that may strip the upgrade.
- Disconnect any active VPN and retest. Some split-tunnel configs send 443 fine but route WebSocket through a slower inspection chain that times out.
high-latency: average RTT above 800 ms
Reachability is fine but the link is slow enough that normal web apps will feel sluggish. The threshold (800 ms average across the five passing targets) is well outside the expected range for a healthy wired or Wi-Fi connection.
- Switch from Wi-Fi to wired if possible.
- Move closer to the access point.
- If on a VPN, disconnect and retest. A satellite or trans-continental VPN egress easily adds 600 ms.
- If the wired link is also slow, contact the ISP or check for a saturated upstream.
aborted: run cancelled
The run was cancelled before completing, usually because the user clicked Reset or closed the tab. Not a real failure. Re-run the test.
For IT admins
The test page itself has to load through whatever corporate proxy sits between the user and the public internet. If the page does not load at all, allow desktest.net through the edge first. The page has no third-party scripts, no analytics, and no fonts loaded from a CDN, so there is nothing else to allow-list for it to render.
The diagnostic probes five fixed hosts. If your egress is strict allow-list, all five must be reachable for a clean pass:
www.cloudflare.com(Cloudflare CDN)www.google.com(Google CDN favicon)1.1.1.1(Cloudflare DNS-over-HTTPS host)dns.google(Google DNS-over-HTTPS)www.microsoft.com(Microsoft CDN favicon)echo.desktest.net(desktest.net's own WebSocket echo Worker, port 443,wss://)
To run an egress test from a specific workstation segment, open this page from a workstation in that segment. The per-target table shows exactly which hosts the segment's egress allows. The diagnostic report you can copy from the page is a paste-ready record for change tickets.
Known behaviours by product:
- Cisco AnyConnect with strict tunnel-all will route everything through the corporate egress. A half-up tunnel commonly breaks DNS while leaving the routing table claiming the link is up. Re-test after a full disconnect/reconnect.
- Zscaler ZIA by default categorises every public destination. Unknown CDNs may get a SSL inspection block. Cloudflare and Google are usually on the default allow list; Microsoft is too; the WebSocket echo host is not, and will need to be added if you want this exact test to pass.
- Netskope behaves similarly to Zscaler; the WebSocket echo host typically needs an explicit policy entry.
- Cisco Umbrella at the DNS layer can block the test by category (categorising
echo.desktest.netas "Computers and Internet" but with a more restrictive sub-policy).
The Network Test does not require any extra CSP entries on your end. The page's own CSP already permits the probe targets, so it works behind a permissive proxy without complaint from the browser console.
Behind the scenes
The HTTP step uses fetch() with mode: 'no-cors'. That mode gives back an opaque response: the browser will not let JavaScript read the status code, headers, or body, but the fetch promise still resolves on a successful TCP and TLS handshake plus a valid HTTP response. Resolution is treated as "host answered." Each probe is wrapped in an AbortController with a 5 second timeout, and per-target timing is taken from performance.now() deltas around the fetch call.
The WebSocket step opens one wss:// connection, sends the literal string desktest-net-ping, and waits for an inbound message containing that exact token. The echo Worker sends back exactly what it receives; the token filter accepts the matching echo (and would still skip a connect-time greeting from any other echo backend). Open handshake time and end-to-end echo time are reported separately so you can tell a slow TLS open from a slow echo path.
No payload data leaves the browser except the literal ping token. There is no telemetry to desktest.net, no analytics beacon, and the target endpoints see only an opaque GET (for HTTP probes) or the ping string (for the WebSocket). View the page source to confirm the target list.
Related
- Network Test - the diagnostic itself
- Browser Test Guide - what the browser supports and reports
- Sitelink Test Guide - end-to-end reachability for a specific URL
- About desktest.net
- desktest.net home