REALITY and XTLS Vision Explained: How Less Encryption Can Be Faster

Learn how XTLS Vision reduces data copying and REALITY avoids requiring your own certificate, plus how to configure flow and the public key in your client.

At a glance

REALITY handles secure handshakes and authentication; XTLS Vision optimizes forwarding for eligible traffic. They are separate features, not interchangeable switches. This guide is for users with a VLESS subscription who want to understand its settings: learn what each protocol does, check flow, server name, public key, and shortId, then use logs and controlled tests to troubleshoot. Don’t assume that a speed change means one less layer of encryption.

What do REALITY, VLESS, and Vision each do?

These technologies operate at different layers and can be combined, but none replaces the others. VLESS carries proxy requests and user identity information, but does not generally encrypt payloads. REALITY provides secure handshakes and authentication. Vision is an XTLS flow-control mode focused on identifying TLS traffic, applying padding, and optimizing subsequent forwarding.

A typical VLESS + REALITY + Vision node uses TCP transport. The client passes browser connections to a local proxy listener, then its core connects to the proxy server, which in turn connects to the destination site. At least two separate security contexts are involved: the connection from the client to the proxy server and the connection from the browser to the website. These are not a single handshake.

Browser request Local proxy listener Secure handshake Vision forwarding Destination website

These capabilities are provided by the core, not by the client app’s name. v2rayN is a desktop management interface; to use these nodes, make sure it is configured with an Xray core that supports the required features. On Android, v2rayNG uses the Xray core. v2flyNG uses the v2fly core, so importing a VLESS profile does not mean it can run the Xray-based REALITY and Vision combination.

Why does “TLS over TLS” add overhead?

Wrapping already-encrypted HTTPS data in another layer of protection adds work for the proxy. When a browser visits an HTTPS site, the application data is already encrypted by the site’s TLS session. A traditional TLS proxy tunnel then wraps that ciphertext in another TLS layer. The outer layer does not need to inspect webpage content, but it still has to handle record framing, encryption and decryption, buffering, and data transfer.

Vision doesn’t disable website encryption. Once it identifies eligible inner TLS traffic, it changes how subsequent data is forwarded, avoiding the need to keep fully wrapping that encrypted data in outer TLS records. Vision also includes early-stage padding and other processing, so it’s not simply “sending everything raw from the start.”

What to compareTraditional TLS tunnelVision’s conditional optimization
Website HTTPSTLS remains in place between the browser and websiteTLS remains in place between the browser and website
Proxy’s outer layerContinues wrapping the inner dataSwitches forwarding paths when traffic meets the detection criteria
Data handlingTypically passes through TLS processing and buffersOn some platforms, mechanisms such as splice can further reduce copying
Non-TLS payloadsProtected by the tunnelEnabling Vision does not automatically remove outer protection

Reducing copies and reducing encryption are not the same thing. The core implementation, operating system, and connection type all affect whether a more direct data path is possible; using Vision does not mean every connection achieves zero-copy transfer. Eligible inner connections, such as TLS 1.3, are central to understanding this optimization. It does not follow that all UDP, video, or download traffic will get faster by the same amount.

Takeaway: Find the bottleneck before comparing throughput

If the server CPU is close to maxed out during downloads, avoiding redundant encryption may help. If the CPU has headroom but the connection is congested or dropping packets, investigate the network path first. A single peak speed test can’t prove that Vision improved performance.

Why doesn’t REALITY require your own domain certificate?

REALITY uses an authentication method different from the one used to deploy a standard website certificate, so the server generally doesn’t need to obtain and renew its own domain certificate for the proxy connection. The server holds a private key, while the client uses the matching public key and other parameters to authenticate the connection. That doesn’t mean there is no authentication, or that entering any website name will make a connection work.

The server also specifies a target site and the server names it accepts. Under REALITY’s design, connections that fail authentication can be directed to the configured target site, while legitimate clients complete the required authentication. The target site must meet the deployment requirements; TLS 1.3 and HTTP/2 support are common baselines. Simply being able to open a site in a browser does not prove full compatibility.

443
Common server port examples; use the port in your subscription
TLS 1.3
Typical requirements for a REALITY target site
32 bytes
Raw X25519 public key length, not the displayed character count

Public keys are usually displayed as encoded text, so “32 bytes” does not mean the input field should contain only 32 characters. Public and private keys are generated as a pair. Never copy the server’s private key into the client, and don’t generate a new public key to replace the one in your subscription, or the keys won’t match.

How do you set flow, public key, and shortId in v2rayN?

Import the full subscription first, then compare its settings against the provider’s parameters. This is usually more reliable than assembling the configuration by hand. In the v2rayN main window, select the node and double-click it to open the editor. Check the VLESS node’s transport, security, and flow-control fields. Labels vary between interface versions, so go by what each field means rather than changing unrelated settings just to find a menu with a matching name.

The two cards below describe settings for the same node; they are not ready-to-use connection examples. Port 443 is only a common example. The actual port, user ID, public key, shortId, and server name must all come from the same server configuration.

Protocol and transport

Protocol
VLESS
Encryption
none
Transport
TCP / RAW, depending on the interface
Flow
xtls-rprx-vision

Match the server’s flow setting. VLESS set to none does not mean the entire connection is unprotected.

REALITY security settings

Security
reality
Server name
SNI accepted by the server
Public key
Client public key matching the server’s private key
Short ID
shortId accepted by the server
Fingerprint
Use the value specified in the subscription, such as chrome

These values must be used together. Don’t copy individual settings from different nodes to assemble a new configuration.

After saving, reselect the node and reload the configuration in the core. If you edit an entry in the node list without updating the active outbound, the logs may appear to contradict the editor. In v2rayNG on Android, check the relevant fields in the node editor, then confirm the startup result in the main screen’s logs.

How to troubleshoot connection failures and unchanged speeds

First identify where the connection stalls, then consider performance tuning. If the handshake hasn’t completed, there’s no point estimating Vision’s throughput. If the website opens normally, a speed test that shows no improvement does not mean the public key is wrong. Change one setting at a time and keep a copy of the original node so you can revert without losing the working configuration.

  1. Check that the core starts: Look for errors in the logs such as unknown fields, an invalid flow, or failed configuration parsing. At this stage, check the core type and configuration format rather than changing DNS.
  2. Check the address and port: Make sure the address and port match the subscription. A successful TCP connection to the port only confirms that the network endpoint is reachable; it doesn’t mean REALITY authentication succeeded.
  3. Check authentication settings: Verify the user ID, public key, shortId, and SNI, and make sure the system date and time are correct. Handshake errors can have several causes; a generic connection-closed message alone does not prove the public key is wrong.
  4. Check that the app is using the proxy: Browsers, terminals, and other apps may use different proxy entry points. First check whether the logs show a request to the expected destination, then check the system proxy or the app’s own proxy settings.
  5. Check routing and name resolution last: If the proxy connection succeeds but a particular domain fails, investigate DNS, routing rules, and whether the destination site is reachable. The issue may have nothing to do with REALITY or Vision.

For a meaningful performance comparison, keep the server, target file, network connection, and number of concurrent transfers the same. Record CPU usage on both client and server, sustained throughput, and failures. For example, run each setup three times for 60 seconds and compare the stable middle portion rather than the initial spike. This is a suggested test plan, not a benchmark result from this guide.

How to test: compare matching configurations, not just by clearing flow

To compare Vision on and off, ask the server provider for two working configurations. Simply deleting flow on the client can break the settings shared by both sides, making the resulting connection failure or speed change meaningless as a comparison.

Configuration issues that are easy to mix up

Most confusion comes from treating feature support, successful authentication, and app traffic going through the proxy as the same thing. Use the questions below to narrow down the issue. For more on routing, see the site’s advanced configuration guide.

With REALITY enabled, should I turn on “Allow Insecure”?

Don’t use “Allow Insecure” to bypass incorrect REALITY settings. Leave normal verification enabled and check the public key, SNI, and shortId in the node editor. That setting can’t fix a key mismatch between client and server.

Why does my subscription import if flow is unsupported?

Being able to parse a share link doesn’t mean the active core supports every field. Check the startup logs to identify the core in use, then verify its support for REALITY and Vision. Don’t assume compatibility just because the client displays a VLESS icon.

With Vision enabled, does plain HTTP pass unencrypted through the entire proxy chain?

Vision doesn’t send every payload straight through. Non-TLS content still needs the appropriate outer protection, but ordinary HTTP may remain unencrypted between the proxy server and the destination website. Use the website’s HTTPS connection for accounts or sensitive information.

What if a terminal can’t connect through a node that works in the browser?

First check whether the terminal is configured to use a proxy, and test the port the client is actually listening on. A working browser only proves that its own request path works; it doesn’t prove that the terminal reads the system proxy settings. Don’t start by changing the public key or flow.

Can I change an existing WebSocket node directly to Vision?

Changing a client-side field alone won’t work. The transport, server inbound, and flow must all be supported together. Get the complete node configuration from the provider instead of keeping the existing WebSocket setup and adding Vision yourself.

When choosing a node, first check the provider’s complete settings and core requirements, then make sure it suits your network. REALITY removes the burden of deploying your own certificate, while Vision provides a more efficient forwarding path for eligible TLS traffic. Neither replaces a reliable server, a healthy network connection, or accurate client settings.

Download v2rayN