CS 1.6 net_graph: How to Enable, Read and Fix Network Issues

Table of Contents

The net_graph command in CS 1.6 turns on a small readout in the corner of your screen that shows what's actually happening between your client and the server - your FPS, your ping, how many updates you're really getting, and if the server is dropping any.

Most players either never turn it on, or run net_graph 1 just to see their FPS and leave it at that - which is a shame, because it's the fastest way to tell whether that stutter or bad hit registration is your connection, your PC, or just a bad server.

In this guide I'll show you how to enable the command, the difference between net_graph 1, 2 and 3, how to read every value it shows, and how to move and resize it so it's not in the way. Then I'll go through the problems it helps you catch - loss, choke, low FPS - and what to actually do about each one. By the end you'll be able to glance at the graph mid-game and know exactly what's wrong.

What Is net_graph in CS 1.6?

CS 1.6 themed net_graph infographic showing FPS, ping, in/out traffic, and command rate labels

The console command net_graph is a diagnostic tool built into the Half-Life engine that CS 1.6 runs on, so it's been there since the start - no mods or downloads needed. Type the command in console and it draws a small live graph plus a row of numbers, updating in real time as you play. Half of it is about your connection to the server, the other half is about your own machine.

That split is what makes it useful. When something feels off in a match, net_graph is how you tell where the problem lives. Choppy movement with a clean network reading points at your FPS or your PC. Smooth FPS but rising loss or choke points at the connection or the server. Instead of guessing, you get a live answer, which is why you reach for it whenever you're tuning rates or trying to figure out why a server feels bad.

The tool can also help with configuring interpolation. The bottom line of the graph reacts directly to how many updates you're getting - when the server can't feed enough of them, that line changes color, and that's your cue that your ex_interp or cl_updaterate needs adjusting for this server. If you haven't set those up yet, the CS 1.6 ex_interp Settings: How Interpolation Works and Best Values guide covers it in full.

How to Enable net_graph in CS 1.6

Turning net_graph on takes one command. Open the console with the tilde key (~), type the command, and the graph shows up right away:

net_graph 1

To turn it off again, set it back to 0:

net_graph 0  //default in config.cfg

The value you pass in is also the display mode. net_graph 1, 2 and 3 all turn the graph on - they just show different amounts of detail, which I'll break down in a second.

If the tilde key doesn't open the console, the bind for it has probably been overwritten somewhere in your config file. In CS 1.6 the console is opened by the toggleconsole command, which is tied to the tilde key by default - there's nothing to "activate," it's always there. Open your config.cfg and make sure this line is present:

bind "~" "toggleconsole"

If it's missing or the key got reassigned to something else, add it back, and the console will open again. Only touch the -console launch option as a last resort if the config is genuinely broken - for a normal setup you never need to.

Typing the command on every launch gets old, so it's better to set it in your config. Add net_graph 1 to your userconfig.cfg and the graph will turn on automatically every time you start the game.

net_graph 1 vs 2 vs 3 - What's the Difference

The three values don't stack on top of each other - they're three different views. Higher isn't "more detailed", it's just different. Here's what each one actually puts on your screen.

CS 1.6 net_graph 1 showing FPS, ping, incoming rate, outgoing rate, and command rate
net_graph 1 shows basic FPS, ping, traffic, and command rate information

net_graph 1 is the compact view. You get the text block - fps, latency, your updaterate, and your in/out traffic - plus a small line underneath with your cmdrate next to it. No large graph. This is the everyday setting: enough to see that everything is running as it should.

CS 1.6 net_graph 2 showing FPS, ping, rates, and graph lines
net_graph 2 adds visible graph lines above the network values

net_graph 2 is net_graph 1 plus a full traffic graph drawn above the text. Same numbers, but now you can watch the shape of the connection over time instead of reading values. Handy when you want to see if a problem is constant or comes in spikes.

CS 1.6 net_graph 3 showing FPS, ping, in, out, loss, and choke values
net_graph 3 shows FPS, ping, traffic, loss, and choke in a clean text layout

net_graph 3 drops the graph entirely and swaps in the two numbers that matter when something is wrong: loss and choke. You lose the visual, you gain the diagnosis. This is the one to run when you're testing rates on a new server or trying to work out why a server feels bad.

net_graph 1, 2 and 3 Comparison Table

Mode Text (fps, ping, in/out) Traffic graph Loss/Choke
net_graph 0 Off Off Off
net_graph 1 Yes - -
net_graph 2 Yes Yes -
net_graph 3 Yes - Yes

Run net_graph 1 for everyday play. Switch to net_graph 3 the moment something feels off - loss and choke are what tell you where the problem actually is.

net_graph Binds and Scripts in CS 1.6

Leaving the graph on screen all the time works, but most people don't want it sitting in the corner every round. These three scripts give you the graph when you want it and hide it when you don't. Pick whichever fits how you play.

Hold TAB - graph with the scoreboard

The classic. The graph appears while you hold TAB to check the score, and disappears when you let go. Nothing on screen during the round, one key away whenever you want a look.

alias "+ng" "+showscores; net_graph 3"
alias "-ng" "-showscores; net_graph 0"
bind "TAB" "+ng"

Hold TAB and you get the scoreboard plus the graph; release it and both disappear.

Toggle - scoreboard and graph, no holding

Same idea, but it stays up until you press the key again. Useful when you actually want to study the numbers instead of glancing at them - hold-to-view is fine for a quick check, but awkward when you're trying to watch choke climb during a fight.

alias "show_stats" "show_stats_on"
alias "show_stats_on" "+showscores; net_graph 3; alias show_stats show_stats_off"
alias "show_stats_off" "-showscores; net_graph 0; alias show_stats show_stats_on"
bind "c" "show_stats"

Press C once and the scoreboard and graph stay on screen. Press it again to turn both off.

Toggle - graph only, no scoreboard

The one I'd recommend for actual troubleshooting. No scoreboard in the way, just the graph, up until you switch it off. This is what you want when you're testing rates on a new server and need to watch loss and choke over a few rounds.

alias "show_stats" "show_stats_on"
alias "show_stats_on" "net_graph 3; alias show_stats show_stats_off"
alias "show_stats_off" "net_graph 0; alias show_stats show_stats_on"
bind "c" "show_stats"

Press C to bring up the graph, press it again to hide it. Bind it to whatever key you have free - C is just an example. Use one toggle or the other, not both - they share the same alias name or rename the show_stats alias.

All three use net_graph 3 because that's the one that shows loss and choke. Drop them into your userconfig.cfg and they'll load every time.

Check my Counter-Strike 1.6 Useful Scripts: Complete Guide to get more useful scripts.

How to Read net_graph in CS 1.6

Once the graph is up, it's a compact block of text with a small line under it, and depending on the value you set (1, 2 or 3) you also get a larger graph or a loss/choke readout. The text is the quick read - one glance tells you your FPS, latency, and how many updates are moving each way. Here's every value, using a real reading from a good server:

100.0 fps 31 ms 100/s
in :  90 8.03 k/s
out:  19 4.16 k/s

100.0 fps - frames per second your PC is rendering. In my case fps_max is set to 99.5, and you can see it holding right there - the number isn't dropping or jumping around, it's flat and steady, which is exactly what you want. Steady frames matter more than high ones: a stable 100 feels better than a jittery 300. If yours bounces around or sits low, that's a config and optimization job - I cover it in the CS 1.6 FPS Boost - Best Settings for Stable FPS guide.

31 ms - your latency to the server, in milliseconds. Quick bit of trivia: ping is actually the name of a network tool (ping.exe) that fires test packets at a host and times the reply. What it measures is latency - the round-trip time for data to reach the server and come back. So when someone says "my ping is too high," they really mean their latency is high. Either way, lower is better, and if yours is rough there's a lot you can do about it - see How to Lower Ping in Counter-Strike 1.6.

100/s (first line) - this is your cl_updaterate: how many updates per second you're actually receiving from the server. This is the reality check. If your config says cl_updaterate 100 but this reads 60, the server is only giving you 60 - your interp should follow that number, not your config.

CS 1.6 net_graph showing cl_updaterate and cl_cmdrate values marked with red arrows
net_graph 1 shows cl_updaterate and cl_cmdrate values with a compact graph view

in / out - your incoming and outgoing traffic. The first number is the size of the last packet in bytes (in : 90 = a 90-byte packet in), the second is the kilobytes per second moving that way (8.03 k/s). Incoming is bigger because the server sends you everyone's positions; outgoing is just your own commands, so it stays small.

There's a second 100/s further down, next to the small line at the bottom - that one is your cl_cmdrate: how many commands per second you're sending to the server. So the graph shows both halves of the exchange: updaterate coming in, cmdrate going out.

What Do Loss and Choke Mean in CS 1.6 net_graph?

Switch to net_graph 3 and the readout swaps the traffic graph for the two numbers that matter most when something feels wrong:

100.0 fps 32 ms
in :  50 5.80 k/s
out:  19 4.32 k/s
loss: 0 choke:  0

These two tell you why updates go missing, and they point at completely different culprits.

Loss means packets are being dropped somewhere between your client and the server. Start by checking your own connection - Wi-Fi is the usual suspect - but loss doesn't prove the problem is on your machine. Packets can go missing on your local network, on your line, at your ISP, somewhere on the route between your ISP and the server, or inside the server's hosting network. All the number tells you is that data isn't making it through; where it's disappearing takes a bit more digging.

Choke is different - nothing is lost, the server is simply holding updates back because it can't send them as fast as they're being asked for. And this is where most people get it wrong: choke isn't automatically the server's fault. The two most common causes are sitting in your own config.

The first is your rate being too low. The server has to respect both your updaterate and your rate limit in bytes per second. If your rate is small and the packets are big, the server physically can't push the next packet out on time - so it defers it, and the choke counter ticks up. Drop your rate to something like 5000 and you'll generate choke on a perfectly healthy server, all by yourself.

The second is asking for more updates than the server can sustain - a high cl_updaterate on a busy or underpowered server, especially when the map gets chaotic. The server keeps trying to obey a rate it can't deliver, and choke climbs.

Those two are what you can actually fix, so check them first. But they aren't the only sources of choke: server-side limits like sv_maxrate and sv_maxupdaterate, a server running under heavy load, an unstable server framerate, or bottlenecks in the host's network will all produce choke no matter what your config says. If your rates are sane and choke still won't drop, the problem probably isn't on your side.

So when you see choke, check in this order:

  1. Your rate first. Make sure it isn't set low. rate 100000 is a safe value on modern servers - if you're sitting on an old 10000 or 20000 from some ancient config, raise it.
  2. Then your cl_updaterate. If rate is fine and choke is still climbing, the server genuinely can't feed you what you're asking for - lower cl_updaterate until choke drops toward zero, and lower your ex_interp with it.

You need to get both numbers: loss: 0, choke: 0. A flicker during a heavy moment is normal; anything steady is a signal. Steady loss means fix your connection. Steady choke means fix your rate first, then your updaterate - the same logic that sets your interp value, covered in the CS 1.6 interp guide.

What Good vs Bad net_graph Looks Like

You don't have to memorize numbers - once you've seen a healthy graph and a broken one side by side, you can read it at a glance.

CS 1.6 net_graph 3 showing high choke value of 67
High choke in net_graph 3 can point to delayed or skipped network updates

A healthy graph looks like the readings above: latency low and steady, the update count matching your cl_updaterate, and loss: 0, choke: 0. On net_graph 2 the top graph is a clean, mostly flat line. Models move smoothly and hits land where you expect. On a good server with matched rates, this is what you'll see most of the time.

A bad graph looks very different. Here's the same server after I deliberately broke my rates - dropping rate from 100000 to 5000 and pulling cl_updaterate down with it.

100.0 fps 279 ms
in :  763 9.95 k/s
out:  24 1.47 k/s
loss: 0 choke:  67

Everything went wrong at once, and each number tells part of the story. Choke jumped to 67 while loss stayed at 0 - that combination points away from the connection: nothing is being lost, the packets just aren't getting out on time. And look at the incoming packet size: 763 bytes, up from 50. With the rate limit choking the flow, updates pile up and get crammed into fewer, fatter packets.

And the server was fine the whole time. I did all of that to myself, from my own config. That's why your own rates are the first thing to check when choke shows up - bad values will do this on any server, no matter how good it is.

On net_graph 2 you can see the same thing without reading a single number: the clean flat line breaks up into a jagged mess of scattered dots instead of a steady trace.

How to Customize net_graph Position and Size in CS 1.6

The graph sits in the bottom-right by default, which works fine for most people, but depending on your resolution it can end up overlapping your HUD or sitting somewhere awkward. Four commands control where it lives and how it looks.

net_graphpos moves the graph horizontally:

net_graphpos "1"    // right (default)
net_graphpos "2"    // center
net_graphpos "3"    // left

graphheight moves it vertically. Default is 64, which puts it near the bottom. Higher values push it up the screen - 128 lifts it slightly, 512 puts it around the middle, 800+ takes it near the top.

CS 1.6 console showing graphheight 128 with net_graph placed low on the screen
graphheight 128 keeps net_graph close to the bottom-right corner
CS 1.6 console showing graphheight 256 with net_graph moved higher
graphheight 256 raises net_graph above the default lower position
CS 1.6 console showing graphheight 512 with net_graph placed near the middle-right area
graphheight 512 moves net_graph much higher on the screen
CS 1.6 console showing graphheight 800 with net_graph near the top of the screen
graphheight 800 and net_graphpos 2 places net_graph near the upper part of the screen

Those numbers are from example setup at 1920×1080, and graphheight works in pixels - so it scales with your screen height, not with the game window. Plenty of CS 1.6 players still run 1024×768, 800×600 or the best, in my opinion 640x480, and there the same value lands somewhere completely different. At 1024×768, for example, graphheight 800 would push the graph clean off the top of the screen. Treat the values above as a rough guide and adjust until it sits where you want it.

net_graphwidth stretches the graph area horizontally. This isn't a font-size setting - it changes how wide the whole block spreads, so at high values the line and numbers pull far apart, and at low values everything sits compact:

net_graphwidth "150"    // default
CS 1.6 console showing net_graphwidth 500 with net_graph placed on the right
net_graphwidth 500 and net_graphpos 1 (default) changes the width of the net_graph area
CS 1.6 console showing net_graphwidth 500 with net_graph placed on the left
net_graphwidth 500 and net_graphpos 3 changes the width of the net_graph area on the left side
CS 1.6 console showing net_graphwidth 1500 with a wider net_graph line
net_graphwidth 1500 and net_graphpos 1 (default) makes the net_graph line much wider
CS 1.6 console showing net_graphwidth 1500 and net_graph positioned on the left
net_graphwidth 1500 and net_graphpos 3 makes the net_graph line much wider on the left side

Set it to 1500 and the line stretches halfway across the screen. Set it to 500 and it stays tight. Which value works comes down to your resolution.

net_scale controls the vertical scale of the traffic graph - the one you only see on net_graph 2. Lower values stretch the graph out vertically so the spikes are taller and easier to read; higher values squash it flat. At net_scale 10 it gets small enough that it's hard to make anything out:

net_scale "5"    // default
CS 1.6 console showing net_scale 1 with a large net_graph chart marked by a red arrow
net_scale 1 makes the net_graph chart much taller and more visible
CS 1.6 console showing net_scale 3 with a medium-sized net_graph chart marked by a red arrow
net_scale 3 shows the net_graph chart at a moderate size
CS 1.6 console showing net_scale 5 with the net_graph chart marked by a red arrow
net_scale 5 is the default net_graph scale in CS 1.6
CS 1.6 console showing net_scale 10 with a small net_graph chart marked by a red arrow
net_scale 10 makes the net_graph chart appear more compressed

Since it only affects the graph itself, net_scale does nothing on net_graph 1 or 3 - those don't draw the traffic graph at all.

What I use:

net_graph "3"
net_graphpos "1"
net_graphwidth "150"
graphheight "64"
net_scale "5"

Put these in your userconfig.cfg and the graph will come up in the same spot every time.

Conclusion

The net_graph is the one command that tells you the truth about what's happening between you and the server. Not how the game feels - what's actually going on. You see your real updaterate, not the one in your config. You see if packets are being lost or just held back. And you see when a bad round was the server's fault - or your own settings.

When something feels off, look at the graph before you blame the server. loss: 0 choke: 0 with steady latency means net_graph shows no obvious loss or choke at that moment - a good sign, though not a full bill of health. It won't catch a short burst of loss that's already passed, jitter hiding behind a normal average ping, a route that only misbehaves now and then, or stutter coming from the server's frame times or your own machine. Choke climbing with loss at zero means check your rate first, then your updaterate. That one look takes two seconds and saves you from guessing.

Most of this comes back to your own config. The worst graph in this guide - high ping, choke at 67, packets swollen to 763 bytes - came from a healthy server. I broke it myself with two bad values. Fix your rates, keep net_graph on hand, and you'll spend a lot less time wondering why the game feels wrong.

net_graph in CS 1.6 FAQ

A glowing 'FAQ' displayed on a futuristic holographic panel, surrounded by floating question marks and digital circuitry within a cosmic, sci-fi environment
How do I turn on net_graph in CS 1.6?

Open the console with the tilde key (~) and type net_graph 1. The graph appears right away. To turn it off, type net_graph 0. If you want it on every time you play, add the command to your userconfig.cfg.

What's the difference between net_graph 1, 2 and 3?

All three turn the graph on, they just show different things. net_graph 1 gives you the text readout (fps, latency, updaterate, in/out traffic) with a small line underneath. net_graph 2 adds a larger traffic graph above the text. net_graph 3 drops the graph and shows loss and choke instead - which is the one you want when you're diagnosing a problem.

Why does the console show two different "100/s" values?

They're two halves of the same exchange. The 100/s on the fps line is your cl_updaterate - updates you're receiving from the server. The 100/s next to the small line at the bottom is your cl_cmdrate - commands you're sending to the server.

What is "choke" in net_graph?

Choke means the server is holding updates back - nothing is lost, it just can't send packets as fast as they're being requested. The two most common causes are in your own config: a rate set too low, or a cl_updaterate higher than the server can sustain. Check those first. Server-side limits, heavy load, or an unstable server can also cause it.

What's the difference between loss and choke?

Loss is packets that never arrived - dropped somewhere between you and the server, which could be your Wi-Fi, your ISP, the route, or the server's host. Choke is the server deferring packets it couldn't send in time. Loss means data is disappearing; choke means it's being held back.

What is a good net_graph reading?

loss: 0 choke: 0, latency low and steady, and your update count matching the cl_updaterate you set. If you asked for 100 and the graph shows 60, the server is only giving you 60.

What does net_scale do?

It sets the vertical scale of the traffic graph, so it only matters on net_graph 2 - that's the only mode that draws the graph. Default is 5. Lower values stretch the graph taller and make spikes easier to read; higher values flatten it. By net_scale 10 it's squashed enough to be hard to read.

How do I show net_graph only on the scoreboard?

Bind it to TAB with an alias, so the graph appears while you hold the scoreboard and disappears when you let go:

bind "TAB" "+ng"
alias "+ng" "+showscores; net_graph 3"
alias "-ng" "-showscores; net_graph 0"
How do I move net_graph on the screen?

net_graphpos moves it horizontally - 1 is right (default), 2 is center, 3 is left. graphheight moves it vertically, with 64 as the default; higher values push it up the screen. There's also net_graphwidth (default 150), which stretches the graph area horizontally.

What is net_graph in CS2?

CS2 replaced net_graph with the Telemetry system, which shows similar data in a different format. If you play both games, I've covered it here: CS2 Telemetry (Net Graph): How to Enable, Read and Fix Performance Issues.

Continue Reading

Counter-Strike 1.6 config illustration showing console with commands bind, rate, fps_max, and exec userconfig.cfg, styled on a Dust2-inspired background with HUD elements
Counter-Strike 1.6 Config Guide – Commands and Optimization

Counter-Strike 1.6 Config Guide – Commands and Optimization Table of Contents Introduction A Counter-Strike 1.6 config is simply a plain-text file with CS 1.6 config commands and settings that the game reads and applies. Instead of clicking through menus every time, you write the exact values you want – key

Read More
Leave a Reply

Your email address will not be published. Required fields are marked *