Start with the relationship map: projects, cores, and clients are three separate layers
The easiest mistake to make when learning the V2Ray ecosystem is treating Project V, V2Ray, V2Fly, Xray, and client names as the same kind of thing. They actually occupy different layers: Project V is the historical name and umbrella concept for the technology ecosystem; V2Fly and Xray are two actively evolving core families; and v2rayN, v2rayNG, and v2flyNG are user-facing clients.
| Layer | Name | Primary role | What users typically interact with |
|---|---|---|---|
| Ecosystem and history | Project V | Describes the project’s origins, protocol stack, and tool ecosystem | V2Ray, VMess, routing, and related concepts in the documentation |
| Proxy core | V2Fly | Handles connections, protocols, transports, DNS, and routing rules | V2Ray configuration structure and protocols such as VMess |
| Proxy core | Xray | Extends protocol and transport capabilities within a closely related configuration model | VLESS, REALITY, routing, and connection logs |
| Desktop client | v2rayN | Manages nodes, subscriptions, the system proxy, and core processes | Desktop interfaces for Windows, macOS, and Linux |
| Android client | v2rayNG | Uses the Xray core and provides a mobile configuration interface | QR scanning, link pasting, subscriptions, and per-app proxying |
| Android client | v2flyNG | Uses the V2Fly core and manages connection profiles | Node and subscription management along the V2Fly path |
Project V and V2Ray: from a tool name to a configuration language
Project V began as an effort centered on network proxy tools, protocols, and composable configuration. V2Ray became its best-known core implementation, so for a long time “V2Ray” referred interchangeably to the program, configuration format, node types, and even the wider tool ecosystem. Terms such as “V2Ray node,” “V2Ray configuration,” and “V2Ray client” are still common, but they do not always refer to the same software package.
From an engineering perspective, V2Ray’s key value is not just a protocol but a composable data-flow model. Traffic enters through inbounds, passes through routing decisions, and leaves through outbounds; DNS, policies, logging, and the transport layer provide supporting capabilities. VMess was an important early protocol in this ecosystem, but a V2Ray configuration is not the same as VMess, and seeing “V2Ray configuration” in a client does not mean it can import only vmess:// links.
{
"inbounds": [
{
"tag": "local",
"protocol": "socks",
"port": 10808
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vmess",
"settings": {}
}
],
"routing": {
"rules": []
}
}
The structure above shows the core’s basic boundary of responsibility: local applications hand traffic to an inbound, the routing module selects an outbound based on a domain, address, or port, and the outbound establishes a connection using the node’s protocol. A graphical client converts node forms, subscription data, and user preferences into a similar runtime configuration, then starts the core. Users see switches and lists; the background core performs the actual connection.
V2Fly and Xray: two core branches built on shared foundations
As the project evolved, community maintenance around V2Ray formed the V2Fly path, while Xray developed from a closely related code and configuration foundation into a separate core branch. They share many historical concepts, including inbounds, outbounds, routing, DNS, VMess, VLESS, and multiple transport methods, so basic configurations often look alike. But “similar” does not mean that every field, protocol extension, and runtime behavior is identical.
The V2Fly path
The V2Fly path retains V2Ray’s modular structure and suits environments that rely on the standard V2Ray configuration model, VMess connections, and conventional routing features. It remains an independently maintained proxy core, not a graphical client. A desktop or Android interface must start the core, generate its configuration, and read its logs to complete an actual connection.
The Xray path
Xray continues to expand protocol and transport capabilities on a similar model. In practice, REALITY is often the clearest dividing line: when a node explicitly includes security=reality, a public key, a short ID, a server name, and related parameters, use an Xray core that supports those capabilities. Importing such a link into a core without the required implementation may result in startup errors, ignored fields, or a failed handshake.
The two paths are not simply a “new versus old” relationship. Each maintains its own versions, fixes issues, and adjusts its feature set. Version numbers cannot be compared directly across projects: a higher Xray version number does not mean it is a direct upgrade package for a V2Fly release. The reliable criteria are the node’s required protocol features, the core bundled with the current client, and whether the runtime log shows that the parameters loaded correctly.
Clients and cores: how the interface and execution layers work together
v2rayN, v2rayNG, and v2flyNG can all be called clients, but none of them is a proxy protocol itself. Clients mainly handle configuration management: accepting share links, saving subscription URLs, displaying node lists, generating runtime configurations, switching the system proxy, viewing logs, and starting or stopping the core when needed.
The core handles network execution: listening on local ports, resolving destination addresses, applying routing rules, establishing remote connections, and processing transport and security parameters. Separating these two layers makes many common symptoms easier to explain:
- A link imports successfully but the node cannot connect: the client recognized the sharing format, but the core may still fail during connection because of protocol parameters, the network path, or the server state.
- A subscription updates successfully but its nodes do not work: a subscription is only a configuration list; a successful update does not mean every remote endpoint on that list is reachable.
- The same node behaves differently after switching clients: the two clients may use different core families, different core versions, or different default DNS and routing settings.
- The core log looks normal but the browser does not use the proxy: the execution layer is running, but the system proxy or application proxy entry is not pointing to the client’s listening port.
Clients usually parse sharing links. For example, vmess:// or vless:// contains the protocol, address, port, and transport information required by a node; a subscription URL returns an updatable node list. The client converts these external formats into an internal configuration. The core does not automatically maintain subscription groups or note names in the interface.
v2rayN, v2rayNG, and v2flyNG: relationships and use cases
v2rayN: desktop configuration and system proxy control
v2rayN targets desktop environments. Its main capabilities are managing server lists, subscription groups, routing modes, the system proxy, and core processes in one place. For common VMess and VLESS nodes, it typically provides connectivity through the Xray path. For nodes requiring REALITY, also verify the current v2rayN version and the actual Xray core version it invokes.
The desktop advantage is visibility into state: users can inspect the local listening port, system proxy mode, live logs, and routing results. Windows users generally use the desktop package directly; macOS and Linux users should choose the appropriate platform build from the download page and confirm that the processor architecture matches. Archives and executables for different platforms are not interchangeable.
v2rayNG: the Xray path on Android
v2rayNG is an Android client that uses the Xray core for connections, making it suitable for nodes requiring VMess, VLESS, REALITY, and other Xray capabilities. It provides mobile entry points for QR scanning, clipboard import, subscription groups, routing rules, and per-app proxying. For a VLESS node explicitly marked with REALITY, v2rayNG is usually the most direct Android choice among the three clients.
When an Android device reports latency in a test but an app cannot access the network, do not simply retest the node. Also check whether the current profile is running, whether connection authorization is active, whether the per-app list excludes the target app, and whether routing rules send the target domain to the wrong outbound.
v2flyNG: the V2Fly path on Android
v2flyNG is designed for Android scenarios that use the V2Fly core. Its interface serves a similar purpose to v2rayNG’s, but the underlying core path is different. If existing nodes and configurations are built around standard V2Fly capabilities, or you need to reproduce connection behavior from a V2Fly environment, v2flyNG makes it easier to keep the core consistent.
When choosing v2flyNG, do not assume that every extension is supported just because a link imported successfully. This is especially important when the configuration comes from an Xray environment: check the protocol, security method, and transport fields individually. If the core does not support an extension, use the matching core path instead of repeatedly changing the address, port, or local proxy switch.
Choose a core by protocol: VMess, VLESS, and REALITY
The most practical way to choose a client is to read the node parameters first rather than compare software names. The protocol, transport method, and security layer define the capabilities required for a connection.
| Node characteristics | Recommended assessment | Suitable client direction |
|---|---|---|
vmess:// with conventional TCP, WebSocket, or other transports |
Both core paths can usually handle it; continue by checking the transport parameters | Use v2rayN on desktop; choose on Android based on core requirements |
vless:// with conventional TLS or standard transports |
Check the client’s core version and support for the fields in the link | On desktop, verify the v2rayN core first; on Android, choose by core path |
| VLESS with REALITY parameters | Requires an Xray core with REALITY support | Use correctly configured v2rayN on desktop; use v2rayNG on Android |
| A complete V2Fly JSON configuration | Prefer keeping the generating and runtime environments on the same core family | Use v2flyNG on Android; verify the core configuration on desktop |
VMess is a long-standing protocol in the Project V ecosystem. Node details commonly include a user ID, address, port, transport type, and TLS settings. VLESS uses a more streamlined protocol design, but it does not automatically mean REALITY. Only when the link or configuration explicitly specifies REALITY as the security method should you verify the public key, short ID, fingerprint, and server name as required.
WebSocket, gRPC, and TCP are transport-layer choices, while TLS and REALITY concern connection security and the handshake method. Even with the same protocol, different transport parameters can make one node work and another fail. For example, if the server is configured for WebSocket but the client incorrectly selects TCP, the expected connection cannot be established even when the address and port are exactly right.
Configuration compatibility and migration: what can be reused
V2Fly and Xray share many configuration concepts, so simple inbounds, outbounds, DNS settings, and routing rules can often be migrated. Before migrating, separate the configuration into “common structure” and “core-specific extensions.” Common structure includes tags, ports, domain matching, address ranges, and basic protocol parameters; core extensions may involve specific security methods, flow-control options, or transport fields.
- Confirm the configuration source first. Identify which client or server environment generated the configuration, and record the core family it originally used.
- Then inspect the protocol fields. Identify
protocol,network,security, and the parameters related to the handshake. - Review routing separately. Domain rules, address rules, and outbound tags must correspond to one another; during migration, do not copy only the node section.
- Validate with logs. First confirm that the configuration starts, then check DNS resolution, routing matches, and the remote handshake instead of attributing every failure to the node.
Migrating a sharing link looks simpler than migrating a complete JSON configuration, but clients may handle notes, groups, subscription identifiers, and extra fields differently. Copying a single link usually transfers only the node itself, not the original client’s global DNS settings, LAN bypass rules, system proxy settings, or per-app list. Therefore, the “same link” does not guarantee identical runtime environments on both sides.
A practical selection process: from node requirements to the right client
If you need an actionable selection process, follow these four steps.
Step 1: Confirm the device platform
For desktop environments, start with v2rayN; on Android, choose between v2rayNG and v2flyNG. Do not install a desktop package on Android or treat a mobile installer as a desktop core.
Step 2: Read the node protocol
Check whether the sharing link begins with vmess:// or vless://. If it comes from a subscription, update it in the client first and inspect the parameters of the specific node. The protocol name is only the first layer; continue by checking the transport and security methods.
Step 3: Identify core-specific capabilities
When you find Xray-specific capabilities such as REALITY, use correctly configured v2rayN on desktop and v2rayNG on Android. When the configuration clearly targets V2Fly and does not depend on Xray extensions, choose v2flyNG on Android to reduce cross-core variables.
Step 4: Keep versions and logs visible
The client version and core version are separate pieces of information. A client interface can open normally without its core being capable of handling newer node parameters. When a connection fails, open the logs first and distinguish configuration parsing errors, DNS errors, connection timeouts, handshake failures, and routing mistakes before deciding whether to update the core, adjust rules, or replace the node.
For users maintaining both desktop and Android devices, it is best to record the subscription source, node protocol, and core requirements rather than only the client name. This makes it quick to determine whether a node belongs in v2rayNG or v2flyNG when switching devices, and helps prevent Xray-specific configurations from being mistaken for universal V2Ray configurations.
Frequently asked questions
Are V2Ray, V2Fly, and Xray the same software?
No. V2Ray may refer to the historical core, the configuration system, or the broader technology ecosystem; V2Fly and Xray are separately maintained core paths. They share many configuration concepts, but their protocol extensions, field support, and release cadence are not identical.
Is v2rayN itself the Xray core?
No. v2rayN is a desktop client that manages nodes, subscriptions, the system proxy, and runtime configuration; Xray is the core responsible for actual network connections. When troubleshooting, check the client settings and core logs separately.
What is the main difference between v2rayNG and v2flyNG?
Both are Android clients. The key difference is the underlying path: v2rayNG uses the Xray core, while v2flyNG uses the V2Fly core. Choose v2rayNG for Xray capabilities such as REALITY; choose v2flyNG when you need to keep a V2Fly environment consistent.
Why does the same link behave differently in different clients?
Clients may use different cores, versions, default DNS settings, and routing rules. A link describes node connection parameters only; it does not synchronize the system proxy, per-app settings, or all local rules. Check each layer against the core logs.
Do VMess nodes have to use the V2Fly core?
No. Both V2Fly and Xray support VMess. The actual choice also depends on transport parameters, the client platform, the core version, and the existing routing configuration. When using v2rayN on desktop, you can still manage standard VMess nodes normally.
Can a subscription URL determine which core the client uses?
No. A subscription URL provides a node list; the application and its configuration determine which core is used. If the subscription contains parameters the current core cannot process, a node may appear in the list successfully but still fail to establish a connection.