Skip to content
VPNmine
PROTOCOLS

UDP or TCP for a VPN?

Use UDP unless the network forces you not to. A tunnel carried inside TCP stacks two reliability layers, so a single lost packet triggers retransmission at both levels and throughput collapses on a lossy link. TCP mode is a compatibility feature, not a performance option.

4 min read

Illustration of a paper plane and a handshake, joined by a dashed tunnel line on a dark grid.

The choice only exists for OpenVPN and a few SSL VPNs. WireGuard is UDP only, with no fallback, so this question does not arise there. Where the choice does exist, the answer is UDP unless something is stopping you.

What each one does

UDP sends packets and does not care what happens to them. No handshake, no acknowledgements, no retransmission, no ordering.

TCP guarantees delivery and order. It acknowledges, retransmits what is lost, and slows down when it detects congestion.

A VPN carries whatever your applications send. Those applications already chose their own transport — a web page over TCP, a video call over UDP — and they handle their own reliability.

The TCP-over-TCP problem

If the tunnel is UDP, a lost packet is handled once, by whatever protocol was inside it. TCP inside the tunnel notices, retransmits, and adjusts.

If the tunnel is TCP, a lost packet is handled twice. The tunnel's TCP retransmits it, and while it does, the inner TCP is also waiting. The inner connection sees a delay, assumes congestion, and slows down. The outer connection then retransmits more aggressively.

The two control loops interact badly. The classic description of this is titled "Why TCP over TCP is a bad idea", and the effect it describes — a meltdown where throughput collapses far below what the link can carry — is observable on any lossy connection.

On a clean, low-latency link the effect is small. On mobile data, on distant servers, or on any connection with a few percent loss, it is dramatic.

Head-of-line blocking

TCP delivers bytes in order. If one segment is lost, everything behind it waits, even though it has already arrived.

Inside a tunnel that means a single lost packet stalls every connection passing through it, not just the one that lost the packet. Your video call freezes because someone else's download lost a packet. With a UDP tunnel each inner connection handles its own loss independently.

So why does TCP mode exist

Because some networks block UDP.

Corporate networks that permit only TCP 80 and 443. Hotel Wi-Fi with an appliance that drops unusual UDP. Some mobile roaming partners. On those networks a UDP tunnel does not connect at all, and a slow tunnel beats none.

OpenVPN over TCP 443 has a second property: it is very hard to distinguish from HTTPS without deep packet inspection. Blocking it means blocking a pattern that describes the whole web.

The practical rule

Situation Transport
Normal home or mobile use UDP
Streaming or video calls UDP
Gaming UDP
Network blocks UDP TCP 443
Deep packet inspection blocking VPNs TCP 443, plus obfuscation
Connection is lossy UDP, definitely

How to tell which you are on

Most clients show it in the connection details or the log. In an OpenVPN config the line is proto udp or proto tcp, and the port usually gives it away — 1194 is the UDP default, 443 is almost always the TCP fallback.

If a connection is unexpectedly slow, checking this is worth thirty seconds. A client that silently fell back to TCP because a UDP attempt timed out is a common and unannounced cause of poor performance.

Measuring the difference

Run the speed test on UDP, then force TCP in the client and run it again from the same place to the same server. On a good connection expect UDP to be somewhat faster. On a poor one expect the gap to be large.

Watch latency and jitter as well as throughput. TCP mode's effect on jitter is usually more noticeable in use than its effect on the download number.

What about QUIC

QUIC carries a reliable, ordered stream protocol over UDP, and it solves head-of-line blocking by keeping streams independent. A few VPN products use QUIC or something like it as a transport, which gets the blocking resistance of looking like ordinary web traffic without the TCP-over-TCP penalty.

It is a genuinely better answer to the problem TCP mode solves. It is not yet common in consumer VPN clients, so for now the choice remains the one above: UDP by default, and TCP when a network leaves no alternative. On Windows and elsewhere, a client that automatically falls back should tell you when it has.

Sources

  1. RFC 768 — User Datagram Protocol
  2. RFC 9293 — Transmission Control Protocol
  3. Why TCP over TCP is a bad idea

Try it on the network this was written from

VPNmine is a free no-logs VPN running its own WireGuard servers, with native apps for Windows, macOS, Android, iOS, Android TV and Apple TV. No ads, no card.

Get VPNmine