Read the node protocol and transport parameters first, then choose Xray or V2Fly. Nodes with REALITY or XTLS Vision parameters should generally use Xray; existing subscriptions built around VMess, WebSocket, and TLS can be tested with both cores. Use share links, client logs, and real connection results—not the core name alone—to make the final choice.
What Xray and V2Fly are designed to solve
Xray and V2Fly both belong to the broader Project V technology ecosystem and can handle inbound and outbound connections, DNS, routing rules, and multiple proxy protocols. Their basic configuration concepts overlap: inbound receives local traffic, outbound connects to a remote server, and routing selects the exit. However, they are maintained as separate projects, so protocol extensions, field definitions, defaults, and release schedules should not be treated as identical.
Xray is the usual choice for newer protocol and transport combinations. Nodes using VLESS, REALITY, or XTLS Vision are typically deployed around the Xray ecosystem; v2rayN is available on desktop and v2rayNG on Android. After the client generates the configuration and launches the Xray core, users mainly import a subscription, choose a node, and enable the system proxy or VPN mode—without writing a complete JSON file by hand.
V2Fly is mainly valuable for ongoing maintenance of the V2Ray configuration ecosystem and compatibility with existing setups. For nodes based on VMess, WebSocket, TLS, or TCP, V2Fly remains a core worth evaluating. When V2Fly is specifically required on Android, use v2flyNG and check the runtime logs to confirm which core and configuration were actually loaded.
Xray core
RecommendedPrioritizes common Xray ecosystem combinations such as VLESS, REALITY, and XTLS Vision, while remaining suitable for existing VMess nodes.
Best for: new subscriptions, primary daily use, and nodes requiring REALITY
V2Fly core
Maintained around the V2Ray configuration ecosystem, making it suitable for validating existing VMess, WebSocket, TLS, and related nodes and rules.
Best for: existing configurations, VMess nodes, and environments that explicitly require V2Fly
Choose the core by protocol and transport parameters
The quickest starting point is the node details generated by the subscription. Open the node editor in the client and note the address, port, protocol, transport, security type, and flow-control fields. Do not rely on labels such as “high speed” or “relay”; they do not participate in the core handshake.
Seeing VLESS does not mean every implementation is interchangeable. Check whether the security type is REALITY, whether the flow is xtls-rprx-vision, and whether the transport uses TCP, gRPC, or another method. If the share information includes a REALITY public key, short ID, serverName, or Vision flow, prefer Xray and preserve all of these fields.
| Node combination | Preferred core | Fields to verify | Typical result |
|---|---|---|---|
| VLESS + REALITY + Vision | Xray | Public key, short ID, SNI, fingerprint, flow | Missing fields usually cause a handshake failure |
| VLESS + TLS + gRPC | Follow the server requirement first | serviceName, SNI, port, TLS | The configuration structure is similar, but extensions must be checked individually |
| VMess + WebSocket + TLS | Xray or V2Fly | UUID, Host, Path, SNI, port | Suitable for comparison through tests on the same network |
| VMess + TCP | Xray or V2Fly | UUID, alterId, encryption method, port | Check carefully whether legacy fields are still supported |
If the subscription only contains VMess, run ten real connection tests on the same network. Before each test, disconnect the old session, connect to the target node, visit the same test address, and record successes, time to first response, and log errors. A 20–30 ms latency difference is rarely enough to choose a core by itself; sustained success and stable page loading are more useful indicators.
Configuration compatibility does not mean configurations are interchangeable as-is
Both cores use structured configuration and can express inbound, outbound, DNS, and routing settings, but matching fields provide only superficial compatibility. Whether a field works depends on the core version, protocol implementation, and transport module. Running a complete configuration with a different executable core may produce unknown fields, outbound initialization failures, or a configuration that starts successfully but fails during the connection handshake.
Subscription links are better suited to migration between clients than complete JSON files. Subscription services usually provide VMess or VLESS share information, and the client then generates the final configuration for its own core. During migration, import the original subscription instead of copying the client's cache directory. After updating, spot-check three nodes to confirm that the protocol, security type, SNI, transport, and port are all intact.
- Keep the original configuration. Export the current subscription settings or record the subscription URL; do not overwrite a node list that still works.
- Confirm the actual core. In v2rayN, open “Settings” → “Parameter Settings” and review the core options. In v2rayNG or v2flyNG, open “Settings,” then check the version information and runtime logs.
- Regenerate the configuration. Import the subscription into the target client and update it so the client can generate the fields for the selected core.
- Test one node first. Choose a node with complete protocol fields and finish connection, DNS resolution, and web access tests before migrating in bulk.
- Restore routing afterward. Once the basic connection works, add domain, IP, process, or per-app rules. This prevents core issues and routing issues from being investigated at the same time.
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks"
}
],
"routing": {
"domainStrategy": "AsIs"
}
}
The snippet above shows only a local SOCKS inbound and routing policy; it does not include remote credentials. For testing, point the browser or debugging tool to 127.0.0.1:10808, and make sure the client has not mistakenly assigned the HTTP proxy to the same SOCKS port. If you configure a separate HTTP inbound, use 10809 and check that neither port is occupied by another process.
How release cycles and maintenance affect the choice
Faster updates do not automatically mean a more stable connection. A new version may add protocol parameters, fix handshake issues, or change low-level dependencies; it may also expose edge fields in older configurations. First confirm that a release addresses your current issue, then decide whether to upgrade—do not replace a working environment merely because an update is available.
Xray generally adopts protocol extensions from its ecosystem earlier. When a server uses REALITY or newer Vision behavior, the client core must meet the provider's version requirements. V2Fly follows its own path for maintaining V2Ray configurations, transports, and platform capabilities. Release numbers cannot be compared directly; a larger number does not mean broader functionality.
Track client and core versions separately. v2rayN, v2rayNG, and v2flyNG provide the interface, subscription handling, routing entry points, and system network integration; the core parses the final configuration and establishes the connection. For troubleshooting, record at least the client major version, core version, node protocol, and error time. “Latest version” alone is not reproducible information.
Recommended setup: align desktop and Android cores by protocol
Desktop: v2rayN
- Use Xray for REALITY and Vision nodes
- Open “Settings” → “Parameter Settings” and verify the local ports
- After updating, keep a set of verified nodes for regression testing
Android: v2rayNG
- Import the same Xray-compatible subscription
- Check per-app proxy and local DNS settings
- When a connection fails, read the runtime logs first
If the server explicitly requires V2Fly, use v2flyNG on Android for separate validation. Do not directly exchange complete configuration files generated by the two cores.
- Stay on a stable branch: Keep production nodes on a verified combination first. Test connections, DNS, routing, and resume-after-sleep behavior before adopting a new version.
- Keep rollback details: Record the client version, core version, and subscription update time before upgrading, then retest the same node if a problem appears.
- Separate server-side changes: If multiple devices fail at the same time, check the node status first. Only when one device fails should you investigate the local core and system proxy.
- Read release notes: Search specifically for the protocols, transports, and configuration fields in use; there is no need to track changes unrelated to the current environment.
Choose the right setup for the node type
New users can follow a protocol-first approach. Check which node types make up most of the subscription, then choose the client. If VLESS + REALITY dominates, use v2rayN on desktop and v2rayNG on Android. If the Android subscription is explicitly generated for V2Fly, use v2flyNG and begin with a simple VMess node or one specified by the server.
Existing users do not need to migrate repeatedly just because a core has a different name. If a VMess + WebSocket + TLS setup remains stable, keep using it. Switch to a matching Xray setup only when the server upgrades its protocol, configuration fields are no longer recognized, the current version no longer meets requirements, or REALITY is needed.
Node includes REALITY or Vision
RecommendedUse an Xray setup directly. Preserve the public key, short ID, SNI, fingerprint, and flow field by field; do not remove any.
Best for: v2rayN on desktop, v2rayNG on Android
Node is primarily VMess
Keep the current working core first, then compare success rates with the same node, network, and test address.
Best for: existing subscriptions and compatibility testing
Subscription explicitly specifies V2Fly
Follow the subscription instructions and use a V2Fly environment. Do not force Xray-specific parameters into similarly named fields.
Best for: v2flyNG on Android
A ten-minute decision process
- Open the node details and record the protocol, port, transport, security type, SNI, and flow.
- If you find REALITY, a short ID, or xtls-rprx-vision, choose Xray.
- When the node is VMess only, test the current core first; do not migrate for the sake of migrating.
- After connecting, check the logs for unknown field, failed to listen, connection refused, or timeout.
- Verify web access, DNS resolution, subscription updates, and split routing, then make the combination your daily setup.
When diagnosing connection refused, first identify the direction. If the log shows that the remote address or server port refused the connection, the node port may not be listening, the address may be wrong, or the server may be unavailable. If it shows that the local 127.0.0.1:10808 cannot be reached, check whether the core started, whether the ports match, and whether the system proxy still points to an old port.
Common selection questions and troubleshooting steps
Core selection issues are often mixed with subscription caching, port conflicts, and routing rules. Start with a minimal environment: keep one node, disable custom routing, use the default DNS, and confirm that the system clock is accurate. Once the minimal configuration connects, restore features one at a time.
The same VMess node works with both cores. Which one should I choose?
Connect ten times on the same network and record successful attempts, time to first response, and disconnects. If the results are similar, keep the current stable environment. If the subscription also contains REALITY nodes, standardize on Xray first.
The node appears after importing VLESS, but every connection fails. What should I do?
Open the node editor and check the address, port, UUID, security type, SNI, fingerprint, public key, short ID, and flow in order. A REALITY node can fail during the handshake if any required field is missing.
Why are there fewer subscription nodes after switching clients?
Update the subscription manually first, then check the subscription group and filters. If the missing nodes are concentrated in one protocol, review the update log for unsupported fields and ask the subscription provider which core format is required.
What should I do when the core log says a port is already in use?
Stop duplicate client processes and check SOCKS port 10808 and HTTP port 10809. When changing a port, update the system proxy settings as well; otherwise the core may listen on the new port while the browser continues using the old one.
Why did split routing stop working after an upgrade?
Switch to the global proxy first to verify the basic connection, then check whether the domain rules, IP rules, and outbound tags still correspond. Reload the configuration after making changes and confirm in the logs that traffic matched the expected outbound.
The final choice can be reduced to one rule: the server protocol sets the minimum core requirement, client features determine how it is operated, and real-world testing determines whether it stays in use. Prefer Xray for REALITY and Vision; validate existing setups first for standard VMess; use V2Fly when the subscription explicitly requires it. Do not decide based only on the client name, a single latency reading, or a release number.