When you run a load test and see transport errors in your report, it's tempting to just look at the percentage and move on. But understanding what happened and why gives you actionable information about your target's health and infrastructure.
Transport errors are fundamentally different from HTTP errors. An HTTP 500 means the server received your request, tried to process it, and failed. A transport error means the connection itself broke — no HTTP response was ever received.
Client ◀── SYN-ACK ─── Server
Client ─── ACK + HTTP GET ─▶ Server
Client ◀── HTTP 200 OK ─── Server ✓ Success
vs.
Client ─── TCP SYN ───▶ Server
Client ◀── RST (Connection Refused) ✗ Transport Error
The Four Transport Errors
The request was sent, but the server didn't respond within the timeout window (default: 2 seconds).
The server actively rejected the TCP connection. No handshake completed.
The server closed the connection abruptly with a TCP RST packet.
The server closed the connection before sending a complete response.
How GoStress Classifies Errors
GoStress categorizes every failed request into one of two buckets:
- HTTP Failures — Got an HTTP response, but the status code is outside the success range (e.g., 500, 503, 429)
- Transport Errors — No HTTP response received at all (the errors described above)
This distinction matters because the remediation is different. HTTP failures usually mean you need to fix application logic or reduce load. Transport errors usually mean infrastructure is at capacity or something crashed.
Interpreting Error Rates
| Transport Error % | Severity | Likely Cause |
|---|---|---|
| 0-5% | Normal | Occasional timeouts under load, expected |
| 5-20% | Moderate | Server approaching capacity, check connection pools |
| 20%+ | High | Server overloaded or infrastructure failure |
When 100% of errors are deadline_exceeded: Your timeout is likely too short for the server's actual response time. Try --timeout 5s or check if the server is experiencing database latency or external service dependencies.
When errors increase over time: This usually means the server is degrading under sustained load — connection pools draining, memory pressure, or thread starvation. Use --ramp to find the exact concurrency where errors start.
Practical Next Steps
When you see transport errors in your GoStress report:
- Check the error type breakdown — The report lists each error type with its count
- Look at when errors started — If they increase over time, it's load-induced degradation
- Compare with latency — High p99 + deadline_exceeded = server is slow, not down
- Reduce concurrency — If errors drop, you found the capacity ceiling
- Check server logs — Transport errors at the client correlate with resource exhaustion at the server
gostress --url https://api.example.com --c 300 --d 60 --ramp 30
# Watch the progress bar — note the concurrency level when errors appear
Test Progress: 15.0% | Concurrency: 90 ✓ no errors
Test Progress: 18.3% | Concurrency: 110 ⚠ first deadline_exceeded
Test Progress: 21.7% | Concurrency: 130 ✗ 3 deadline_exceeded