# Game Lag White Paper > A white paper that explains 228 causes of lag in online games (stutter, teleporting, rubber-banding, fast-forward, input lag, freeze, disconnect, and more), from your screen to the server’s database, organized into 13 layers and 3 topics (netcode design, problems only some players hit, and TCP retransmission). It focuses on MMO cases, but most of it applies to online games of any genre. For each cause it gives the three-step Why → Effect → On screen chain, related symptoms, ballpark numbers, the owning team (game team, infra team, or external) with action items for each team, the graph shape and how to confirm it, and authoritative sources (RFCs, official kernel, OS, cloud, engine, and database documentation, research papers). Each cause has an ID (e.g., mem-gc) and its own page (e.g., https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-gc.html). Numbers are typical values for a common production setup; defaults and versions are backed by the sources on each cause page. When citing, link to the cause page. MIT License. This edition is a translation of the Korean original: https://jungrok5.github.io/mmo-lag-anatomy/ ## Docs - [Full content (Markdown)](https://jungrok5.github.io/mmo-lag-anatomy/en/llms-full.txt): Every cause, symptom, owner, glossary term, and source in one file - [Text edition](https://jungrok5.github.io/mmo-lag-anatomy/en/text.html): The same content as a single HTML page that works without JavaScript - [Game Lag White Paper](https://jungrok5.github.io/mmo-lag-anatomy/en/): Interactive version with figures and hands-on simulations ## Causes by symptom - [Stutter](https://jungrok5.github.io/mmo-lag-anatomy/en/s/stutter.html): 60 causes. Movement isn’t smooth: it keeps pausing briefly and moving again. - [Teleporting](https://jungrok5.github.io/mmo-lag-anatomy/en/s/teleport.html): 47 causes. A character moves to a distant spot in one step, with no movement in between. - [Rubber-banding](https://jungrok5.github.io/mmo-lag-anatomy/en/s/rubber.html): 14 causes. Your character runs forward, then gets dragged back to where it just was. - [Fast-forward](https://jungrok5.github.io/mmo-lag-anatomy/en/s/burst.html): 36 causes. A frozen screen starts moving again, and the backlog of movement, hits, and damage plays out all at once at high speed. - [Slow motion](https://jungrok5.github.io/mmo-lag-anatomy/en/s/slowmo.html): 24 causes. Everything moves slowly. Skill casts and monster movement look stretched out. Depending on the server design, speed can stay normal while it shows up as stutter or teleporting. - [Input lag](https://jungrok5.github.io/mmo-lag-anatomy/en/s/delay.html): 76 causes. It takes a while from pressing a button to seeing the result. The screen itself can still be smooth. - [Freeze](https://jungrok5.github.io/mmo-lag-anatomy/en/s/freeze.html): 67 causes. Everything on screen stops for a moment (0.5 s to a few seconds), then moves again. - [Dropped action / rollback](https://jungrok5.github.io/mmo-lag-anatomy/en/s/dropped.html): 36 causes. Something you definitely did never happened, or its result gets reversed much later. - [Disconnect](https://jungrok5.github.io/mmo-lag-anatomy/en/s/disconnect.html): 51 causes. The connection drops mid-game and you land back at the login screen or a reconnect dialog. - [Can’t connect / infinite loading](https://jungrok5.github.io/mmo-lag-anatomy/en/s/noconnect.html): 45 causes. You can’t get into the game, or you’re stuck on a loading or entry screen. - [Invisible / ghost entities](https://jungrok5.github.io/mmo-lag-anatomy/en/s/invisible.html): 20 causes. NPCs, monsters, or players that should be there are missing only on your screen, or entities that are already gone remain only on your screen. ## L1 Client game process - [Frame time spike](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-hitch.html): One frame takes several times longer than usual to compute, so the screen freezes for a moment. - [Client garbage collection](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-gc.html): The whole game freezes while it reclaims memory that was used and thrown away (garbage). The telltale sign is stutter at regular intervals. - [Synchronous loading and shader compilation on the main thread](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-sync-load.html): The game freezes to read files and build shaders right before it draws an area, monster, or effect for the first time. - [Slow storage delays asset streaming](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-asset-stream.html): On slow storage such as an HDD, reading open-world textures and models can’t keep up with movement, so objects appear late or the game stutters while it waits for reads. - [Rendering load from large crowds](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-crowd.html): When hundreds of players fill one screen, as in a siege or a world boss fight, the cost of drawing them is more than the device can handle. - [Packet processing bottleneck on the main thread](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-net-mainthread.html): If the client processes only a fixed amount of received packets per frame, a flood of packets keeps getting pushed to the next frame. - [Missing or too-short interpolation buffer](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-no-buffer.html): If the client draws server packets the moment they arrive, jitter (variation in packet arrival times) shows up directly on screen. - [Excessive extrapolation (dead reckoning)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-extrap.html): While no packets arrive, the client keeps showing characters moving at their last velocity, then snaps them back when it turns out to be wrong. - [Client-side prediction mismatch](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-predict.html): Your client shows your character moving before the server confirms it, but if the server calculates something different, your character gets pulled back. - [Fixed-timestep catch-up spiral](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-fixed-step.html): After one stall, the game runs its backlog of calculations all at once, and that extra work puts it behind again. - [Clock sync error](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-clock.html): If the client’s estimate of the server time is wrong, interpolation timing and cooldown checks drift out of step with the server. - [Float time precision loss](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-float-time.html): If the game keeps its clock in a low-precision floating-point type (float), the longer it runs, the worse its time resolution (the smallest time difference it can tell apart) becomes, and movement and effects start to shake. - [V-Sync and the render queue](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-vsync.html): Input is delayed while several finished frames wait in a queue to be sent out in step with the monitor’s refresh. - [Client memory leak](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-leak.html): The longer the game stays open, the more memory it uses; it gets slower and slower until the game is eventually force-closed. - [Client crash](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-crash.html): An unhandled error closes the game. To the player it looks like a disconnect, but the server is fine. - [Anti-cheat scans](https://jungrok5.github.io/mmo-lag-anatomy/en/c/cg-anticheat.html): The anti-cheat module that runs alongside the game to block cheats scans the system periodically. If a scan is heavy, or the heartbeat (a periodic keepalive signal) to the anti-cheat server is late, the game stutters or disconnects. ## L2 Client OS and device - [Background processes taking up CPU](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-background.html): When an antivirus scan, Windows Update, streaming software, or a browser video takes over CPU cores, the game thread has to wait for CPU time. - [Power saving and thermal throttling](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-power.html): Laptop battery mode, phone power-saving mode, and device heat slow down the CPU and GPU. With heat, the telltale sign is that the game runs fine at first and slows down only after a while. - [Timer resolution](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-timer.html): Windows’ default timer ticks every 15.6 ms, so “sleep for just 1 ms” actually lasts until the next timer tick, up to 15.6 ms. - [Mobile app sent to the background](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-mobile-bg.html): If you leave the game for a moment to check a notification, the OS suspends the app a few seconds later, and meanwhile the server disconnects you. - [Wi-Fi ↔ LTE/5G switching](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-netswitch.html): When you walk out of the house and your phone drops Wi-Fi for LTE or 5G, your IP address changes and the existing connection stops working. - [Packet inspection by security software](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-security.html): When antivirus software or a firewall inspects every packet, latency goes up, and in bad cases it mistakes the game for an attack and blocks it. - [Receive buffer overflow](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-rcvbuf.html): If the game is busy and pulls packets out of the socket (the network send/receive interface the OS provides) late, the OS buffer overflows. - [Client low on memory and swapping](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-swap.html): With dozens of browser tabs open alongside the game, the OS moves part of the game’s memory out to disk. - [Out of graphics memory (VRAM)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-vram.html): When the graphics settings need more memory than the graphics card has, the OS moves textures out to system memory and brings them back, and the game stutters. - [Wi-Fi background scanning](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-wifi-scan.html): Communication pauses briefly while the OS periodically hops across channels to look for nearby Wi-Fi networks. - [NIC power saving and driver issues](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-driver.html): When a network card or Wi-Fi chip enters a power-saving state between packets, it takes time to wake back up. - [Other apps on the same device using up bandwidth](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-other-apps.html): When cloud sync, a large download, or a game patch runs on the same PC, game packets have to wait in a queue. - [Throttling when the window is minimized or unfocused](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-unfocused.html): When you switch to another window or minimize the game, the game and Windows slow it down to save power. When you come back, the backlog of packets floods in, or you’ve already been disconnected. - [Overlay software interference](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-overlay.html): Chat apps, launchers, recording tools, and FPS counters hook into the game’s rendering to draw their own UI on top of the game screen (hooking). That adds work to every frame and sometimes clashes with the game, causing hitches or crashes. - [Display, input device, and frame generation latency](https://jungrok5.github.io/mmo-lag-anatomy/en/c/co-display-input.html): If ping is normal but controls feel heavy, a TV’s video processing, a wireless controller, or frame generation may be adding delay between your input and the screen. ## L3 Home network - [Wi-Fi interference and weak signal](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-wifi.html): With a weak signal or interference, packets get resent several times over the wireless link, so they arrive unevenly. - [Congested Wi-Fi channel](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-channel.html): Where there are dozens of routers, as in an apartment building, they share the same channel and have to wait for a chance to transmit. - [Bufferbloat (router queue)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-bufferbloat.html): When someone in the household uploads a video or downloads a large file, hundreds of ms worth of packets pile up in the router’s queue, and game packets wait behind them. - [NAT mapping expiry](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-nat.html): Routers remove idle connections that haven’t carried packets for a while from their NAT table. It’s a common reason the connection drops the moment you move after standing still. - [Underpowered or overheating router](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-router.html): When dozens of devices and thousands of connections pile onto a cheap router, the router itself can’t keep up. - [Cell tower handover (while moving)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-handover.html): When you travel by bus or subway, the connection drops out while your phone switches cell towers. - [RRC state transition delay (mobile radio power saving)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-rrc.html): When a phone has no traffic for a while, it drops its radio connection to a low-power state, and the next packet is delayed while it powers back up. - [Weak mobile signal and dead zones](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-weak-cell.html): In elevators, basements, and deep inside buildings, retransmissions increase, speed drops, and eventually the connection drops. - [Frequent 5G↔LTE switching (at 5G coverage edges)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-5g-flip.html): Inside buildings with weak 5G signal or at the edge of 5G coverage, the phone switches between 5G and LTE often, and each switch causes a ping spike or a brief dropout. - [Public Wi-Fi and corporate network restrictions](https://jungrok5.github.io/mmo-lag-anatomy/en/c/hn-captive.html): A café Wi-Fi login page or a corporate firewall blocks the game’s connection. ## L4 Internet path - [Propagation delay (physical distance)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-distance.html): Even light travels only about 200,000 km per second in optical fiber. A distant server is slow no matter how good it is. - [Satellite internet (LEO/GEO)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-satellite.html): Satellite signals have to travel to space and back. With geostationary satellites the round trip alone exceeds 0.5 seconds. Low Earth orbit satellites such as Starlink are usually fast, but latency fluctuates and the link can drop briefly at the moment routes are reassigned. - [Detour routing](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-routing.html): Because of interconnection agreements between ISPs, traffic to even a nearby server can take a long way around. - [Peak-hour congestion at peering links](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-peak.html): Around 9–11 PM, video traffic surges and the links between ISPs (peering) tend to get congested. - [Submarine cable / international link outage](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-cable.html): When a submarine cable is cut, traffic takes long detours for weeks (sometimes months) until it is repaired, and the remaining links get congested. - [BGP route changes and convergence](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-bgp.html): When internet routing information changes, packets are lost for the few seconds to tens of seconds (rarely a few minutes) it takes to converge again. - [One faulty ECMP path](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-ecmp.html): ISPs and data centers keep several paths to the same destination and send each connection down one of them. If a single path fails, only the players assigned to it keep lagging. - [ISP throttling and traffic management](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-shaping.html): When you go over your data allowance, or on plans that manage certain kinds of traffic, packets get delayed or dropped. - [Country- or ISP-level UDP restrictions and packet inspection](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-udp-block.html): Some networks block specific UDP addresses and ports or throttle UDP, and packet inspection equipment filters out protocols it doesn’t recognize. Games that communicate over UDP can’t connect on those networks or disconnect often. - [Poor line quality](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-line.html): Loose connectors, old wiring, or a faulty modem cause steady packet loss and periodic line drops. - [DNS failures and delays](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-dns.html): If DNS, which turns server names into addresses, is slow or fails, the game can’t find its login or patch servers. - [Shared links saturated by DDoS](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-ddos-path.html): Massive attacks aimed at the game company, or at someone else on the same network, fill up shared links. - [ISP-shared IP addresses (CGNAT)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-cgnat.html): Mobile networks and some ISPs have many subscribers share one IP address, and they delete the mappings of idle connections after a short time. - [Routing through a VPN or game booster](https://jungrok5.github.io/mmo-lag-anatomy/en/c/isp-vpn.html): With a VPN or game booster on, packets go through that company’s relay servers. If the relay is far away or busy, the connection can actually get slower. ## L5 Data center network equipment - [Firewall session table full](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-firewall.html): A firewall tracks every connection it lets through by recording it in a session table. Once the table is full, it can’t accept new connections. - [DDoS protection detours and false positives](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-ddos.html): Diverting traffic to a scrubbing center to stop attacks makes the route longer, and legitimate players are sometimes mistaken for attackers and blocked. - [Load balancer idle timeout](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-lb-idle.html): A load balancer deletes idle connections after a set time. The game assumes the connection is still alive, and then the player gets disconnected. - [Cloud security group connection tracking expiry](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-cloud-conntrack.html): The firewall attached to a cloud server (security group) also tracks connections, and tracking entries for idle connections expire after a set time. Even on servers that clients reach directly without a load balancer, players who sat idle can get disconnected. - [Cloud NAT gateway connection and port limits](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-nat-gateway.html): When servers in a private subnet connect out (platform authentication, payments, external APIs), a NAT gateway rewrites their address and port. If concurrent connections to the same destination exceed the gateway’s port limit, new connections fail. - [Load balancer skew and misjudged health checks](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-lb-imbalance.html): Connections pile onto one server, or players keep getting sent to a server that’s already dead. - [Switch microbursts](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-microburst.html): When several servers send packets to thousands of players at the same instant, the small buffer on the switch port where that traffic converges overflows in less than 1 ms. - [Data center link saturation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-uplink.html): When patch distribution, log shipping, or backups share a link with the game, the link fills up. - [Network equipment failover](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-failover.html): When a router or firewall fails and traffic switches to the standby unit (failover), everyone freezes for a few seconds. - [Bad cables and port errors](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-bad-cable.html): Bad optics or a bad cable corrupt a steady share of the packets that pass through that path. - [MTU mismatch (only large packets vanish)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dc-mtu.html): If the MTU (the largest size that can be sent at once) shrinks somewhere along the path and the “packet too big” messages are blocked, only large packets keep vanishing. ## L6 Server network card - [NIC interrupts concentrated on one core](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-irq.html): If the NIC sends every packet-arrival interrupt to a single CPU core, that core becomes the bottleneck. - [Ring buffer too small](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-ring.html): If the NIC’s ring buffer, which briefly holds incoming packets, is small, a sudden burst overflows it and packets get dropped. - [Excessive interrupt coalescing](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-coalesce.html): When the NIC collects packets and notifies the CPU once per batch to reduce CPU load, packets arrive later by the time spent collecting. - [Cloud PPS limit exceeded](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-cloud-pps.html): Each cloud instance type has limits on packets per second and bandwidth, and traffic over them is silently dropped. - [NIC bandwidth saturation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-saturate.html): Running a 1 Gbps or 10 Gbps card at its limit makes the transmit queue grow until packets get dropped. - [Virtualization overhead and noisy neighbors](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-noisy.html): When other virtual machines on the same physical server use a lot of network or CPU, your server’s processing gets delayed at irregular times. - [Cloud host maintenance and live migration](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-host-maintenance.html): When a cloud provider performs maintenance on a physical server (host), it moves VMs to another host (live migration) or pauses them briefly. The whole server freezes during that time, and if the pause is long, connections drop. - [NIC driver and firmware problems](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-reset.html): When a driver bug or a malfunctioning feature hangs the card, all traffic in and out stops while it restarts. - [GRO/LRO batching delay](https://jungrok5.github.io/mmo-lag-anatomy/en/c/nic-offload.html): GRO and LRO bundle several packets into one to reduce CPU load. Depending on settings, a small game packet may wait briefly for the next packet to bundle with. ## L7 Server OS (kernel) - [Connection queue (listen backlog) overflow](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-backlog.html): When tens of thousands of players connect at once right after maintenance, the kernel’s connection queue (listen backlog) overflows and connection attempts are dropped. - [File descriptor limit](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-fd.html): Every connection needs a file descriptor (fd: the number the OS gives an open file or socket), and the number of fds one process can open is capped. - [Kernel socket buffers too small](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-sockbuf.html): With small send and receive buffers, a burst of traffic makes the kernel drop packets arriving over UDP, and TCP sends block because the buffer has no room left. - [Too many threads and context switching](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-context.html): Running far more threads than there are cores makes the OS spend CPU just switching between them. - [CPU steal (virtual machines)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-steal.html): While the physical server (hypervisor) briefly gives a virtual machine’s CPU time to another VM (CPU steal), the game server stalls. - [Container CPU throttling (CFS quota)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-cpu-quota.html): With a CPU limit on a container, the moment it uses up its quota within a set period (usually 100 ms), it is forced to stop for the rest of that period (throttling). - [Latency spikes from server power management (C-states, frequency scaling)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-cstate.html): Idle CPU cores drop into deep power-saving states (C-states) and lower their frequency to save power. Waking up and raising the frequency when a packet or timer arrives takes time, which adds delay to handling small packets. - [OOM killer](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-oom.html): When memory runs out, Linux picks the process using the most memory and kills it. Usually that’s the game server. - [Stalls from memory reclaim and compaction](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-reclaim.html): The process stalls while the OS compacts memory to build huge pages or reclaims memory to free it up. - [System clock jump (NTP step)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-timejump.html): When the server clock is moved forward or back by several seconds in one step, timers that depend on the system clock fire all at once or stop. - [Scheduled jobs](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-cron.html): Log compression, backups, and security scans that run at the same time every day take up CPU and disk. - [Performance changes after OS, kernel, driver, or firmware updates](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-os-update.html): The game code hasn’t changed, but the server has been slower since an OS, kernel, driver, or firmware update. Updates can change defaults, the scheduler, CPU vulnerability mitigations, and driver behavior. - [Server conntrack table full](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-conntrack.html): When the connection tracking (conntrack) table, where the Linux firewall records every connection, reaches its limit, new packets are dropped. - [Ephemeral port exhaustion on server-to-server connections](https://jungrok5.github.io/mmo-lag-anatomy/en/c/so-ports.html): When a game server opens and closes short connections to the DB or other servers very often, closed connections hold their ports for a while, and new connections can’t be opened. ## L8 Sockets and protocols - [TCP head-of-line blocking](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-hol.html): To keep data in order, TCP holds back every packet that arrived after a lost one until the lost packet is received again. - [TCP RTO and exponential backoff](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-rto.html): Each time a retransmission fails again, the wait doubles, so a brief connection drop turns into a long stall. - [Nagle’s algorithm + delayed ACK](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-nagle.html): Nagle’s algorithm, which batches small packets, and delayed ACK, which sends ACKs late, interact so that each message written in pieces is delayed by 40–200 ms. - [Blocking sends caused by slow clients](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-block-send.html): When one player on a slow connection has a full send buffer and the server sends in blocking mode (a send call that doesn’t return until the buffer has room), the server thread waits on that one player. - [Slow client (slow consumer) handling policy](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-slow-client.html): When a client’s outgoing data keeps piling up, the server drops stale updates or disconnects it. - [Keepalive default of 2 hours](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-keepalive.html): When the other side vanishes without a close signal, TCP notices only much later. Keepalive (a TCP feature that checks whether an idle connection is still alive) is off by default, and even when it’s on, checks start only after 2 hours of idle time. - [IP fragmentation of UDP packets](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-fragment.html): A UDP packet larger than the MTU (the largest size that can be sent in one piece) is fragmented at the IP layer, and losing just one fragment throws away the whole packet. - [Reliable UDP retransmission settings](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-reliable-udp.html): When the retransmission rules you built on top of UDP are too conservative, recovery is slow; when they’re too aggressive, they clog the connection even more. - [Slow start after idle](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-slowstart.html): When a connection has been idle for a while, TCP shrinks the congestion window (how much it can send at once) again, so a sudden large send goes out in several rounds. - [Sending rate plunges under congestion control](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-congestion.html): TCP treats loss as a sign of congestion and cuts its sending rate by 30–50%. It reacts the same way to Wi-Fi loss. - [Last data lost to an abortive close (RST)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-linger.html): When the server cuts a connection abruptly, the final notice or save-complete signal it sent is lost. - [Blocking I/O design](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-blocking-io.html): In a design where a thread can’t do anything else while it waits on one socket, everything slows down as the player count grows. - [Uneven SO_REUSEPORT distribution](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-reuseport.html): When several processes share one port, the kernel assigns each connection to a process by address hash and never reassigns it. If one of those processes stalls, only the players assigned to it wait. - [WSAECONNRESET errors on Windows UDP sockets](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sk-udp-connreset.html): When a Windows server sends UDP to a client that has already left, a “port unreachable” (ICMP) message comes back. That message makes the next receive call fail with an error, and if the server code treats the error as a failure of the socket itself, everyone using that socket is affected. ## L9 Server game process - [Tick overrun](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-tick-overrun.html): When one tick has more work than its budget, the server’s tick interval stretches, and the whole area slows down or stutters. - [AOI calculation blowup (N²)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-aoi.html): If you compare everyone against everyone to work out who can see whom, 10 times the players means 100 times the computation. - [Broadcast fan-out overload](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-broadcast.html): Sending one player’s movement to everyone who can see them creates updates on the order of the square of the crowd size. - [Single-threaded zone overload (hotspot)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-hotzone.html): When each area runs on a single thread and players crowd into one place, only that one core hits 100%. - [Lock contention](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-lock.html): When several threads wait on one lock to write the same data, they run one at a time no matter how many threads you add. - [Deadlock](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-deadlock.html): When two threads each wait for a lock the other holds, both stop forever. - [Blocking calls on the game thread](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-sync-call.html): If the server waits for a DB response or a file write in the middle of a tick, all game progress on the server stops for that long. - [Message queue backlog](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-queue.html): When requests arrive faster than they’re processed and pile up in the queue, the ones at the back get processed only seconds later or are dropped. - [Timers firing all at once](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-timer-burst.html): When every monster respawn, every buff expiry, and the on-the-hour reward all land on the same tick, that one tick becomes tens of times heavier. - [Pathfinding storm](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-pathfinding.html): When hundreds of monsters chase players and compute paths at the same time, it takes a lot of CPU. - [Serialization and compression cost](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-serialize.html): Turning outgoing data into bytes and compressing it takes CPU too, and with many players this cost explodes. - [Server crash](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-crash.html): When the server process dies from an unhandled error, everyone on that server disconnects at the same time. - [Thread pool exhaustion](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-threadpool.html): When every worker thread is tied up in slow work, new requests just wait with no end in sight. - [Infinite loops and runaway logic](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-infinite-loop.html): When a bug keeps a tick from ever finishing, the server stops, and the watchdog forces a restart. - [Combat concentrated on one target (world boss)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-hot-entity.html): When hundreds of players hit one boss at the same time, the computation for that single boss piles up in one place, and hit information goes out to everyone watching. - [Spawn burst when entering a crowded area](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-spawn-burst.html): When you teleport into a town packed with players, the server has to send the appearance, gear, and status of hundreds of newly visible players all at once. - [Entity buildup (items and summons never cleaned up)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-entity-buildup.html): When ground items that should have disappeared, summons, and finished timers pile up without being cleaned up, every tick has more work to do the longer the server stays up. - [Patch changes the traffic pattern](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sp-patch-traffic.html): When new content, effects, or synced fields raise packet size and frequency, a server that ran fine starts hitting MTU, bandwidth, and packet-rate limits after the patch. ## L10 Memory - [Server GC stop-the-world pause](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-gc.html): While a Java or C# server halts every thread to collect garbage (stop-the-world), the whole server stalls. - [Script engine GC pause](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-script-gc.html): Even on a C++ server, if quests, AI, and skills run in a scripting language such as Lua, the zone stops while the script engine’s GC runs. - [Allocation surge](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-alloc.html): Creating large numbers of temporary objects during an event makes GC run far more often than usual. - [Memory leak](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-leak.html): Memory that is never freed piles up little by little and, days later, leads to GC storms, swapping, or the process getting killed. - [GC thrashing (too little heap headroom)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-gc-thrash.html): When live data gets close to the heap limit, each GC reclaims almost nothing, so GC runs over and over without a break. - [Swap](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-swap.html): When memory runs short and the OS moves part of it out to disk, every access to that memory waits on a disk more than 1,000 times slower. - [Cache miss](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-cache-miss.html): When data is scattered all over memory, the CPU has to go all the way out to slow RAM and wait every time. - [Memory fragmentation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-fragment.html): When repeated allocation and freeing chops free space into small pieces, the process holds far more memory than it actually uses. - [Remote NUMA memory](https://jungrok5.github.io/mmo-lag-anatomy/en/c/mem-numa.html): On a server with two CPUs, using memory attached to the other CPU slows access down. ## L11 Disk - [Synchronous log writes](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-sync-log.html): If the game thread waits for the disk to finish every log line, the game stalls too whenever the disk is busy. - [fsync surge](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-fsync.html): Asking for data to be written to disk “for sure” takes 0.1 ms to tens of ms per request depending on the disk, and when requests pile up, the queue grows. - [Cloud disk out of burst credits](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-burst.html): Some cloud disks and small server sizes have burst credits that let them run faster than baseline for a while, so when a busy period drags on and the credits run out, speed drops suddenly. - [IOPS limit / queue saturation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-iops.html): When requests exceed what the disk can handle per second, the queue grows and latency explodes. - [Disk full](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-full.html): When logs and dumps pile up and fill the disk, writes fail, and without safeguards the server crashes. - [Backup / compression / scan jobs](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-backup.html): When early-morning backups, log compression, or security scans monopolize the disk, the game server’s reads and writes get held up. - [Server-side lazy loading](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-lazy-load.html): If the server reads dungeon or map data from disk the first time it’s requested, everyone freezes for that tick. - [Writing a core dump](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-coredump.html): When the server crashes, writing several GB of memory to disk can delay the restart by several minutes. - [HDD seek latency](https://jungrok5.github.io/mmo-lag-anatomy/en/c/dk-hdd.html): An HDD has to move its head across the platter (a seek), so reading or writing scattered data takes close to 10 ms each time. ## L12 Database - [Queries with no index](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-no-index.html): Without an index, finding the rows that match a condition means reading the entire table (a full table scan). - [Hot row lock contention](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-hot-row.html): When everyone tries to modify the same row (a guild vault, a popular auction house item, a server-wide counter), only one request at a time gets the lock. - [DB deadlock](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-deadlock.html): When two transactions (groups of DB operations processed as one unit) each wait for a row the other has locked, the DB forcibly cancels one of them. - [Connection pool exhaustion](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-pool.html): The number of connections open to the DB is fixed, so when slow queries hold connections, every other request waits. - [Replication lag](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-replica-lag.html): Writes go to the primary and reads come from replicas, so when a replica falls behind, data that was just written isn’t visible yet. - [Checkpoint / log flush](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-checkpoint.html): Queries slow down at the moments the DB periodically writes its accumulated in-memory changes to disk in bulk. - [Cold cache (right after a restart)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-cold-cache.html): After a DB restart, the memory cache is empty, so for a while every lookup reads from disk. - [Login storm and N+1 queries](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-login-storm.html): If loading one character takes dozens of separate queries, tens of thousands of simultaneous logins turn into millions of queries. - [Bulk batch jobs](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-batch.html): Running ranking aggregation, mass mail sends, or old-data cleanup during live service ties up locks and the disk. - [DB failover](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-failover.html): When the primary DB dies, writes stop while it fails over to a standby, and the last data that hadn’t been replicated yet can be lost. - [Lost progress from a long save interval](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-save-interval.html): If the server saves only once every few minutes to reduce load, progress is lost when the server dies in between. - [Cache stampede](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-cache-stampede.html): When cache entries for popular data expire at the same time, thousands of requests hit the DB all at once. - [Transaction left open too long](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-long-tx.html): When a transaction stays open for a long time, it keeps holding its locks and the DB can’t clean up (purge) old versions of data, so everything gradually slows down. - [Slow Redis commands](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-redis-block.html): Redis processes commands one at a time, so a single slow command blocks every request behind it. - [Query slowdown from a query plan change](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-plan-flip.html): Even with the code unchanged, if the DB changes how it executes a query (its query plan), a query that took 2 ms yesterday takes hundreds of ms today. - [Schema change (DDL) lock during live service](https://jungrok5.github.io/mmo-lag-anatomy/en/c/db-ddl-lock.html): Adding a column or index to a table during live service can make every request that uses that table wait, all because of one lock that’s needed only briefly. ## L13 Server architecture and operations - [Routing through a gateway or proxy](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-gateway.html): Putting an intermediate server between the client and the game server adds processing time at every hop, and that server becomes a single point of failure. - [Zone transfer (handoff between servers)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-zone-transfer.html): Entering another area or dungeon means handing the character’s data to another server, and that handoff can be slow or fail. - [Cascading failure](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-cascade.html): When one service slows down, the servers that call it get tied up waiting for responses, and even unrelated features stop. - [Auxiliary server outage](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-subservice.html): When a server that runs separately from the game server, such as chat, party, or auction house, fails, only that feature stops working. - [Deploys and restarts](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-deploy.html): If you restart a server for an update without moving its connections, everyone on it disconnects, and the final saves before shutdown and the reconnects all hit at once. - [Autoscaling delay](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-autoscale.html): When players flood in, servers are added automatically, but getting them ready takes several minutes, and the existing servers are overloaded in the meantime. - [Logging and monitoring overload](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-monitoring.html): During an outage, log volume explodes, and servers that ship logs synchronously get even slower because of the logging. - [Clock skew between servers](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-clock-skew.html): When each server’s clock is slightly off from the others, cooldown, buff, and event start checks disagree from server to server. - [Too many macros and bots](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-bots.html): Bots send requests far more often than people do and eat into server capacity. - [External service dependency](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-external.html): When an external service such as platform login, payments, or identity verification is slow or down, players get stuck at that step. - [Matchmaking and region assignment errors](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-region-match.html): When a player lands on a server in a distant region while a closer region exists, that player’s ping stays high even though their connection is fine. - [Expired or misconfigured TLS certificate](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-cert.html): When the certificate on a login, API, or patch server expires or is missing its intermediate certificate, every client that connects from that moment on fails the TLS connection. - [Login queue cap and insufficient reconnect grace](https://jungrok5.github.io/mmo-lag-anatomy/en/c/in-login-queue.html): When players flood in right after launch or maintenance, the login queue hits its cap and turns away new arrivals, and players who were already waiting lose their place during a brief disconnect and go back to the end of the line. ## Netcode design - [Feedback only after the server responds (request-response)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-request-response.html): Press a button and there’s no animation or sound until the server answers. Your ping becomes your response time. - [Chatty protocol (many sequential round trips)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-chatty.html): If one action needs several server round trips one after another, your ping is multiplied by that many. - [No skill input buffering](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-no-queue.html): If you can’t press the next skill until the server confirms the previous one has finished, a round trip gets inserted between every skill in a rotation. - [Short timing windows eaten up by ping](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-short-window.html): When the time you have to react is short, as with dodges, parries, and guards, ping eats up that time and some attacks become impossible to avoid. - [Hit registration without lag compensation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-no-lagcomp.html): If the server checks hits only against where targets are on the server right now, what you saw on your screen and the server’s call disagree. - [Too much lag compensation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-lagcomp-overreach.html): If the server rewinds too far in the attacker’s favor, the target gets hit even after they’ve already taken cover. - [Client authority](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-client-auth.html): When each client decides its own results, your own screen feels responsive, but results disagree with other players’ screens and the game is easy to hack. - [Lockstep waiting on the slowest player](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-lockstep.html): When everyone computes the same turn together, one player’s late input makes everyone wait. - [Rollback netcode misprediction](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-rollback.html): The game predicts the opponent’s input and shows it early, then rewinds and recomputes if the guess was wrong. The higher the ping, the further it rewinds. - [Events played on arrival without timestamps](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-no-timestamp.html): If server events carry no timestamp and play as soon as they arrive, network jitter carries straight through into uneven animation timing. - [Double tick wait](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-double-tick.html): If requests wait for the next tick to be processed and the results wait for the tick after that to be sent, the tick interval is added twice. - [Overly strict server validation](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-strict-check.html): If the server checks movement speed, cooldowns, and range too strictly, it rejects even valid inputs that arrive bunched together because of jitter. - [Player-hosted server (host)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-host.html): When one player’s PC acts as the server, that player’s connection and PC performance decide how the game feels for everyone. - [Server rejects after client-side feedback](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-optimistic-reject.html): When the server later refuses a hit or skill your screen already showed, the result you clearly saw never happened. - [Pathfinding mismatch in command sync](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-path-mismatch.html): When only “go here” is exchanged and each side computes the path itself, even a small difference in the calculation sends a character or monster down a different path until it gets pulled back into place. - [Low snapshot send rate](https://jungrok5.github.io/mmo-lag-anatomy/en/c/sy-low-send-rate.html): If the server sends position updates (snapshots) only a few times a second, the interpolation buffer has to be that much longer, and you see other characters further in the past. ## Problems only some players hit - [A lagging player moves in bursts on others’ screens](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-slow-burst.html): Inputs from a player with a bad connection reach the server unevenly, in bunches. If the server applies whatever arrived on each tick, other players see that character hitch and then cover several steps at once. - [Fast-forward on servers that process on arrival](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-event-server.html): On a server that processes and broadcasts packets as soon as they arrive, a lagging player’s bunched-up actions run back to back immediately. - [Per-player input buffer size](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-input-buffer.html): If the server holds a few inputs per player and takes out one per tick, others see smooth motion, but your own actions are confirmed on the server that much later. - [Validation false positives concentrated on one ISP](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-isp-validation.html): Players on high-jitter connections have their inputs arrive in bunches, so they often trip the server’s speed and cooldown checks. - [One lagging party member and boss mechanics](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-raid-member.html): In raid mechanics where everyone has to react together at a set moment, one lagging player’s late reaction fails the whole party. - [A lagging client controls the monster](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-mob-control.html): Some games hand monster movement to one nearby player’s client to reduce server load. If that player’s connection is bad, the monster moves strangely on everyone’s screen. - [Bloated data on one character](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-heavy-char.html): A character with thousands of items or mails piled up, or an unusually large friend list, block list, or set of buffs, has several times more to load, save, and announce to nearby players than others. It’s slow only on that character, regardless of connection. - [Different channel, instance, or phase](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-phase.html): If two characters are in different channels or instances, or in different “phases” where the visible NPCs depend on quest progress, they see different worlds. - [Spawn messages dropped during loading](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-loading-drop.html): Right after you enter a zone, the server sends spawn messages for nearby NPCs, but the client is still loading the map and throws them away. - [AOI registration race](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-aoi-race.html): If a character registers in the AOI grid at the same moment an NPC moves between grid cells, that NPC’s spawn message can be missed. - [Lost baseline snapshot](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-baseline.html): When the server sends “only what changed since last time,” losing the full state sent once at the start (the baseline) means later changes can’t be applied. - [Missed despawn message (ghost entity)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-ghost.html): The reverse case: if the “it’s gone” message is missed, NPCs or players that already died or left stay on your screen only. - [Spawn data lost in the burst after entering](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-spawn-burst.html): The moment you enter a zone, the server sends spawn data for tens to hundreds of nearby entities all at once. If it goes over an unreliable channel, or the receive buffer overflows while the client is loading and can’t read the socket, part of it disappears and never comes back. - [Entity ID reuse mix-up](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-id-reuse.html): If the server reuses the same entity ID when a dead NPC respawns, a client that missed the despawn message in between mistakes the new NPC for the old one. - [Fixed UDP port collision](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-port-collision.html): If the client is built to use a fixed local port, a second client on the same PC either can’t get the port or ends up splitting packets with the first. - [Sessions keyed by IP or device (bug)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-session-key.html): If the server or an intermediate server identifies connections by IP or device ID, it treats two clients on the same PC (same public IP) as one person. - [Multi-client restriction](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-multiclient.html): If an anti-cheat module or server policy limits multiple clients on one PC, the second client is blocked from launching or connecting, or the first one gets disconnected. Some games only block features on the extra client. - [Background window throttling](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-background.html): For a client in a background window, the game, engine, and OS cut its frame rate and processing. Received packets aren’t processed in time, so they back up or overflow. - [Simultaneous access to cache or asset files](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-asset-lock.html): If two clients write to the same cache folder at the same time or lock its files, one of them can’t load NPC models or textures. - [Streaming failure from memory or VRAM shortage](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-vram.html): When two clients share graphics memory, there’s no room to load newly needed models and textures, and some of them don’t get drawn. - [Different display settings](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-display-option.html): If settings such as a visible player limit, hidden NPC name tags or models, or low-spec mode differ between two clients, they see different things. - [Client version or data mismatch](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-version.html): If the second client is a different install or isn’t fully patched, it doesn’t recognize new NPC IDs the server sends and silently ignores them. - [Per-connection send budget and priority](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-priority.html): If the server caps how much it sends per connection and sends the nearest things first, a connection with a low cap gets distant NPCs late or not at all. - [Entities held back by clock estimate error](https://jungrok5.github.io/mmo-lag-anatomy/en/c/pt-clock-hold.html): If the client’s estimate of the server time is wrong, it holds back freshly arrived entity data as “still in the future” or discards it as “too old.” ## Root causes of TCP retransmission - [Wireless link loss](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-wireless.html): Wi-Fi and mobile networks retransmit a few times on the wireless link and drop the packet if that still fails. TCP resends the dropped packet only much later. - [Bottleneck queue overflow (congestion loss)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-queue-drop.html): When the queue at the narrowest point fills up, such as a home router, a link between ISPs, or a data center uplink, newly arriving packets are dropped. - [Send bursts overflow shallow buffers](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-burst.html): When a server sends a whole tick of updates for thousands of players in one instant, a switch’s small buffer or a cloud instance’s short-term limit overflows in under 1 ms and some packets are dropped. - [Policer drops excess traffic](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-policer.html): ISP plans, cloud instance limits, and DDoS protection devices sometimes drop packets over a set rate right away, without queuing them. - [Physical errors (bad cable, optics, connectors)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-physical.html): Damaged cables, dirty fiber connectors, and worn-out optics cause bit errors, and network equipment silently drops the corrupted packets. - [Duplex mismatch](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-duplex.html): If one end autonegotiates while the other has speed and duplex hard-set, one side runs half duplex and loses packets to collisions whenever load picks up. - [Packet drops on the receiving host](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-host-drop.html): Packets reach the server but get dropped, because the NIC’s ring buffer (which briefly holds arriving packets) overflows or the kernel cores that handle receive processing are saturated. - [Firewall and connection tracking drops](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-stateful-fw.html): Firewalls and Linux connection tracking (conntrack, which records passing connections in a table) drop packets when the table is full or when they decide a packet doesn’t match the connection’s state. - [Middlebox over capacity (firewall, IPS, DDoS protection)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-appliance-pps.html): Firewalls, intrusion prevention systems (IPS), and DDoS protection devices inspect every packet passing through. The moment traffic exceeds their inspection capacity, they drop the packets they can’t process. - [MTU black hole (only large packets keep getting lost)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-mtu.html): If the largest packet size a link along the way can carry shrinks and the “too big” notice (ICMP) is blocked, large packets keep vanishing no matter how many times they’re resent. - [NAT or load balancer mapping expires mid-connection](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-mapping.html): If a device along the way deletes the mapping for an idle connection (the entry that records where to forward that connection), the next packet sent can’t be delivered. The connection either retransmits over and over until it disconnects, or the device sends back a reset (RST) and it disconnects right away. - [Route change / bad ECMP path](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-path.html): Packets vanish for a few seconds while an internet route changes, or steadily on connections assigned to a faulty path among several ECMP paths. - [Spurious retransmission from latency spikes](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-spurious-delay.html): A packet that isn’t lost, just very late for a moment, still gets retransmitted if the delay is longer than the RTO, because the sender treats it as lost. - [Spurious fast retransmit from reordering](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-reorder.html): When packets get out of order crossing multiple paths or bundled links, the receiver signals “a packet is missing” with duplicate ACKs, and the sender resends a packet that arrived fine. - [Late or lost ACKs (saturated upload)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-ack-path.html): Data arrives fine, but if the “got it” ACK is delayed or dropped in a full upload queue, the sender treats the data as lost and retransmits. - [RTO settings that don’t fit the environment](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-rto-setting.html): Set the RTO minimum too low and even small delays cause spurious retransmissions; leave the default (200 ms) and it’s too long for games, so every loss means a long freeze. - [Slow recovery on thin streams](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-thin.html): When a game sends small packets sparsely, the RTO fires before “three following packets” can pile up. The same loss causes a much longer freeze than it would on a bulk transfer. - [Middlebox strips TCP options](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-sack-stripped.html): When some firewalls or accelerators remove or rewrite TCP options, multiple losses get recovered only one per round trip, or the window (how much can be sent at once) shrinks, and everything slows down. - [Zero window (a stall that looks like retransmission)](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-zero-window.html): When the receiving program doesn’t read its socket in time and the buffer fills up, the sender stops sending and sends only zero window probes. The network itself is fine. - [Connection request (SYN) retransmission](https://jungrok5.github.io/mmo-lag-anatomy/en/c/rt-syn.html): If a connection request is lost because the connection queue (backlog) overflows or a firewall blocks it, the client OS resends it starting 1 second later, at growing intervals. ## Diagnosis and incidents - [Diagnosing from monitoring data](https://jungrok5.github.io/mmo-lag-anatomy/en/#judge): Scope → timing → layer decision flow, signal table, 13 graph shapes, reading the numbers (average and p99) - [Playbooks](https://jungrok5.github.io/mmo-lag-anatomy/en/text.html#playbooks): Lag after a patch, launching in a new country or region - [Real-world incidents](https://jungrok5.github.io/mmo-lag-anatomy/en/text.html#cases): Postmortems published by the original developers and operators, with related causes ## Other languages - [한국어 (Korean)](https://jungrok5.github.io/mmo-lag-anatomy/llms.txt) - [日本語 (Japanese)](https://jungrok5.github.io/mmo-lag-anatomy/ja/llms.txt) - [简体中文 (Chinese (Simplified))](https://jungrok5.github.io/mmo-lag-anatomy/zh-cn/llms.txt) - [繁體中文 (Chinese (Traditional, Taiwan))](https://jungrok5.github.io/mmo-lag-anatomy/zh-tw/llms.txt) - [Deutsch (German)](https://jungrok5.github.io/mmo-lag-anatomy/de/llms.txt) - [ไทย (Thai)](https://jungrok5.github.io/mmo-lag-anatomy/th/llms.txt) - [Tiếng Việt (Vietnamese)](https://jungrok5.github.io/mmo-lag-anatomy/vi/llms.txt) - [Русский (Russian)](https://jungrok5.github.io/mmo-lag-anatomy/ru/llms.txt) - [Português (Brasil) (Portuguese (Brazil))](https://jungrok5.github.io/mmo-lag-anatomy/pt-br/llms.txt) - [Español (Spanish)](https://jungrok5.github.io/mmo-lag-anatomy/es/llms.txt) - [Bahasa Indonesia (Indonesian)](https://jungrok5.github.io/mmo-lag-anatomy/id/llms.txt) ## Optional - [GitHub repository](https://github.com/jungrok5/mmo-lag-anatomy): Source code, data format, how to contribute - [Author: Jeongrok Oh](https://jungrok5.github.io/resume/en/): Resume