How REALITY and XTLS Vision Work: Why Removing a Layer of Encryption Can Improve Speed

Learn how XTLS Vision avoids duplicate encryption, how REALITY uses a real website’s TLS handshake, and how both work together in the Xray core.

At a glance

REALITY handles authentication and the appearance of the connection handshake, while XTLS Vision optimizes data encapsulation and avoids redundant encryption inside the proxy tunnel. This guide is for readers who have imported a VLESS node and want to understand security options and the Flow field. You’ll learn to tell the server address from SNI, check client settings, and determine whether encryption is really the speed bottleneck.

First, separate the three names: VLESS, REALITY, and Vision

A common node setup in v2rayN or v2rayNG is “VLESS + REALITY + XTLS Vision.” These are three distinct components, not interchangeable protocol names. VLESS defines how proxy requests carry user credentials and destination addresses; REALITY handles the outer secure handshake and authentication; Vision is an Xray flow-control mechanism that determines how some data is handled inside the tunnel. Understanding these separate layers makes it easier to know which setting to check when something goes wrong.

LayerSettingPrimary roleDoes not replace
Proxy protocolVLESSCarries user credentials, destination address, and request dataDoes not provide complete transport encryption on its own
Security layerrealityEstablishes an authenticated secure connection and handles unauthenticated handshakesDoes not replace routing rules
Flow controlxtls-rprx-visionIdentifies eligible TLS traffic and optimizes subsequent data transferDoes not fix packet loss or congestion on every route

A common value for VLESS encryption is none. This means the VLESS protocol does not add another layer of payload encryption; it does not mean the entire connection is sent in plaintext. With REALITY, the security layer still participates in establishing the connection. And when you visit an HTTPS site, the application’s own TLS encryption remains in place.

Why HTTPS traffic through a proxy can have two layers of encryption

When you open an HTTPS website, your browser first completes a TLS handshake with the destination. The page, login details, and response data are then encrypted at the application layer. The proxy simply carries this connection to the destination; it does not gain the keys needed to decrypt the website session.

If the proxy tunnel also uses TLS, the browser’s encrypted traffic is wrapped again in TLS records for the proxy connection. The client encrypts the outer layer, the server decrypts it, then forwards the inner ciphertext to the website. This “double wrapping” is common and useful in many cases, but with high-volume traffic it adds encryption and decryption work, buffer handling, and data-copying overhead.

Browser request Website TLS Wrapped by proxy Unwrapped by server Destination website

Vision does not disable HTTPS. Instead, it identifies the stages of an inner TLS connection and changes how subsequent data is transferred when conditions allow. For recognized TLS 1.3 traffic, it can switch to direct forwarding at the appropriate stage, so already-encrypted application data avoids redundant TLS encryption and decryption by the outer layer. The initial handshake and necessary proxy information still need protection; the connection does not simply send all data in the clear once established.

How REALITY borrows the look of a real website’s handshake

A standard TLS proxy service usually needs its own domain and certificate. REALITY takes a different approach: the server is configured with a suitable real TLS destination, and the client starts a handshake using agreed authentication parameters. If authentication succeeds, the client and REALITY server establish a proxy tunnel. If it fails, the server can forward the connection to the configured destination, making it look like a normal TLS interaction with a real website.

“Borrowing a real website” is a useful way to understand the idea, but it does not mean the server has that website’s private key or that all proxy traffic is routed through the site. After successful authentication, the server forwards proxy data to the requested destination. The configured website is mainly involved in the handshake’s appearance and the handling of unauthenticated connections. The client also does not establish trust in the REALITY server simply by copying the destination website’s public certificate locally.

Start handshake Authentication parameters Server verification Establish tunnel Forward request

The server address, SNI, and real destination are different fields

Which settings to check in v2rayN and v2rayNG

Start by importing a complete node from a trusted subscription, then check its fields in the node editor. Menu names vary across client versions, but the meanings of protocol, transport, security layer, and Flow stay the same. The cards below show how to check settings at both ends of the same connection; they are not complete nodes to copy and use as-is. Port 443 is only a common example—use the port the server actually listens on.

Client node settings

Protocol
VLESS
Transport
TCP; newer versions may also label it RAW
Security layer
reality
Flow
xtls-rprx-vision
Fingerprint
chrome, confirm against the server configuration

You’ll also need the correct address, port, user ID, SNI, key parameters, and Short ID from your node provider.

Corresponding server requirements

Inbound protocol
VLESS
Listening port
443, or the port actually configured
User Flow
xtls-rprx-vision
Security settings
REALITY private key and permitted names
Handshake destination
A TLS website that meets the requirements and is reachable from the server

The private key stays on the server. Client authentication parameters must match the server configuration; do not generate replacements at random.

REALITY key parameters may have different names in client interfaces and across Xray configuration versions. Older configurations commonly use publicKey, while newer ones may use password. Don’t transfer JSON by matching field names alone; follow the documentation for the running core and the client’s import rules. The server’s private key should never be shared with regular users.

TLS 1.3
Key conditions for Vision’s direct-forwarding optimization
443
A common listening port, not a required value
≤16
Maximum number of hexadecimal characters in a Short ID

A Short ID is a hexadecimal string. If it is not empty, its character count must be even, with a maximum length of 16 characters. Whether an empty value is allowed depends on the server configuration. It is not a user ID or a field for a random note. If your subscription provides a Short ID, keep it unchanged; altering even one character can cause authentication to fail.

Bottom line: match the full set of settings before changing the fingerprint

First check the address, port, user ID, Flow, SNI, and authentication parameters. Changing the fingerprint is only useful for troubleshooting once the basic settings match and the core is confirmed to support them. Changing several parameters at once makes it harder to pinpoint the next error.

Why removing a layer of encryption can make things faster—and why it might not

Encryption is not the only source of overhead, but it can be a significant one on high-throughput connections. Vision reduces redundant encryption and decryption for eligible data and, where the implementation allows, uses a more efficient transfer path to reduce CPU usage and data-copying overhead. These gains are more noticeable when a server handles multiple high-volume connections than with short web requests.

If the bottleneck is packet loss on a mobile network, server egress bandwidth, ISP congestion, or destination rate limiting, removing a layer of encryption may not change download speeds. TCP congestion control still applies, and REALITY cannot increase a route’s physical bandwidth. A fast result from one node does not prove that “all REALITY nodes are faster than other setups.”

Observed behaviorWhat to check firstWhat Vision might do
One CPU core stays near 100% during downloadsClient and server CPUs, core versions, and the actual Flow settingMay reduce processing overhead when optimization conditions are met
CPU usage is low, but speeds fluctuatePacket loss, congestion, egress bandwidth, and destination rate limitsUsually cannot fix a route bottleneck directly
Web pages load slowly at first, but sustained downloads are normalDNS, handshake round-trip time, connection reuse, and destination responseOptimizing sustained traffic does not guarantee lower page-load latency
Speeds change significantly after switching nodesWhether both servers use the same route and have comparable loadThis result alone does not establish that Flow control is responsible

How to run a fair comparison

  1. Use the same device, network, server, and download target. Close other bandwidth-heavy tasks, and don’t mistake changes in Wi-Fi signal strength for protocol gains.
  2. Use two test configurations explicitly supported by the server. Don’t simply clear the Flow field to create a baseline; client and server settings must match.
  3. Run a 60-second download three times per setup, and record average throughput, client CPU usage, server CPU usage, and connection errors.
  4. Test a large file and initial webpage load separately. If CPU usage drops but throughput stays the same, the optimization is working, but the current speed bottleneck may be elsewhere.

Bottom line: compare throughput and CPU usage

Make sure the route, destination, and load are the same before comparing speed and processing overhead. This guide does not promise a fixed percentage increase: device performance, core implementation, and network conditions vary, so one number cannot represent every node.

Troubleshoot connection failures by handshake stage

“Handshake failed” only means the secure connection was not completed; it does not automatically indicate a certificate problem. Mismatched REALITY authentication parameters, an unapproved SNI, an unreachable server destination, or an incorrect device clock can all cause a connection failure. First check whether TCP connects, then verify REALITY authentication, and finally check the VLESS user and Flow settings. This is usually more effective than repeatedly switching encryption options.

  1. Check the connection address first: Make sure the client is connecting to the proxy server, not the handshake destination. If the logs show a timeout or connection refusal, check the listening port, firewall, and network reachability.
  2. Check the system clock next: In Windows, open Settings → Time & language → Date & time and check automatic time and sync status. On Android, enable automatic date and time. REALITY may enforce a time-difference limit based on the server policy.
  3. Verify the authentication parameters: Compare SNI, the client authentication key parameters, and Short ID one by one. If the server key has changed, an old subscription may stop working even when the address is unchanged.
  4. Check the user and Flow: Confirm the VLESS user ID exists on the server and both ends use compatible Vision settings. Don’t confuse REALITY security settings with the Flow field.
  5. Check which core is actually running: Confirm that v2rayN is using an Xray core that supports this combination. Being able to save a node in the interface does not guarantee that the selected core accepts every field.
  6. Check the destination and forwarding last: If the handshake succeeds but pages won’t load, check server DNS, outbound routing, destination reachability, and whether the client is sending that traffic through the proxy.
Can enabling allowInsecure fix REALITY authentication failures?

Don’t use it as a general fix. Skipping standard TLS certificate verification will not make an incorrect REALITY key, Short ID, or SNI match. Restore the complete parameters from your node provider and use the handshake logs to find the cause. Don’t disable certificate verification in your browser for destination websites just to test.

Can I use WebSocket or a relay with a REALITY node?

This guide covers TCP/RAW; you can’t simply switch the client to WebSocket, enter a path, and expect it to keep working. A common HTTPS relay terminates and re-establishes TLS, changing the end-to-end handshake conditions. Check the Xray version and the complete server design to confirm support for other transports or forwarding setups.

Why check routing after importing a subscription?

A subscription provides node settings; routing determines which requests use the node. If a connection test succeeds but a website still connects directly, a routing rule may have matched direct first—it does not necessarily mean REALITY failed. Check the actual outbound route for that request before changing rules, so you don’t mistake a routing issue for a security-layer failure.

Download v2rayN