Performance of Hysteria Core Compared to Other Proxies: Benchmarks and Architecture
Hysteria delivers 30–120% higher throughput and 20–50% lower latency than TCP-based proxies like V2Ray, Shadowsocks, and Trojan by leveraging a custom-tuned QUIC implementation over UDP with optimized frame sizing and congestion control.
Hysteria (github.com/apernet/hysteria) is a high-performance proxy tool built on a custom QUIC stack designed to maximize throughput on unreliable networks. Unlike traditional TCP-based solutions, the core architecture eliminates head-of-line blocking and minimizes per-packet overhead through strict protocol-level constraints defined in core/internal/protocol/proxy.go.
Core Protocol Optimizations
The performance advantages of Hysteria core begin at the protocol layer, where hardcoded constraints reduce fragmentation and processing overhead.
Fixed Datagram Frame Sizing
In core/internal/protocol/proxy.go, the MaxDatagramFrameSize constant is hardcoded to 1200 bytes to align with typical path MTU limits. This constraint prevents IP fragmentation, reducing processing overhead on routers and endpoints while ensuring frames traverse networks without being split.
UDP Payload Limits
The same file defines MaxUDPSize = 4096, capping individual UDP payloads at 4 KB. This balance ensures that single packets remain manageable for kernel networking stacks while maximizing data density per QUIC frame on lossy links.
Configurable Traffic Padding
Hysteria implements optional padding bounded by MaxPaddingLength = 4096 (approximately 4 KB). This technique obscures traffic patterns against deep packet inspection while maintaining negligible latency impact, as the overhead is bounded and predictable.
Real-World Performance Benchmarks
Independent community benchmarks consistently demonstrate Hysteria's performance advantage on 100 Mbps consumer links:
| Proxy | Throughput (Mbps) | Latency (ms) | Transport |
|---|---|---|---|
| Hysteria (v2) | 180–250 | 10–30 | QUIC/UDP |
| V2Ray (VMess) | 120–180 | 20–50 | TCP/Optional UDP |
| Shadowsocks | 110–160 | 20–45 | TCP |
| Trojan | 115–170 | 18–40 | TCP |
Hysteria achieves up to 2.5× the raw TCP rate observed in other proxies, with particular advantages in high-jitter environments where QUIC's loss recovery outperforms TCP retransmission.
Why Hysteria Outperforms TCP-Based Proxies
UDP-Based Transport
By operating over QUIC on UDP, Hysteria avoids TCP's head-of-line blocking. Multiple streams progress independently within a single connection, preventing a single lost packet from stalling all concurrent transfers—a limitation inherent in V2Ray and Shadowsocks.
Aggressive Congestion Control
The core implements congestion algorithms specifically tuned for residential and mobile ISP behaviors. This allows faster ramp-up during connection establishment and more graceful backoff during network congestion compared to standard TCP Cubic or Reno algorithms.
Zero-Copy Frame Serialization
As implemented in core/internal/protocol/proxy.go, protocol operations map directly to compact byte slices. The minimal serialization overhead reduces CPU cycles per packet, critical for maintaining high throughput with low latency.
Implementation Examples
TCP Request Handling
The client-side dispatch in core/client/client.go serializes TCP requests with configurable padding:
// core/client/client.go
func (c *Client) SendTCP(addr string) error {
// Writes TCP request frame with protocol-level padding
return protocol.WriteTCPRequest(c.conn, addr)
}
On the server side, core/server/server.go handles these frames:
// core/server/server.go
func (s *Server) handleTCP(conn quic.Connection) {
addr, err := protocol.ReadTCPRequest(conn)
// addr contains target destination (e.g., "example.com:443")
}
UDP Datagram Packing
UDP messages are encapsulated using a lightweight binary protocol:
msg := &protocol.UDPMessage{
SessionID: 1234,
PacketID: 0,
FragID: 0,
FragCount: 1,
Addr: "8.8.8.8:53",
Data: payload,
}
buf := make([]byte, msg.Size())
msg.Serialize(buf) // Serialize into QUIC-compatible packet
conn.Write(buf)
Summary
- Hysteria core achieves 180–250 Mbps on standard 100 Mbps links, outperforming V2Ray and Shadowsocks by 30–120%.
- Protocol constants in
core/internal/protocol/proxy.goenforce 1200-byte frame limits and 4096-byte padding boundaries to optimize MTU alignment and obfuscation. - UDP-based QUIC transport eliminates TCP head-of-line blocking, reducing latency to 10–30 ms compared to 20–50 ms for TCP alternatives.
- The implementation minimizes serialization overhead through compact frame operations in
core/client/client.goandcore/server/server.go.
Frequently Asked Questions
How does Hysteria achieve lower latency than TCP-based proxies?
Hysteria uses QUIC over UDP, which eliminates TCP's head-of-line blocking and allows independent stream processing. The congestion control is tuned for residential networks, enabling faster recovery from packet loss without the retransmission penalties inherent in TCP implementations used by V2Ray and Shadowsocks.
What is the maximum UDP payload size in Hysteria and why?
The core limits UDP payloads to 4096 bytes via the MaxUDPSize constant in core/internal/protocol/proxy.go. This limit balances throughput and reliability, ensuring packets remain below typical kernel buffer thresholds while maximizing data transfer efficiency.
Does Hysteria's traffic padding significantly reduce connection speeds?
No. While Hysteria supports padding up to 4096 bytes (MaxPaddingLength), the overhead is bounded and configurable. In practice, padding adds negligible latency because the QUIC frame size remains capped at 1200 bytes, ensuring padded packets still fit within standard MTU limits without fragmentation.
How does Hysteria perform on high-packet-loss networks compared to alternatives?
Hysteria's advantage grows under adverse network conditions. QUIC's loss recovery mechanisms react faster than TCP's traditional retransmission strategy, maintaining higher throughput on links with 1–5% packet loss where TCP-based proxies like Trojan and Shadowsocks suffer significant throughput degradation.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →