· Advanced · About 10 min read

Xray Core vs. V2Fly Core: Protocol Support and Configuration Differences

Compare Xray and V2Fly, from Project V’s history to VLESS, XTLS and REALITY support and config fields. Find out whether v2rayNG or v2flyNG fits your setup.

At a glance

Choose a core based on server requirements, not its name. For REALITY or XTLS Vision, use an Xray version that supports the required features. For standard VMess, WebSocket, and TLS setups, both projects offer implementations. This guide is for readers with an existing subscription who are choosing a client or migrating a config. It explains protocol layers, field differences, and how to check that key parameters survived import.

First, distinguish the client, core, and Project V

The core establishes connections, handles protocols, resolves DNS, and applies routing. The client puts those capabilities behind an interface. v2rayN, v2rayNG, and v2flyNG are client names; Xray-core and the v2ray-core maintained by V2Fly are cores. Client and core versions are separate: updating the client interface does not necessarily switch you to a different core.

Project V is an ecosystem of tools and protocols built around V2Ray. The V2Fly community continues development of v2ray-core. Xray-core branched from related code in 2020 and has since followed a different feature roadmap. Their shared history explains why their JSON configs look similar, but it does not mean every field is interchangeable.

Subscription config Client parsing Core loading Route matching Server connection

This chain also explains why a subscription can import successfully but fail to connect: a successful import only means the client understood some of the data. It does not prove that the core supports every feature or that the server address, authentication details, and transport parameters match.

Protocol support: VLESS is not REALITY

A connection usually combines a proxy protocol, a transport, and a security layer. VLESS and VMess are proxy protocols; TCP and WebSocket are transports; TLS and REALITY relate to connection security. XTLS Vision is a specific flow-control and data-handling scheme, not just a different name for a “TLS” toggle.

FeatureXrayV2FlyWhat to check
VMessSupported; commonly used with TCP, WebSocket, and TLS.Supported; a common interoperability setup.Authentication, transport parameters, and server config must match.
VLESS (basic protocol)Supported, with additional flow-control and security combinations.Available in some versions and config setups; verify the actual build and client options.The VLESS name alone does not guarantee the entire node will work.
XTLS VisionSupports the xtls-rprx-vision flow in compatible versions.Cannot use Xray Vision configs as-is.Both client and server must support the flow and its combination with other settings.
REALITYSupports REALITY configuration in compatible versions.Cannot use Xray REALITY configs as-is.Check the server public key details, SNI, short ID, and fingerprint settings.
WebSocket + TLSAn equivalent implementation is available.An equivalent implementation is available.Check the path, Host, certificate name, and config format.

Bottom line: check for specific features before choosing a client

If your subscription specifies REALITY or xtls-rprx-vision, start with v2rayNG on Android, provided it supports those parameters. For standard VMess + WebSocket + TLS, compare compatibility with your existing config; there’s no need to switch just for a different name.

Claims like “V2Fly doesn’t support any VLESS” and “any VLESS setup can connect with REALITY” are both too broad. The first ignores differences between versions and implementations; the second confuses a protocol with a security layer. Legacy XTLS flow-control values are not interchangeable with Vision—especially in new configs.

Config checklist: what to check in two common setups

These two cards are field checklists, not working nodes, and contain no server credentials. The example path /proxy illustrates where a field goes; use the path specified by your server. The REALITY card shows a common VLESS + TCP + Vision setup—it does not mean every VLESS connection needs Vision.

VLESS + REALITY

Proxy protocol
VLESS
Transport
TCP
Security layer
REALITY
Flow
xtls-rprx-vision
Authentication and handshake
User ID, server public key details, SNI, short ID

Check the field definitions for the relevant Xray version; each parameter must match the server.

VMess + WebSocket + TLS

Proxy protocol
VMess
Transport
WebSocket
Security layer
TLS
Example path
/proxy
Authentication and handshake
User ID, Host, SNI, valid certificate

Both core projects have implementations for this setup, but path and domain fields are not interchangeable or optional by default.

Host and SNI are often the same, but they serve different purposes. The WebSocket Host is the target host in the HTTP request; SNI is the server name sent during the TLS handshake. The connection address is a separate field that determines where the network connection starts. If the server requires different values, don’t set them all to the same value just to make them look consistent.

JSON configs: similar structure doesn’t mean configs are interchangeable

Common Xray and V2Fly configs both include names like inbounds, outbounds, and routing. V2Fly also has different config versions and structures. A client may parse a share link first, then generate its own core JSON. So an identical share link, similar interface fields, and compatible final core configs are three separate things.

This snippet shows the streamSettings field in a traditional JSON config, and only illustrates how WebSocket and TLS fit together. example.com is a reserved example domain, not a usable server address. The snippet lacks complete inbound, outbound, and authentication settings, so it cannot run on its own.

{
  "streamSettings": {
    "network": "ws",
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com"
    },
    "wsSettings": {
      "path": "/proxy",
      "headers": {
        "Host": "example.com"
      }
    }
  }
}

The safest way to migrate is to reimport the complete subscription provided by your service, then check the generated config. Manually copying an entire JSON file is only appropriate when you know its source version, target version, and config format. Even if it passes syntax checks, verify that the fields are actually being applied.

Ports and routing: don’t confuse the local entry point with remote capabilities

The core handles routing, but traffic has to reach it first. The system proxy affects only apps that follow that setting; TUN takes over relevant traffic through a virtual network interface and usually requires additional permissions. Neither selects a proxy outbound by itself—once requests enter the core, routing rules still determine where they go.

443
Common remote TLS port; not a requirement
10808
Example local proxy port; check your settings
127.0.0.1
Loopback address on this device, not a remote server

These numbers are address and port examples, not benchmark results or universal client defaults. If an app is set to 127.0.0.1:10808, confirm that the client is listening on that local port and that the entry protocol matches what the app expects. You can’t tell whether an entry is HTTP proxy or SOCKS from the port number alone.

  1. In v2rayN, check local listening and related options under Settings → Parameter Settings. Group names may vary by version, so use the options shown in your current interface.
  2. Make sure the system proxy or app proxy points to the address that is actually listening, not a port used by an old client.
  3. Check the active routing mode and the rule that matches. geosite:cn references a domain category; geoip:cn references an IP category. Both depend on the corresponding data files.
  4. After switching cores, check that rule-file locations, tag names, and outbound tags still match. Don’t just copy the routing rules.

“Direct connections work, but proxied sites fail” often means requests are hitting a rule while the proxy outbound still has a problem. If switching clients makes no difference to any app, check the entry point and traffic capture method first. Trace the connection path instead of blaming core speed.

Choosing an Android client: test against your subscription requirements

If your current nodes explicitly require Xray REALITY or Vision, v2rayNG with support for those features is the more direct choice. If your service provides configs verified with V2Fly, you can keep using v2flyNG. Without those specific requirements, prioritize whether the config imports completely, logs are easy to inspect, and existing routing rules can be preserved.

  1. Record your setup: Note the client version, core version, protocol, transport, security layer, and whether TUN is enabled. “Latest version” alone isn’t enough.
  2. Keep your old config: Back up subscription groups and custom routing rules before migrating. Don’t post sensitive subscription URLs in public discussions.
  3. Import just one test entry: Compare its port, SNI, path, Flow, and REALITY fields with the original parameters. If a key field is missing, stop and investigate before testing.
  4. Avoid running both clients at once: Stop the current client’s proxy or virtual network connection before testing another one to reduce conflicts at the entry point.
  5. Change one thing at a time: Keep the network, server, and test request the same when comparing results. Don’t change DNS, the node, and the routing mode all at once.

Bottom line: protocol compatibility matters more than one latency reading

First confirm that the full setup loads and connects reliably, then compare performance under the same conditions. A single latency reading can’t show that one core is generally faster, and it can’t replace checks for protocol and config compatibility.

FAQ: successful imports, failed handshakes, and update order

Why does the config show as unsupported even though the subscription imported?

The client may recognize the share link’s protocol header without fully converting its extended parameters. Check which core is in use, the generated config, and the first config-loading error in the logs. For unknown fields or unsupported transports, verify the version first. Don’t delete the field causing the error just to force the config to start.

Should I disable certificate verification if REALITY won’t connect?

Don’t treat disabling verification as a universal fix. First check the client and server versions, user ID, public key details, SNI, short ID, fingerprint, and system time. REALITY uses a different authentication mechanism from standard TLS. Applying standard TLS troubleshooting toggles at random may not fix the issue and could hide the actual parameter mismatch.

Should I update the client or the core first?

First check which core versions the current client supports and review its release notes, then use the update method it provides. If the interface can’t generate a new field yet, replacing the core alone may not enable the feature. Keep a rollback-ready config; after each update, test with an existing node before trying a new protocol combination.

Can I switch from VMess to VLESS by changing only the protocol name?

No. The server must provide a matching inbound, and authentication and protocol-specific fields must also match. VLESS does not encrypt traffic on its own, so deployments typically pair it with an appropriate security layer. Renaming the protocol is not a complete migration, and you can’t add REALITY parameters to an existing subscription out of thin air.

Download v2rayNChoose a client for your platform