Notes

TLS 1.3 session resumption, in practice

2026-10-21

A full TLS 1.3 handshake costs one round trip before the client can send application data. On a link with 30 ms of RTT that is 30 ms of dead air per new connection; on a lossy mobile link it can be several hundred. Resumption is supposed to remove that cost, and it mostly does — but the interesting part is what it does not remove.

What resumption skips

With a PSK, the server can skip its certificate and its CertificateVerify signature. For an RSA-2048 key that is a real saving: a single signature verification is measurable, and at high connection rates it shows up as CPU rather than latency. The key exchange itself is also cheaper, since the PSK already carries the shared secret.

What it does not skip

The TCP handshake is still there, and so is the TLS record layer. If a connection is closed after every request, resumption saves the crypto but not the round trip to establish the socket. This is why keep-alive usually matters more than resumption: reusing an existing connection costs zero handshakes.

The other thing resumption does not fix is the ticket key. Tickets are encrypted with a key the server holds; if that key never rotates, an attacker who records traffic and later obtains the key can decrypt past sessions. Rotation every few hours, with the previous key kept around long enough for in-flight tickets, is the usual compromise.

Measuring it honestly

The cheap way to check whether resumption is working is to look at the handshake type on the wire:

openssl s_client -connect example.com:443 -sess_out /tmp/s.pem
openssl s_client -connect example.com:443 -sess_in /tmp/s.pem 2>&1 | head -5

The second invocation should report Reused rather than New. If it does not, the usual causes are a load balancer terminating TLS on a different node than the one that issued the ticket, or a proxy that strips the session ticket extension.

If resumption never hits, the fix is almost never a cipher setting. It is sticky sessions, a shared ticket key, or an intermediary that rewrites the ClientHello.

Takeaway

Turn resumption on, rotate the ticket keys on a schedule, and spend the remaining effort on connection reuse. Most of the latency people attribute to TLS is actually the cost of not reusing a socket.