Before your server sees a single byte, three conversations already happened.
| Step | Cost |
|---|---|
| DNS lookup | 1 round trip |
| TCP handshake | 1 round trip |
| TLS handshake | 1–2 round trips |
| Total | ~4 round trips before GET / |
On a 100ms connection, that's 400ms of pure introduction. Your code hasn't run. Your database hasn't been touched.
Then the connection closes and the next request does it all again.
The fix isn't faster code. It's stop reintroducing yourself: keep-alive, connection pools, HTTP/2 multiplexing, TLS session resumption. Pay the setup once, reuse it thousands of times.
This is also why a "quick internal API call" between two of your own services is rarely quick. Every new connection restarts the ritual.
Trivia panel used on the card:
- TLS 1.3 — handshake 1 round trip (from 2 in 1.2); supports 0-RTT resumption for repeat connections
- QUIC / HTTP3 — merges transport and TLS handshakes; fresh connection is 1 round trip, not 3
- Link back — only idempotent requests belong in 0-RTT (see Day 9); 0-RTT is unsafe for non-idempotent requests due to replay risk
