Skip to main content

Overview

Server reflexive candidates (srflx) are discovered using STUN (Session Traversal Utilities for NAT) servers. They represent the public IP address and port mapping allocated by a NAT device, enabling peer-to-peer connections across NATs.

CandidateServerReflexive

A server reflexive candidate represents a public address binding allocated by a NAT, discovered through STUN.
candidate_server_reflexive.go
Server reflexive candidates embed candidateBase which provides common functionality like priority calculation, marshaling, and traffic tracking.

Creating Server Reflexive Candidates

NewCandidateServerReflexive

Creates a new server reflexive candidate from the provided configuration.
*CandidateServerReflexiveConfig
required
Configuration for the server reflexive candidate.
Returns the created CandidateServerReflexive or an error if the configuration is invalid (e.g., invalid IP address).

CandidateServerReflexiveConfig

Configuration structure for creating server reflexive candidates.
candidate_server_reflexive.go

Configuration Fields

string
Unique identifier for the candidate. If empty, a UUID will be automatically generated.
string
required
Network protocol: “udp”, “tcp”, “udp4”, “udp6”, “tcp4”, or “tcp6”.
string
required
The public IP address discovered via STUN (the reflexive address).
int
required
Port number of the public address.
uint16
required
Component identifier. Use ComponentRTP (1) for RTP or ComponentRTCP (2) for RTCP.
uint32
Custom priority value. If 0, priority will be calculated automatically. Server reflexive candidates have a type preference of 100.
string
Custom foundation string. If empty, foundation will be calculated as a CRC32 checksum of the candidate type, address, and network type.
string
required
The base (local) IP address from which the STUN request was sent.
int
required
The port of the base (local) address.

Examples

Creating a Server Reflexive Candidate

Creating an IPv6 Server Reflexive Candidate

STUN Usage

Server reflexive candidates are discovered through the STUN protocol. The typical discovery process is:
  1. Send STUN Binding Request - Send a STUN request from a local interface to a STUN server
  2. Receive STUN Response - The STUN server responds with the public IP and port it observed
  3. Create Candidate - Create a server reflexive candidate with the discovered address
  4. Set Related Address - Record the local interface as the related address

Example STUN Integration

Priority Calculation

Server reflexive candidates have a type preference of 100:
This makes them less preferred than host candidates (126) and peer reflexive candidates (110), but more preferred than relay candidates (0).

When to Use Server Reflexive Candidates

Server reflexive candidates are essential when:
  • Peers are behind different NATs
  • Direct peer-to-peer connections need NAT traversal
  • You want to avoid TURN server overhead
  • The NAT allows inbound traffic after outbound binding
  • Both peers can reach public STUN servers

NAT Compatibility

Server reflexive candidates work with most NAT types:
Compatible
Works perfectly. Single public binding for all destinations.
Compatible
Works well. Requires coordination between peers.
Compatible
Works with ICE connectivity checks.
Limited
May require peer reflexive candidates or relay candidates.
The related address for a server reflexive candidate is the base (host) candidate from which it was derived:
This is useful for:
  • Debugging NAT behavior
  • Understanding address mappings
  • Diagnostics and logging

Connection Characteristics

Advantages:
  • Direct peer-to-peer connectivity through NAT
  • No media relay required
  • Lower latency than relay candidates
  • No server bandwidth costs for media
  • Works with most NAT types
Disadvantages:
  • Requires STUN server for discovery
  • May not work with symmetric NATs
  • Higher priority than relay but lower than host
  • Depends on NAT binding timeout

Common Patterns

Multiple STUN Servers

Query multiple STUN servers for redundancy:

Caching STUN Results

Cache discovered public addresses to avoid repeated STUN queries:
NAT bindings typically have timeouts (often 30-300 seconds). Ensure keepalives are sent to maintain the binding if long-lived connections are needed.

See Also