At a glance

VLESS handles the proxy protocol, Vision optimizes the transport of specific traffic, and REALITY provides connection security and authentication. Each has a distinct role, and none replaces the others. This guide is for readers with a VLESS node who need to check client settings: understand why HTTPS can be encrypted twice, match the flow, security, SNI, and key parameters, then test on the same route to see whether performance actually improves.

VLESS, Vision, and REALITY: What’s the Difference?

Node names often list “VLESS + TCP + REALITY + Vision” together, but these aren’t four competing protocols. VLESS defines how proxy requests are authenticated and encapsulated; TCP provides a reliable byte stream; REALITY handles the outer secure connection; and Vision is an Xray flow-control mode that identifies and optimizes eligible inner TLS traffic.

Application request VLESS encapsulation Secure handshake Vision processing Destination connection

This flow illustrates the roles involved; it doesn’t mean every implementation step happens strictly in sequence. The secure handshake establishes the connection first, after which proxy requests and data can pass through. When you visit an HTTPS site, your browser also establishes its own TLS connection with the site. The outer connection protects traffic between your client and the proxy server; the inner connection protects content between your browser and the destination.

How Vision Reduces Redundant Encryption

Consider browsing an HTTPS site: the site’s TLS encrypts application data before it enters the proxy tunnel. If the outer tunnel also encrypts every byte, data is encrypted twice. This doesn’t necessarily cause noticeable lag, but it adds cryptographic and processing overhead. The cost is more apparent when the server CPU is busy, throughput is high, or device performance is limited.

Vision detects stages in inner TLS traffic and applies the appropriate encapsulation and padding to the initial data. When implementation requirements are met and the traffic reaches an eligible encrypted TLS 1.3 data phase, Vision can switch to an optimized transfer path, reducing redundant outer-layer processing of that already-encrypted payload. Some environments can also use more efficient forwarding mechanisms, depending on the operating system, connection type, and core implementation.

Traffic scenarioWhat Vision doesWhat you can’t conclude
Inner HTTPS that meets optimization criteriaIdentifies the TLS phase and reduces redundant processing of subsequent payloadDownload speeds aren’t guaranteed to double
Regular plaintext TCP applicationData still needs protection by the outer secure connectionPlaintext isn’t exposed directly to the public internet
UDP or other encapsulated trafficHandled according to the specific transportInner TLS optimization claims don’t apply automatically
High packet loss or congested routesStill constrained by the underlying transport and route qualityDoesn’t eliminate retransmissions or bandwidth bottlenecks

So “VLESS is faster” is shorthand. More precisely, under the same route and resource conditions, a suitable combination of VLESS, Vision, and secure transport may reduce processing overhead compared with a setup involving extra encapsulation or redundant encryption. If the bottleneck is peak-hour congestion, server-side throttling, or packet loss across networks, changing the protocol name is unlikely to make much difference.

REALITY: Handshake and Authentication

REALITY builds a secure connection using TLS 1.3 mechanisms and incorporates specific authentication information into the handshake. The client needs the server’s corresponding public-key information, an allowed server name, and parameters such as shortId. Unlike a conventional TLS deployment, the node administrator doesn’t need to obtain and maintain a publicly trusted certificate for the node’s own domain. The target site and server parameters still need to be configured correctly.

When the server recognizes an eligible client, it establishes a proxy connection. Connections that fail the relevant authentication checks are directed to the configured target site, as designed by REALITY. This target affects the handshake appearance and fallback behavior; it isn’t a regular CDN relay, and it doesn’t mean normal proxy traffic is continually routed through the target site.

443
A commonly used TCP listening port, not a requirement
TLS 1.3
How the REALITY handshake works
16
Maximum number of hexadecimal characters in shortId

shortId is a short identifier in the server’s allowlist, not a UUID or public key. A non-empty value must contain hexadecimal characters, have an even length, and be no more than 16 characters long. The client value must match an entry allowed by the server. Whether an empty value is accepted also depends on the server’s allowlist; don’t clear it at random when troubleshooting.

Map the Concepts to config.json Fields

When troubleshooting, distinguish proxy protocol settings from transport security settings. In a typical Xray VLESS outbound configuration, flow belongs to the user object, while security belongs to streamSettings. Putting these fields at the same level, or setting reality as VLESS encryption, isn’t an equivalent configuration.

VLESS user parameters

protocol
vless
id
UUID assigned by the server
encryption
none
flow
xtls-rprx-vision

These values match the protocol and user; setting encryption to none doesn’t mean the outer connection is unencrypted.

REALITY transport parameters

security
reality
serverName
SNI allowed by the server
fingerprint
For example, chrome
shortId
Short identifier allowed by the server

The corresponding public-key information is also required. Field names depend on the Xray core version and the client’s exported configuration.

The snippets below show where fields go; they aren’t complete node configurations and can’t run on their own. The first shows the flow-control field in a VLESS user object; the second shows the transport security object. A working configuration also needs the server address, port, user credentials, and REALITY authentication parameters.

{
  "encryption": "none",
  "flow": "xtls-rprx-vision"
}
{
  "security": "reality",
  "realitySettings": {
    "fingerprint": "chrome"
  }
}

To check object nesting, see the configuration reference. If you use a subscription, it’s usually safer to re-import the complete node configuration from your provider and compare it with the effective exported configuration than to edit generated files manually. The client may overwrite those files the next time it starts the core.

Check Settings in v2rayN and Android Clients

On desktop, when using v2rayN, first confirm that the node is running on an Xray core that supports REALITY and Vision. On Android, v2rayNG uses the Xray core, but check that your installed version recognizes the subscription parameters. v2flyNG uses the v2fly core; VLESS support alone doesn’t mean it can run Xray-specific configurations.

  1. Check the imported settings. In the v2rayN main window, select the node, right-click it, and choose “Edit.” Check the address, port, UUID, flow, and transport security. Interface labels may vary by version; rely on the exported fields and values.
  2. Check transport security. A REALITY node should use security=reality, and a Vision node’s flow should be xtls-rprx-vision. Don’t treat a “TLS” checkbox as a universal substitute for every security mode.
  3. Check how traffic is routed. Open the v2rayN tray menu and select “System Proxy” → “Automatically configure system proxy,” then test with a browser that follows the system proxy. In v2rayNG, make sure you’ve granted permission and started the system VPN connection.
  4. Check the local port. For example, if the local proxy is set to 127.0.0.1:10808, the app’s port and proxy type must match the actual inbound settings. 10808 is only an example; use the values in your current settings.
  5. Keep logs minimal. Test a webpage once and note the time and error message, then change one field at a time. Before sharing logs, redact UUIDs, subscription URLs, and authentication parameters.

How to Measure Whether It’s Faster

A fair protocol comparison requires controlled variables. If you test two nodes from different regions or providers, the results primarily reflect differences in their routes, not Vision’s overhead. Ideally, use the same server, bandwidth limit, and a similar route, changing only the transport being tested. If you can’t control these conditions, call it a “node experience comparison,” not a protocol comparison.

  1. Use the same device, network, test target, and time window, and close background downloads. Test each setup three times and record the median.
  2. Use the same 100 MiB test file. Record time to first byte and sustained download speed, not just the peak.
  3. Monitor CPU usage and outbound bandwidth on the server at the same time. If outbound bandwidth is already saturated while CPU usage is low, reducing encryption overhead is unlikely to increase throughput.
  4. Leave time between tests to avoid triggering rate limits on the target site. Then test a frequently used webpage to make sure the large-file results haven’t hidden interactive latency.

For example, downloading a 100 MiB file in 10 seconds averages about 10 MiB/s, or roughly 83.9 Mbps. This is a unit conversion example, not a benchmark from this article. When the client shows MB/s and a speed test shows Mbps, convert to the same units before comparing. Proxy overhead, connection setup, and measurement windows can also affect the results.

Bottom Line: Find the Bottleneck Before Changing Protocols

If repeated tests on the same route still show limits from outbound bandwidth or packet loss, address the route or throttling first. If CPU usage also hits the ceiling as throughput increases, compare Vision’s resource use and sustained speeds. Don’t abandon a noticeably more stable route just because another node has “Vision” in its name.

REALITY and Vision FAQ

If I use REALITY, do I also need to set Vision?

They’re separate settings. First check the flow-control requirement provided by the server or subscription. If the server uses Vision, set xtls-rprx-vision in the client. Don’t force Vision on a node with no flow-control requirement, and don’t infer the flow value from the security type alone.

Handshake failed: should I change SNI or fingerprint first?

Restore the original node settings first, then check the address and port, system time, public-key information, shortId, and serverName—in that order. Next, check core compatibility on both ends. The SNI must be on the server’s allowlist; switching it at random to a popular website domain usually won’t fix an authentication error.

The site loads, but download speeds haven’t improved. Why?

That doesn’t necessarily mean the configuration is wrong. Run three tests against the same target and record server CPU usage, bandwidth, and packet loss. Vision reduces processing overhead on specific data paths; it can’t add ISP bandwidth or remove server-side account limits.

Why can’t I connect after importing a VLESS link successfully?

A successful import only means the link could be parsed. Reopen the node’s edit screen and check that flow, SNI, shortId, and public-key information are still present, then confirm that Xray is actually running. If the interface doesn’t expose the required fields, update to a compatible client rather than bypassing the error by disabling security settings.

Choose a Client with the Right Core Support

For desktop, check v2rayN. On Android, compare the cores used by v2rayNG and v2flyNG. Before using REALITY and Vision, confirm Xray support and check the node parameters.