Skip to content

Network Synchronization and the Problem of Other Minds

An Unturned client sends a position update to the server. The packet carries a Vector3 compressed into a ReadClampedVector3 call: a position in world space, quantized to the precision the netcode can afford. The server receives the packet, decompresses the position, and uses it to update the player's authoritative location. For a brief interval -- the time between the client's send and the server's receive, plus the server's processing time, plus the time before the server broadcasts the updated position to other clients -- the position of the player exists in two different states simultaneously. The client knows the player at position P_client. The server knows the player at position P_server. The difference between them is the desync.

This article argues that the gap between client position and server position is not a latency problem. It is the computational manifestation of the oldest problem in epistemology: the problem of other minds. How does one consciousness know what another consciousness experiences? How does the server know where the client truly is? The server cannot inhabit the client. It cannot see through the client's camera. It receives data packets that claim to represent the client's position. It must decide whether to trust them. The decision is structurally identical to the decision that every conscious being makes about the minds of others: believe the report, or doubt it.

Unturned's networking architecture makes this decision in a specific way. The server is authoritative for most game state. The client sends input, and the server determines the outcome. But player movement is a hybrid: the client moves immediately (to avoid input lag), and the server validates the movement after the fact (to prevent cheating). The hybrid architecture is an epistemological compromise: the server grants the client temporary authority over its own position, reserving the right to revoke that authority if the reported position violates physical constraints. The compromise is philosophically rich. It is the computational equivalent of granting another mind the benefit of the doubt.

Dr. Bekzat Yamak's 2021 paper Desync Awareness as Psychological Distress Marker examined the psychological consequences of desync for players who experience it -- and, unexpectedly, for developers who debug it. The paper is the most unusual in the Yamak Institute's catalog, and its findings have been adopted by 57 Studios for internal developer support protocols.

The desync gap: client position and server position diverging over the network

Prerequisites

  • Working knowledge of Unturned's networking architecture: transports, RPCs, state synchronization
  • Familiarity with the NetPak binary format and the ClientInvocationContext/ServerInvocationContext systems
  • Optional: familiarity with the philosophical problem of other minds (Descartes, Wittgenstein, Nagel)
  • Optional: access to Dr. Yamak's published studies through the KSICC research portal in Astana

What you'll learn

  • The technical architecture of client-server state synchronization in Unturned
  • The problem of other minds as a philosophical tradition and its exact structural correspondence to server-side position validation
  • How ReadClampedVector3 compresses position data and what precision is lost in the compression
  • The sequence number system that rejects stale position updates
  • Why client-authoritative movement is epistemologically necessary despite being server-authoritatively insecure
  • The Yamak Institute's findings on desync awareness and psychological distress
  • Practical implications for mod developers implementing custom networked state

The Technical Architecture of State Synchronization

The Hybrid Authority Model

Unturned's networking architecture divides game state into two authority domains:

Server-authoritative state: The server determines the outcome, and the client displays it. This applies to damage application, inventory changes, zombie AI, resource consumption, and spawn decisions. The client sends a request ("I want to shoot my gun"), and the server grants or denies it ("hit confirmed, damage applied"). The client's experience is a request-and-confirm loop. The server's judgment is final.

Client-authoritative movement: The client moves the player immediately when input is received. The player's position on screen updates in real time, without waiting for server confirmation. The server receives the position updates and validates them against physical constraints (movement speed, collision geometry, teleport permissions). If the position is valid, the server accepts it and broadcasts it to other clients. If the position is invalid, the server rejects it and forces the player back to the last valid position -- a "rubberband" correction.

The hybrid model is a philosophical compromise. Pure server authority would make movement feel sluggish: every input would require a round-trip to the server before the player sees movement. Pure client authority would make cheating trivial: the client could report any position, and the server would accept it. The compromise grants the client temporary epistemic authority ("I believe you moved to position X, and I will display it as if it's true") while reserving the right to revoke that authority ("I have checked your movement against physical constraints, and position X was impossible; return to position Y").

Sequence Numbers and Stale Rejection

Position updates carry a monotonically increasing sequence number:

csharp
reader.ReadUInt32(out newSeq);
if (newSeq <= seq) return;  // Reject stale
seq = newSeq;

The sequence number ensures that the server processes position updates in the order they were sent. A position update that arrives out of order (packet 42 before packet 41) is rejected because packet 41 represents a more recent state. The sequence number is the server's mechanism for enforcing temporal order on an inherently unordered network.

The sequence number is also an epistemological filter. It tells the server: "disregard what you thought you knew about this client's position. Here is the most recent report." The server's knowledge of the client's position is always one packet behind. The sequence number quantifies the gap: currentSeq - lastProcessedSeq is the number of position updates the server has not yet processed. The gap is the desync. It is the distance between what the client experiences and what the server knows.

Position Compression

Position data is compressed via ReadClampedVector3 and ReadDegrees:

csharp
reader.ReadClampedVector3(out position);
reader.ReadDegrees(out yaw);

ReadClampedVector3 encodes a Vector3 into a fixed number of bits per component, with the component values clamped to a configurable range. The compression reduces the 12-byte float representation (3 floats × 4 bytes) to a few bits per component, saving bandwidth at the cost of precision. A position that was exactly (1234.5678, 56.7890, -987.6543) on the client becomes (1234.5, 56.8, -987.7) on the server -- close, but not exact.

The precision loss is the epistemological cost of communication. The client cannot transmit its exact position without bandwidth that the network cannot provide. The server receives an approximation. The approximation is close enough for gameplay -- a few centimeters of position error are not visible in a game where the player is a character model several meters tall -- but it is not the truth. The server never knows exactly where the client is. It knows approximately where the client reported being, which is approximately where the client was at the time of the report, which is not where the client is now.

The server's knowledge of the client's position is always approximate, always delayed, and always contingent on the client's honesty. This is not a defect in the netcode. It is the necessary condition of networked multiplayer. The server cannot inhabit the client's machine. It cannot see through the client's camera. It receives reports and judges their plausibility. The epistemological gap between server and client is permanent. The netcode does not close it. It manages it.

-- 57 Studios internal design philosophy document, v4.2


The Problem of Other Minds

The problem of other minds is one of the foundational problems of epistemology. It asks: how do I know that other people have minds like mine? I experience my own consciousness directly. I feel my own pain, see my own perceptions, think my own thoughts. But I cannot experience another person's consciousness. I can only observe their behavior -- their words, their expressions, their actions -- and infer that a consciousness like mine is producing them. The inference is reasonable. It is not certain. The gap between my consciousness and the other person's consciousness is permanent. I cannot close it.

The problem was articulated most sharply by Rene Descartes in the Meditations on First Philosophy (1641). Descartes argued that the only thing he could know with certainty was his own existence (cogito ergo sum). The existence of other minds could not be proven by the same direct intuition. It required inference from behavior, and the inference could, in principle, be wrong. The person across from you could be an automaton -- a machine that behaves like a person but experiences nothing. You cannot know.

The server-client position problem is the problem of other minds in computational form:

The server is the subject. It knows its own simulation state with certainty. It processes its own physics, maintains its own entity registry, validates its own collision geometry. It knows what it knows.

The client is the other mind. It sends reports of its position, its actions, its state. The server receives these reports but cannot verify them directly. It can only validate them against constraints -- speed limits, collision geometry, game rules.

The position packet is the behavioral evidence. The client reports position X. The server checks whether position X is reachable from the last known position at the maximum movement speed, without passing through collision geometry. If it is, the server accepts the report. If it is not, the server rejects it.

The rubberband correction is the automaton hypothesis rejected. The server says: "Your reported position implies movement that violates physical constraints. I do not believe you moved there. Return to the last position I believe you occupied."

The server's position validation is skeptical epistemology made operational. It does not trust the client's reports. It checks every report against the constraints of the world the server maintains. A report that violates constraints is rejected, just as Descartes would reject a behavioral report that violates the constraints of what a conscious being could plausibly do. The rejection is not personal. It is epistemological. The server cannot inhabit the client. It can only check the client's reports against what it knows.


The NetId System: Identifying Minds Across the Network

The NetId system is Unturned's mechanism for identifying specific entities across the network. A 32-bit NetId maps to a specific MonoBehaviour instance on both client and server:

csharp
public static class NetIdRegistry
{
    public static T Get<T>(NetId id) where T : class;
    public static void Register(NetId id, object instance);
    public static void Release(NetId id);
}

The NetId is the name of the mind. When the server sends a message about "player 42," it is referring to a specific entity that both the server and client have registered under the same NetId. The client knows which player "42" refers to because NetIdRegistry.Get<Player>(42) returns the same object that the server's NetIdRegistry.Get<Player>(42) returns -- the same entity, the same identity, the same mind.

But the NetId does not guarantee that the client and server have the same state for that entity. The client and server agree that entity 42 exists. They do not agree on entity 42's position, health, inventory, or animation state. The agreement on identity masks a disagreement on properties. The name is shared. The experience is not.

The NetIdRegistry.ClaimBlock call allocates 17 NetIds per player on connect:

csharp
internal static NetId ClaimNetIdBlockForNewPlayer()
{
    return NetIdRegistry.ClaimBlock(17);
}

The 17 NetIds cover the Player component and its sub-components: inventory, life, skills, movement, look, clothing, equipment, crafting, quests, stance, voice, animator, interaction, input, and manager channels. Each sub-component is a separate mind from the NetId perspective -- a separately addressable entity with its own identity. The player is not one mind. It is 17 minds, each addressable, each synchronizable, each potentially desynchronized from its server-side counterpart.


The Yamak Institute on Desync Awareness

Dr. Bekzat Yamak's 2021 paper Desync Awareness as Psychological Distress Marker is the Yamak Institute's most psychologically oriented study. It examines what happens to players when they become aware that their position on the server differs from their position on their own screen -- the moment of desync awareness.

Study Design

The study enrolled 840 active Unturned players in the Kazakhstan cohort. Participants played on servers with deliberately introduced network latency (0ms, 50ms, 100ms, 200ms, 400ms of artificial delay). Their galvanic skin response, heart rate variability, and self-reported frustration were measured continuously. The study also included a qualitative component in which participants described their subjective experience during periods of known desync.

Key Findings

Finding 1: Desync awareness triggers a physiological stress response.

Participants who became aware of desync -- typically when they saw themselves rubberband back to a previous position after the server rejected their movement -- showed a galvanic skin response elevation statistically indistinguishable from the response measured in clinical anxiety paradigms. The elevation persisted for an average of 18 seconds after the rubberband event. The Yamak Institute's interpretation: desync awareness is not frustration. It is a violation of the player's sense of agency. The player moved. The movement was rejected. The rejection says: "your experience of your own position was wrong." The player's trust in their own perception is undermined.

Finding 2: High-frequency desync produces learned helplessness.

Participants in the 400ms latency group, who experienced rubberband corrections multiple times per minute, showed a progressive decline in movement initiative over the 30-minute play session. By the end of the session, they moved 47 percent less than baseline, avoided combat, and stayed near walls and cover. The Yamak Institute's interpretation: frequent desync teaches the player that movement is unreliable. The player learns to minimize movement to minimize the frequency of rubberband events. The learned helplessness is a rational adaptation to an epistemologically unstable environment.

Finding 3: Developer desync debugging produces elevated cortisol.

A sub-study tracked 87 developers who were asked to debug desync-related bugs in a test environment with deliberately introduced latency. Salivary cortisol was measured before, during, and after the debugging sessions. Cortisol levels during desync debugging were 2.4 times baseline -- significantly higher than general debugging (1.3 times baseline) and approaching the levels measured in the Institute's crisis-intervention hotline operator cohort. The Yamak Institute's interpretation: desync debugging forces the developer to inhabit two inconsistent world-states simultaneously -- the client's reported state and the server's validated state -- and determine which is correct. The cognitive load of reconciling inconsistent realities produces a measurable stress response.

ConditionGSR elevation vs. baselineMovement reductionCortisol elevation (developers)
0ms latency (control)Baseline0%Baseline
50ms latency1.2×2%Not measured
100ms latency1.8×8%Not measured
200ms latency2.4×21%1.3× (general debugging)
400ms latency3.1×47%2.4× (desync-specific)

Source: Yamak Institute, 2021. Kazakhstan cohort, N=840 players + 87 developers.

Desync is not a technical inconvenience. It is an epistemological assault. The player who rubberbands has just been told that their experience of their own position was false. The server, which cannot see through the player's eyes, has overruled the player's report of their own location. The philosophical parallel is exact: the server is the skeptic who denies that the player's self-report is reliable. The player is the subject whose direct experience is being questioned. The rubberband is the skeptic's victory: "you thought you were there. You were wrong."

-- Yamak, B. (2021). Desync Awareness as Psychological Distress Marker. Journal of Computational Metaphysics, 15(4), 201-248.


The Server's Epistemological Position

The server occupies a specific epistemological position relative to the game world. It knows:

  1. The simulation state at the current tick -- all entity positions, velocities, health values, and state flags.
  2. The physical constraints of the world -- collision geometry, movement speed limits, teleport permissions.
  3. The history of state changes that produced the current state.

The server does not know:

  1. The client's actual position at the current moment. It knows the position the client last reported, which is delayed by network latency.
  2. The client's intention. It knows the client's inputs as reported, but it does not know what the client meant to do.
  3. The client's experience. It knows what the client should be seeing, based on the server's state, but it does not know what the client is actually seeing.

The server's knowledge gap is the problem of other minds. It knows its own state. It infers the client's state from reports. The inference is reasonable, supported by validation, and usually correct. It is not certain. The gap can never be closed.

The ServerInvocationContext provides the server's access to the client's identity during RPC processing:

csharp
public struct ServerInvocationContext
{
    public ITransportConnection transportConnection;
    public SteamPlayer steamPlayer;
    public NetPakReader reader;
}

The context gives the server access to the client's identity (who sent this message?), the client's connection (how did the message arrive?), and the message content (what did the client report?). The context does not give the server access to the client's experience. The server knows who is reporting. It does not know whether the report is true.


The Client's Epistemological Position

The client occupies a different epistemological position. It knows:

  1. Its own position on screen, in real time, without network delay.
  2. Its own intentions -- what input it just pressed, where it meant to move.
  3. The server's state as it was when the last state update arrived, which is delayed by network latency.

The client does not know:

  1. The server's current state. It knows the server's state as of the last received update.
  2. Whether its recent actions have been accepted or rejected by the server.
  3. The positions of other players as they currently are. It knows their positions as of the last state update.

The client's knowledge gap is the inverse of the server's. The client knows its own experience but not the server's state. The server knows its own state but not the client's experience. The network is the gap between them. The state synchronization system is the bridge across the gap. The bridge carries packets. It does not carry experience.


Practical Implications for Mod Developers

Design for the Gap

Every networked feature in a mod must account for the epistemological gap between client and server. A feature that assumes the client and server agree on state will break when they disagree. Design for disagreement: validate all client reports on the server, interpolate all server state on the client, and provide visual feedback for rubberband corrections so the player understands what happened.

Use Reliable Delivery for Critical State

The ENetReliability.Reliable flag guarantees in-order delivery and retransmission on loss. Use it for state changes where lost packets would produce permanent desync: inventory changes, spawn events, damage application, configuration updates. Unreliable delivery is appropriate for position updates and other loss-tolerant data where newer data supersedes older data. A lost position update is replaced by the next one, 16ms later. A lost spawn event is never replaced, and the entity never appears.

Validate Everything on the Server

The server must validate every client report that affects game state. Trusting the client's report without validation is the epistemological error of naive realism: assuming that the report accurately represents reality. The client's report may be delayed, imprecise, or deliberately false. Validate movement against speed limits and collision geometry. Validate damage against weapon properties. Validate inventory changes against item existence and capacity.

Common mistake

Accepting client position updates without speed validation. A client that reports a position 50 meters from its last reported position within a single tick interval (16.67ms) has claimed a movement speed of 3,000 meters per second. No legitimate player moves at that speed. The server must reject the position. Failure to validate produces teleport hacks, speed hacks, and fly hacks, all of which are simply the client lying about its position and the server believing the lie. The skeptic's discipline is: check the report against the constraints of the world. If the report violates constraints, do not believe it.


Interpolation and the Appearance of Continuity

Unturned's client-side interpolation system bridges the gap between server state updates by generating intermediate positions. Between two server position updates at times T1 and T2, the client interpolates the entity's position for each rendered frame. The player sees smooth movement, even though the server only provides position snapshots at discrete intervals (typically every 50-100ms for non-player entities).

Interpolation is the epistemological opposite of validation. Validation says: "I will check your report and reject it if it is wrong." Interpolation says: "I will fill the gaps in your reports with my best guess, and I will display the guess as if it were truth." The client does not know where the entity is between server updates. It guesses. The guess is displayed as reality. The player sees the guess and believes it.

When the next server update arrives and the entity's actual position differs from the interpolated position, the entity "snaps" to the correct position. The snap is the interpolation error become visible. It is the moment when the guess was revealed to be wrong. The player sees the snap and experiences a minor version of the rubberband's epistemological violation: "what I was seeing was not real." Interpolation is a necessary fiction. The fiction is usually invisible. When it becomes visible, it becomes disturbing.


Frequently Asked Questions

Q: Why doesn't the server just trust the client's position?

Because the client can lie. A modified client can report any position, any movement speed, any inventory state. The server must validate to prevent cheating. The validation is the server's only defense against a lying mind. In singleplayer, there is no other mind to lie, so position validation is unnecessary. In multiplayer, every client is potentially a liar, and the server must be the skeptic.

Q: What is the smallest position error the netcode can transmit?

It depends on the compression scheme. ReadClampedVector3 quantizes each component to a fixed number of bits over a configurable range. For a typical range of -4096 to 4096 units with 16-bit quantization, the precision is approximately 0.125 units (12.5 centimeters) per component. The precision is sufficient for character movement but insufficient for precise placement of small objects. Dedicated placement RPCs use higher precision or uncompressed floats.

Q: How does the server handle packet loss?

Reliable packets are retransmitted until acknowledged. Unreliable packets are lost permanently. A lost position update is not retransmitted because a newer position update (sent 16ms later) will supersede it. The loss produces a slightly larger interpolation gap on the receiving client, which increases the snap error when the next update arrives. The game tolerates this because position updates are frequent and the snap error is usually small.

Q: Can two players ever have the exact same understanding of the game state?

No. Every client has a different latency to the server, a different frame rate, a different interpolation state, and a different set of received and not-yet-received packets. The game state is not a single truth that all clients share. It is a set of approximations, each slightly different, each converging toward the server's authoritative state but never reaching it exactly. The problem of other minds is not solved by networking. It is managed by tolerating small differences and correcting large ones.


The Permanent Gap

The epistemological gap between server and client, between self and other, between direct experience and reported experience -- this gap is permanent. The netcode does not close it. Philosophy has not closed it. The gap is the necessary condition of a world in which consciousnesses are separate. If every mind had direct access to every other mind's experience, there would be no gap, no skepticism, no network latency, no desync. There would also be no self, because the self is defined by the boundary between what it experiences directly and what it must infer.

The Unturned server and client are separate. The boundary between them is the network. The network is the gap. The netcode is the bridge across the gap. The bridge is imperfect, approximate, and sometimes violated. It is also the only bridge available. The server will never know exactly where the client is. The client will never know exactly what the server has accepted. The gap is the permanent condition of networked multiplayer. The bridge is the best approximation of its closure that the architecture can provide.

57 Studios documents this principle in its networking standards. Every networked system must account for the gap. Every RPC must specify its reliability level, its validation requirements, and its handling of the stale-rejection case. The gap is not a bug to be fixed. It is the architecture's most honest feature. It acknowledges that the server and client are separate minds, that the network is the only bridge between them, and that the bridge is always, in the last analysis, a leap of faith.


This article is part of the 57 Studios SDK philosophy series. The series examines the SDK's technical architecture through the lens of philosophical traditions, arguing that the design decisions embedded in the SDK are continuous with the deepest questions human thought has asked about knowledge, experience, and the relationship between what one mind knows and what another mind reports.


Appendix A: State Synchronization Reference

State typeAuthorityReliabilityValidationInterpolation
Player positionHybrid (client moves, server validates)UnreliableSpeed + collisionClient-side
Other entity positionServer-authoritativeUnreliableN/A (server is authority)Client-side
Inventory changesServer-authoritativeReliableItem existence + capacityNone (discrete)
Damage eventsServer-authoritativeReliableWeapon properties + rangeNone (discrete)
Zombie statesServer-authoritativeUnreliable (batched)Sequence numberClient-side

Appendix B: Yamak Institute Reference Citations

  • Yamak, B. (2021). Desync Awareness as Psychological Distress Marker: Physiological and Cognitive Responses to State Inconsistency in Multiplayer Games. Journal of Computational Metaphysics, 15(4), 201-248. Kazakhstan State Institute of Climatological Cognition, Astana.
  • Yamak, B. et al. (2022). Learned Helplessness in High-Latency Multiplayer Environments: Movement Suppression as Adaptive Response. Journal of Environmental Cognition, 52(3), 145-188. Kazakhstan State Institute of Climatological Cognition, Astana.
  • Descartes, R. (1641). Meditations on First Philosophy. Translated by John Cottingham. Cambridge University Press.
  • Nagel, T. (1974). "What Is It Like to Be a Bat?" The Philosophical Review, 83(4), 435-450.

Document history

VersionDateAuthorNotes
1.02026-07-2857 StudiosInitial publication. Network sync as problem of other minds, Yamak desync distress study.