PROTOCOL / CORE / CLIENT

V2Ray Protocols
and Core Reference

VMess · VLESS · Trojan · Shadowsocks
REALITY Security and Xray / V2Fly Cores

This reference is organized around configuration settings and compatibility boundaries, making it useful for choosing a setup or checking details. For your first installation, start with the quick-start guide in the user documentation. Return to the relevant section if a protocol name, core, or subscription field doesn't match. Examples explain configuration structure only; they don't provide connectable servers.

Start with the protocol layers, then look up the protocol your server supports. The comparison table scrolls horizontally.

Protocol layers and configuration boundaries

The “protocol” setting in a client doesn't describe the entire connection. A server configuration typically combines four parts: the proxy protocol, the underlying transport, transport security, and client routing. The proxy protocol defines authentication and request formats; the transport determines how data is carried; the security layer handles the handshake and protects the connection; routing determines which outbound handles each request. Seeing VLESS, tcp, and reality together isn't a contradiction—they each describe a different layer. Separate these layers before comparing options to avoid mixing unlike terms.

Read settings layer by layer in the server editor

Start with the server editor in v2rayN. Check the protocol type, then verify “Address,” “Port,” and “User ID” or “Password.” Next, check “Transport protocol,” then “Transport security.” The address is the destination the client actually connects to; SNI is the server name used during the security handshake. They can differ. If the address is a domain, DNS must resolve it first. Putting the SNI directly in the address field may connect to an entirely different host. Entering the server's listening port as the local listening port will also prevent the connection from being established.

tcp usually means that TCP carries the connection, though some interfaces may use newer transport names. WebSocket carries bidirectional data over HTTP's upgrade mechanism, while gRPC uses mechanisms associated with HTTP/2. These transports change the deployment path and request framing; they don't turn VMess into VLESS. Options such as path, Host, and serviceName apply only to their respective transports. Match the transport used by the server—don't substitute a name just because it sounds more modern.

LayerCommon namesWhat to check
Proxy protocolVMess / VLESS / Trojan / ShadowsocksAuthentication method, user ID, password, encryption method
TransportTCP / WebSocket / gRPCTransport type, path, Host, or service name
Security layerTLS / REALITYServer name, verification parameters, fingerprint settings
Client policySystem proxy / TUN / routingWhich apps use the proxy, and how domains and IPs are routed

A valid configuration doesn't mean traffic is going through the client

Correct server settings only mean the core can attempt an outbound connection. Whether a browser uses it also depends on the system proxy, the browser's own proxy settings, and the local listening port. TUN provides a separate traffic path, using a virtual network interface to handle traffic that matches the configuration. Direct routing rules may also send some requests around the proxy server. So a page loading doesn't prove that the expected outbound is in use, and a running client doesn't prove that every app is covered. Check actual requests and logs.

You can't infer the security layer from the protocol name alone. VLESS doesn't encrypt payloads itself and is usually paired with protection such as TLS or REALITY. Common Trojan deployments rely on TLS; Shadowsocks uses its specified authenticated encryption method. HTTPS in the app adds another layer of protection. Encryption on the outer proxy connection doesn't replace website certificate validation or guarantee that the destination site is trustworthy. Choose based on the complete combination, not a single protocol label.

Keep the original details and verify each layer separately

When documenting a server, first record the complete protocol combination provided by the server and the required core. Then check that no fields were lost in the editor. Troubleshoot in order: address resolution, port reachability, handshake, authentication, and request forwarding. If an earlier layer isn't working, changes to later layers usually won't help. For example, check the address and server reachability for a timeout; check SNI for a certificate name error. Changing routing mode won't fix an authentication failure.

The sections below cover protocols first, then performance and use cases. Map your current settings to the layer table and ignore advanced options that don't apply to your transport. If you haven't installed a client yet, start on desktop by choosing v2rayN from the downloads page. Then select the core and protocol based on the server's settings. Don't pick a combination because it sounds faster and then try to change the server's requirements to match.

VMess authentication and transport trade-offs

VMess is an earlier proxy protocol in the Project V ecosystem, with mechanisms for user identity, request framing, and data protection. It has a long history of use, and many older subscriptions and deployment guides still rely on it. When evaluating VMess, distinguish between a protocol that remains usable and old instructions that may no longer apply. Authentication methods and auxiliary fields in older configurations may not suit current cores. Start with the server's actual implementation; don't infer compatibility from a guide's age or a node name.

User ID, encryption method, and time

“User ID” is usually a UUID used for authentication, not a free-form label. Generating a UUID in the client doesn't authorize it on the server; it must match the server's user configuration. The “encryption method” also has a protocol-specific meaning and shouldn't be confused with the TLS setting. Automatic selection typically lets the implementation choose a suitable method; check that both sides support an algorithm before setting it manually. Hardware acceleration affects the actual processing cost, so an algorithm's name alone doesn't establish a reliable speed ranking.

VMess authentication includes time-related checks, so a significantly incorrect system clock can cause authentication to fail. First enable automatic time synchronization and check that the displayed date, time, and time zone look right. The time zone affects display; the underlying system clock must be accurate. Changing only the displayed time without correcting the actual clock won't solve the issue. Don't repeatedly rebuild subscriptions or change encryption methods before checking the clock; that introduces variables and makes the problem harder to reproduce.

Older shared configurations often include alterId. Common current VMess AEAD setups typically use a value of zero or handle it according to the client implementation; it's not a setting where a higher value means better security. If a subscription retains this legacy field, check whether the server uses the corresponding authentication method and how the client interprets it. Don't copy a nonzero value from an old guide without checking. If server documentation conflicts with the imported settings, rely on the actual deployment and the documentation for the core in use, rather than changing both sides at random.

Why WebSocket and TLS often appear together

VMess can use different transports. WebSocket with TLS is common in deployments that use a reverse proxy: the client completes the TLS handshake, sends the correct HTTP upgrade request, and then starts a VMess session. So an open port doesn't prove the path is correct. The WebSocket path and Host must match the deployment, and the reverse proxy must forward the request to the right backend. A typo in the path, an extra or missing trailing slash, or the wrong target site can cause a failed handshake or return a regular webpage instead.

This combination adds framing and handshake steps, but it doesn't mean that the full cost is repeated for every request. Connection reuse, connection pools, app behavior, and timeouts on intermediate proxies all affect the result. Conversely, direct TCP has less framing, but that doesn't guarantee faster page loads in every environment. If server locations, link quality, or DNS differ, results from two differently deployed servers can't reliably show whether VMess itself is faster or slower.

Keep an existing deployment or migrate?

If an existing VMess configuration works with maintained client and server software, its age alone isn't a reason to migrate. Check whether it still uses an old authentication method, imports reliably, has clear transport settings, and is backed by a maintained server. Moving to VLESS requires the server to create a matching inbound and provide new settings; changing the client dropdown to VLESS isn't enough. The protocols use different authentication and request formats, so renaming one side isn't a compatibility shortcut.

For a new deployment that depends on Xray's VLESS and REALITY combination, configure it accordingly. To connect to an existing VMess server, keep the protocol and transport aligned. If import succeeds but the connection fails, compare the original shared configuration with the editor's encryption method, transport, security layer, and path, then check the logs. For general troubleshooting, see Frequently Asked Questions. Don't mistake a local system proxy issue for VMess incompatibility.

Matching VLESS and REALITY settings

VLESS keeps the proxy protocol layer lean and relies on an appropriate outer mechanism to protect the connection. It's a proxy protocol like VMess, but VMess encryption settings don't apply to it. REALITY is a security approach often paired with VLESS, not a proxy protocol that can replace VLESS on its own. A VLESS + REALITY configuration therefore describes at least two layers. It still needs a transport, flow control, address, port, and identity settings to form a usable connection.

Check identity first, then the handshake

The “User ID” must match a user authorized by the server. “Flow control” isn't a speed setting: xtls-rprx-vision identifies a specific processing mode that must be supported by the server, client core, and transport combination. The common VLESS + REALITY + Vision setup uses TCP; Vision can't be added arbitrarily to combinations such as WebSocket. If the server doesn't require this flow control, copying it from another node may cause a failure. VLESS commonly uses none for encryption; that doesn't mean you can omit the outer security mechanism.

For REALITY, “SNI” or “Server name” must be within the names allowed by the server. Don't choose any website that happens to be reachable. “Fingerprint” selects the client's handshake fingerprint behavior; chrome is a common example, but this setting doesn't authenticate a browser or replace other parameters. Clients and cores may expose different options. If a field is missing after import, check implementation support before choosing a similar-sounding option in the interface.

Enter the public key provided by the server in “PublicKey.” Some newer interfaces may use a different label for the corresponding authentication setting, so check the documentation for your implementation. Never copy the server's private key to the client. ShortId must also come from a value allowed by the server. It usually uses a hexadecimal string within a specified length range; whether an empty value is allowed depends on the server configuration. “SpiderX” relates to access path behavior, not a replacement for a UUID or a bandwidth boost. Don't invent values the server hasn't specified.

FieldSourceCommon mistake
User IDServer user configurationTreating a newly generated UUID as an authorized user
Flow controlServer protocol combinationForcing Vision on an incompatible transport
SNIServer name allowed by the serverEntering an arbitrary domain in the address field
Public key / ShortIdHandshake parameters provided by the serverMissing characters, extra spaces, or the wrong key

Why check for an Xray core first

Within the three clients covered here, start by checking Xray support for VLESS + REALITY: on desktop, use v2rayN and confirm the selected core; on Android, first verify that v2rayNG supports the required settings. Don't assume V2Fly can parse the same security fields just because it's part of a related ecosystem. Seeing VLESS in a client menu doesn't mean every running core supports REALITY. The protocol name being available and the full combination being runnable are two separate things.

Troubleshoot by comparing handshake parameters one by one. A mismatch in the public key, ShortId, SNI, or flow control can prevent the connection from completing. When copying, watch for leading or trailing spaces, line breaks, and full-width characters. If a subscription update suddenly breaks the connection, compare the old and new records instead of resetting local settings straight away. If the logs say a configuration field is unknown, check the core and generated configuration. If the connection starts but the handshake fails, check server settings and system time. Keep the checks in order.

Security mechanisms don't guarantee performance

REALITY's engineering design doesn't translate into a speed advantage on every network. Connection setup still depends on round-trip latency, server load, and the actual route. Vision's data handling in supported setups isn't a standalone switch that can be compared without considering configuration. For a reliable starting point, use a combination explicitly provided by the server and fully supported by the client. Establish a stable baseline, then compare alternatives under the same conditions. Don't enable flow control, multiplexing, and TUN all at once.

When migrating from an existing TLS deployment to REALITY, account for the server configuration, client core, and subscription output format. Changing only the transport security dropdown while keeping the old certificate settings usually isn't enough. Keep the working configuration and add a separate record for testing. Replace the daily-use entry only after confirming that configuration parsing, the handshake, and destination requests all work. Look up terminology in the quick reference; use the quick-start guide for your first connection.

Where Trojan and Shadowsocks differ

Trojan and Shadowsocks are two other common options, but they focus on different design choices. Common Trojan deployments center on a TLS connection and password authentication, making the certificate and server name important settings. Shadowsocks uses a lean proxy-forwarding design with authenticated encryption and has multiple generations of methods. “Password required” doesn't mean the security layers are identical, and an SS node doesn't necessarily use one fixed algorithm or feature set.

Trojan: certificates and server names matter, too

When adding Trojan in v2rayN or v2rayNG, you'll usually need an address, port, password, and TLS settings. Preserve the password exactly; don't let the input method replace its symbols. The remark is just a label and isn't used for authentication. The server name must match the deployment requirements and certificate validation. The address can be an IP while validation uses a domain, but only if that's how the server is set up. If the certificate name doesn't match, check SNI and the server certificate first—not the password length.

A first Trojan connection usually involves a TCP connection and a TLS handshake. Connection reuse can affect the experience with many short requests, while throughput and server resources matter more for sustained transfers. TLS is a mature, general-purpose security foundation, but real-world performance still depends on the implementation, certificate deployment, intermediary proxies, and handshake resumption. TLS doesn't automatically make a connection slower, and having only a few common settings doesn't mean there's just one thing to check when troubleshooting.

Shadowsocks: match the encryption method exactly

Common Shadowsocks settings include server, port, password, and encryption method. Newer AEAD methods and earlier stream-based methods come from different generations of design; AEAD also authenticates the data. The client and running core must support the method specified by the server. Similar names in a dropdown aren't interchangeable. The connection won't work with the wrong method, even if the password is correct. Importing an old configuration only shows that the client recognized its sharing format; it doesn't prove the current core accepts the algorithm.

Methods such as AEAD 2022 may require a specific key format. Don't assume you can enter any ordinary text password. Some deployments support extensions such as multiple user keys, and the shared configuration must preserve them. Check the server's method and client support first, then copy the key exactly. Truncating content with separators or letting a subscription converter reinterpret it as a traditional password can change its meaning. Key format is a protocol requirement, not a display choice.

For a basic Shadowsocks setup, TCP and UDP support also depends on how the client receives traffic. A server allowing UDP doesn't mean apps using the client's system HTTP proxy will get transparent UDP forwarding. Some shared links include plugin parameters. If the client and core used here don't implement that extension, keeping only the server and password doesn't make an equivalent configuration. Ask for a complete setup supported by both sides instead of deleting unrecognized fields and carrying on.

What to checkCommon Trojan settingsCommon Shadowsocks settings
Authentication inputPassword specified by the serverPassword or key for the selected method
Security settingsTLS, server name, certificate verificationSpecified authenticated encryption method
Key compatibility considerationsTransport extensions and TLS settingsMethod generation, key format, and extensions
Where to start troubleshootingHandshake, server name, passwordMethod, key, port, and UDP path

Choose based on the existing deployment, not the number of fields

If the server already provides a correctly maintained Trojan configuration and the client fully supports its transport and TLS settings, there's no need to switch protocols just to reduce the number of settings. For Shadowsocks, record the exact method and key format, especially across different generations. Don't “improve compatibility” by disabling security checks or removing unknown settings. Preserving an error message is more useful for troubleshooting than making a connection stop reporting errors after changing what the configuration means.

Also consider ongoing maintenance: is there a reliable process for renewing certificates? Are key changes reflected in subscriptions? Does the target core support the required extensions? For beginners connecting to an existing service, matching the current deployment matters more than changing the protocol. If a password or subscription may have been exposed, revoke it on the server and issue a new one; changing the local remark isn't enough. Client logs and shared links can contain sensitive settings, so remove credentials and full subscription URLs before asking for help.

How V2Fly, Xray, and clients fit together

Project V is a useful starting point for understanding this ecosystem. V2Fly continues V2Ray-related development and community maintenance, while Xray grew from related code and developed its own feature set. They share history, but differ in protocol support, configuration structures, and implementation details. Similar names don't make their binaries interchangeable or guarantee that the same configuration will work in both without checking. Assess compatibility against the specific protocol combination and fields, not a broad claim that they belong to the same family.

The graphical client isn't the whole connection stack

v2rayN is the desktop graphical client recommended first on this site. It manages server entries, subscriptions, routing options, and core startup. The running core actually parses outbound settings and forwards traffic. An interface update may change menus and how configurations are generated; a core update may change field support or protocol behavior. Treat these as separate changes. After selecting a core under “Core selection” or a related setting, confirm in the startup log that the expected implementation is running. Don't rely on the interface label alone.

v2rayNG is for Android and is the recommended first choice here for the Xray path; v2flyNG is an alternative for the V2Fly path. Choose based on the features required by the server, not interface similarities. Check transport and security settings for standard VMess configurations, too. For REALITY or Vision, use an Xray path that supports those features. Android VPN permission allows the client to receive traffic; it doesn't add protocol support to the core.

ClientPlatformWhat to consider
v2rayNWindows / macOS / LinuxChoose a desktop download first, then confirm the running core and protocol combination
v2rayNGAndroidXray path; check specific fields such as REALITY and flow control
v2flyNGAndroidV2Fly alternative; make sure the server configuration is supported

Similar JSON doesn't mean equivalent features

The configuration for both core families may include similar structures such as inbounds, outbounds, routing, and dns. Matching top-level names only indicate similar concepts; internal objects, supported values, defaults, and newer fields may differ. For example, REALITY settings aren't generic TLS fields that any core can use. Even if a configuration parses, differences in routing order, DNS policy, or transport defaults can change the result. “No syntax errors” doesn't mean the migration is complete.

Records managed through a graphical client are usually converted into its internal model before the actual runtime configuration is generated. This simplifies common tasks, but limits what the interface can express: a complex native server configuration may not map fully to a standard node editor. Importing a custom configuration may bypass some graphical settings, so changing a routing toggle in the interface may not affect it. First establish whether the current entry is a standard server or a custom configuration.

Treat a core switch as a small migration

Before switching, save the working configuration and note the local ports, system proxy mode, DNS, and routing setup. Then test one representative server. Check that the core starts, the handshake completes, domain requests work, and any required UDP apps behave as expected. Don't convert and overwrite the entire subscription at once. If the logs show unknown fields, roll back the unsupported features. If only certain requests use the wrong outbound, check routing and DNS; don't lump both issues together as a core failure.

Don't update a core just to have the name labeled “latest.” First check whether the implementation addresses your specific issue, and keep the configuration details you'll need to roll back. Clients and cores depend on each other: an outdated interface may not generate the structure a new feature needs, while an updated interface that still launches an old core may produce errors. The downloads page lists options by operating system and architecture to help you identify the right installer. For startup crashes involving runtime libraries or permissions, see the v2rayN startup crash troubleshooting notes.

Maintenance questions also need specific answers. Open source means the code and license terms can be reviewed; it doesn't mean every packaged build follows the same maintenance process. A core that's actively developed won't automatically support every old configuration. The most useful notes for beginners aren't vague core rankings, but clear answers to three questions: what features does this server configuration require, can the current client generate it completely, and is the expected implementation actually running? Writing these down makes later troubleshooting and device changes much easier.

Connection overhead, resource use, and mobile battery life

To answer “Which protocol is fastest?”, first define what you're measuring. For the first connection, consider DNS resolution, connection setup, and the security handshake. Web browsing also depends on the destination site, connection reuse, and the number of assets. Sustained downloads depend more on throughput, packet loss, and server capacity; voice and real-time apps care about jitter and the UDP path. These metrics can vary independently. A latency figure in the client doesn't represent every app, and two numbers from different servers don't reveal a protocol's inherent speed.

Separate handshake overhead from sustained transfers

DNS, TCP setup, TLS or another security handshake all add time before a connection is ready. WebSocket and gRPC have their own setup steps, too. Connection reuse and handshake resumption can reduce repeated overhead, while network retransmissions can magnify the cost of a failed attempt. For apps that frequently open new connections, reducing unnecessary round trips may help. For a long-lived data stream, the initial handshake accounts for less of the total time. Keep these scenarios separate in tests; a single long download isn't a substitute for measuring short-connection performance.

CPU use depends on the encryption algorithm, hardware instructions, data copying, and implementation optimizations. An algorithm that is efficient on one desktop processor may not be on a phone with a different architecture. Memory use also depends on connection counts, buffers, routing data, DNS cache, and log volume—not just the protocol. If the client is using more resources, first check whether it's downloading rules, holding many connections open, or producing detailed logs before considering a protocol change.

Why mobile battery use isn't just about encryption

Phones use power for many reasons, including wireless radio wakeups, retransmissions on weak signals, background connections, frequent reconnects, and other app activity. Encryption does use processing power, but it may not be the main factor. A stable connection with fewer wakeups can use less battery than a theoretically leaner setup that keeps retrying. Cellular and Wi-Fi networks also have different power profiles. Don't attribute battery drain directly to Xray or V2Fly when the network and screen brightness also differ.

When Android traffic goes through a VPN interface, the client also reads and forwards packets. Desktop TUN involves a virtual network interface, routing, and DNS handling as well. These change which traffic is captured and how it's processed; they don't upgrade the server protocol. If the system proxy already covers the apps you use, TUN may not improve speed. If an app ignores the system proxy, TUN may extend coverage. For steps, see setting up TUN mode in v2rayN.

Practical limits of Mux, keepalives, and UDP

Multiplexing lets multiple logical requests share fewer underlying connections, which can reduce repeated setup costs for some short-connection workloads. But congestion or packet loss on a shared connection can affect multiple requests. Some protocol and flow-control combinations restrict Mux, so don't enable it by default. Keepalives involve trade-offs, too: sending them too often increases background activity, while sending them too rarely may not preserve idle mappings on some networks. Start with compatible defaults and adjust only after identifying a specific issue.

For real-time apps using UDP, verify the entire path: local traffic handling, core forwarding, server, and destination network. Sending UDP through a proxy doesn't guarantee lower jitter; a longer route or congested link can make things worse. DNS resolution can affect the destination address and routing, so keep it consistent during tests. FakeDNS involves domain mapping and caching behavior; it's not a general speed boost. For details, see the FakeDNS use cases guide.

What to measureConditions to keep constantMisleading conclusion to avoid
First requestDestination, DNS, cache, and networkMistaking DNS differences for protocol handshake differences
Sustained transferServer, time of day, and destination resourceMistaking server bandwidth differences for algorithm differences
Background battery useScreen, signal, apps, and traffic modeMistaking wireless retries for core processing overhead

Change one variable at a time. Record startup, the first request, sustained transfers, and idle behavior, and repeat the observation instead of keeping only the best result. Without controlled tests using the same server setup, describe the outcome as “a difference between these two configurations,” not a protocol ranking. For everyday use, a stable connection, full feature support, and easy recovery usually matter more than small test differences. That's why you should check compatibility before comparing performance.

Subscription formats and configuration compatibility

A subscription distributes configurations; it isn't a new proxy protocol. A subscription URL may return a list of share links, encoded text, or a client-specific configuration. VMess, VLESS, Trojan, and Shadowsocks links each have their own field conventions. Downloading the subscription, recognizing its links, saving the resulting entries, and running them in the core are four separate steps. A success message usually covers only some of them; it doesn't mean the server has been verified as working.

Where information can be lost during import

A client typically identifies the subscription format, converts each entry into its internal server record, then generates the runtime configuration. Each step may limit which fields can be represented. For example, an older parser may not recognize REALITY settings; a shared link may include a transport extension the editor can't save; or a custom configuration with multiple outbounds may be treated as a single server entry. Re-entering the password won't fix these issues. Compare the original content with the fields after import.

VMess share links often use encoded JSON, while VLESS and Trojan commonly use URI parameters. Shadowsocks links have their own encoding and parameter conventions. The same protocol name doesn't mean every sharing implementation handles extensions identically. Special characters in URIs must be encoded correctly, especially in passwords, paths, remarks, and query parameters. A misinterpreted separator can truncate a field. Use the complete link provided by the server; don't split it apart and rebuild it by hand.

“Base64 subscription” means the outer text may be encoded; it doesn't restore missing parameters or provide encryption. Anyone who can decode the content can usually read its server and authentication details. Treat the subscription URL itself as a sensitive credential. Don't include the full URL in screenshots, logs, or support requests. If a URL stops working, check whether it expired or needs reauthorization, and whether the response is actually subscription text. Don't mistake a login page or error page for a protocol format problem.

Limits of cross-core and cross-format conversion

Format conversion maps one representation to another. It can preserve meaning only if the target format supports the same protocol, transport, security layer, and authentication fields. Unsupported options may be dropped or written as extensions the target implementation doesn't recognize. Native JSON settings such as DNS, multiple outbounds, routing, and transport-specific options may not fit into a single share link. Check each field after conversion rather than just counting nodes.

Don't assume that one client's full native configuration can be used as another client's subscription. Importing a custom configuration with complete routing may change local listening ports, outbound tags, and DNS behavior. A standard server subscription usually updates node details; that doesn't mean local routing settings are synchronized. If web access behaves differently after an update, first determine whether the server settings or local policies changed. If only some domains are affected, checking routing and DNS is often more useful than reimporting the entire subscription.

What to check after an update

In v2rayN, add a clear remark to each subscription group, then update the relevant group. Keep a separate known-working entry before updating so you can tell whether the subscription changed or the local environment did. Afterward, check one record's protocol, address, port, identity, security layer, transport, and flow control. Server operators can change node names, so names aren't a reliable identifier for a specific configuration. Don't infer actual fields from a region or protocol abbreviation in the name.

If the update completes but every entry fails, check whether the returned content, parsing results, and running core changed together. If only one protocol fails, focus on its added fields and support requirements. If old entries work but new ones don't, compare identity and handshake settings. Subscription retrieval may fail because its URL is unreachable or access has expired, even when the network works. Don't immediately change TUN, encryption methods, and the system proxy; handle subscription update failures separately from node connection failures.

Keep subscriptions grouped by source in day-to-day use; don't mix same-named entries from different sources. When moving to another device, transfer server details and local policies separately, then verify traffic permissions again. For step-by-step import instructions, see the user guide. If a connection appears healthy but webpages won't load after import, use the system proxy, DNS, and routing checklist to trace traffic instead of repeatedly changing subscription fields that are already correct.

Choose a protocol and core for your use case

Choose based on your constraints, not a protocol ranking. First identify the device platform, the combination the server actually provides, the apps that need proxy access, and whether they rely on UDP. Then pick a client and core that can fully represent those settings. Finally, compare maintenance requirements and runtime behavior. Without the server's cooperation, users generally can't switch protocols freely; they can only choose among the configurations provided. A protocol dropdown is a configuration input, not a tool for converting the remote server to a different protocol.

Getting started on desktop and Android

v2rayN is the recommended first choice for desktop. On the downloads page, choose a build for your operating system and processor architecture, then check which core the protocol requires. The Windows desktop and classic WPF versions are choices of interface and runtime environment, not different remote protocols. On macOS and Linux, check the system and architecture requirements as well. If your browser is already covered by the system proxy, start without TUN to establish a baseline with fewer variables. Then decide whether you need broader traffic coverage.

On Android, choose v2rayNG based on the server's capabilities, especially when you need Xray features. If the deployment specifically requires the V2Fly path and the configuration is supported, consider v2flyNG. On first launch, grant the system VPN permission and check whether another VPN connection is occupying the same interface. Then check background restrictions and behavior when switching networks. If the app disconnects in the background, don't assume the protocol is at fault; investigate power management, background permissions, and signal changes separately.

Existing services, new deployments, and real-time apps

When connecting to an existing service, the safest approach is to keep its protocol and transport and verify the full import first. If an existing VMess + WebSocket + TLS setup works, there's no need to migrate just to change its name. For Trojan, maintain the certificate, server name, and password. For Shadowsocks, match the method and key format exactly. For VLESS + REALITY, choose an Xray path that supports the full combination and use the server's flow-control and handshake settings. Don't borrow fields from another entry.

For a new deployment, choose based on maintenance requirements: can you manage certificates and server names? Do you need a reverse proxy? Do all target devices support the same security approach? Can the subscription tool output every required setting? A checklist is more useful than optimizing for a theoretical overhead figure. For real-time voice or other UDP apps, verify end-to-end UDP and routing; a webpage loading isn't enough. App-specific regions, routes to destinations, and server location also affect the experience.

Use caseFirst stepHold off on
First connection to an existing serviceKeep the original combination and verify all settingsChanging protocol, DNS, and routing all at once
VLESS + REALITYConfirm Xray, flow control, and handshake fieldsSubstituting similar fields for missing parameters
Need to route apps that ignore the proxyEvaluate TUN, permissions, and routingTreating TUN as a protocol speed boost
Unexpected idle battery drain on mobileCheck reconnects, signal, and background restrictionsSwitching cores based on one battery reading

Establish a minimal, recoverable baseline

For your first test, use a single server, a clear routing plan, and compatible defaults. First confirm the core starts, then check that requests reach the local port, and finally verify the server handshake and destination access. The JSON below shows only the minimal rule structure of a native configuration's routing object: private addresses go to an outbound named direct. It isn't a complete connection configuration. Before using it, make sure an outbound with that tag exists and check the order of existing rules. If you use a graphical client, configure the equivalent behavior through its routing settings.

{
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}

This illustrates another boundary beyond protocols: routing can change whether a request uses a node even when the node itself hasn't changed. Rules are evaluated according to the implementation's matching behavior. A broad rule near the top may match first, preventing a more specific rule later from taking effect. Real setups also depend on the availability of geolocation data files. Don't replace the whole routing object with this example. Understand the existing rules, add a clearly defined condition, and test access to both the local network and the destination network.

When something breaks, roll back based on the evidence

If the core won't start, check configuration generation and port conflicts. If the handshake fails, check identity, security settings, and system time. If the connection is established but the app gets no response, check local traffic handling, DNS, and routing. For local listening conflicts, see the port conflict and listening port guide. Change one setting at a time and keep the last working state. To recover, first disable newly added advanced features instead of re-entering every protocol field.

Record the final choice as one complete combination: client, core, proxy protocol, transport, security layer, traffic handling, and routing plan. This makes it easier to verify each item when changing devices and describe exactly what differs when a problem occurs. The goal isn't to make the protocol name as complicated as possible; it's to match server capabilities, client implementation, and real app requirements. Once you have a baseline, use the performance section to make controlled comparisons. For everyday setup, return to the quick-start guide; for specific questions, continue with Frequently Asked Questions.