Netcode Explained
By TW3@K3R
Oh no you say, another netcode explained. Yes it is but it seems each one is different
and not all agree with the right settings.
I am doing this to show where the other guides are wrong, to prove why
the settings should be a certain way, and to let you the player learn and
figure this out for yourself. I am
also going to provide information to the server administrators. In the end they have the final say in how we
can set our settings. Between the client
and the server administrators we can produce almost perfect hit registration
that the internet will allow. There are several more settings that some think
to be very important I will not be covering these settings. I find it hard to test those other settings
and be able to come to a exact conclusion.
I have read many guides even old HL guides, which is where a lot of the
new hl2 guides got there information.
All of the information I have used is common knowledge. The information that isn’t common knowledge I
tested thoroughly with having access to a server and opening all settings so
nothing is forced. I also filled up the
server with a lot of action. Because
many of the things I discuss you won’t see in a empty server.
FPS - Frames
per Second.
fps_max -
Sets an upper limit on the frames per second the server or client runs at.
sv_maxrate -
The Maximum amount of data in Bytes per Second the Client can request from the
Server.
sv_minrate -
The Minimum amount of data in Bytes per Second the Client can request from the
Server.
sv_maxupdaterate - The Maximum amount of Updates per Second the Client can request from
the Server.
sv_maxupdaterate - The Minimum amount of Updates per Second the Client can request from
the Server.
sv_maxcmdrate
- The Maximum amount of Updates per Second the Client can send from the Server.
sv_mincmdrate
- The Minimum amount of Updates per Second the Client can send from the Server.
rate - The
Maximum amount of Bytes Per Second the Client will request from the server.
cl_updaterate
- The Maximum amount of Updates Per Second the Client will request from the
server.
cl_cmdrate -
The Maximum amount of Updates Per Second the Client will Send to the server.
updates – Packets
of information about what is going on in the game such as: player position,
explosions, everything that happens in the game. You receive updates from the server then you
send updates back with what is going on, on your side.
Ticrate –
This determines the most updates the server will be able to send and
receive. 100tic = 100updates, 66tic = 66
updates.
TICRATE
Let’s start with ticrate and work are way down. This is something that server administrators
and players should really understand.
The ticrate determines the most updates the server will be able to send
and receive. The highest ticrate a
server can be is 100, the lowest is 33, and the most common is 66. So if a server administrator and a player were
really thinking they would use these settings below:
|
Client
settings |
Server
administrators max settings |
|
cl_updaterate 100 |
sv_maxupdaterate 100 |
|
cl_cmdrate 100 |
sv_maxcmdrate 100 |
If the ticrate is ultimately going to determine what
the server and client send and receive for updates. There isn’t any reason not to set those settings
to the highest setting you can have.
With those settings above if the ticrate of the server is 66 tic. You would receive and send only 66 updates
(because the ticrate of the server is 66 even though your settings are 100). So why make it tough on figuring them out or
changing them according to ticrate.
Waste of time if you ask me. One
setting for all makes it easier. I didn’t put in the sv_minupdaterate or
sv_mincmdrate. That is because it would
be up to the server administrator for setting this. I feel it is preference. I would set the min values to 100 also but
again my opinion (explained later in my conclusion).
CL_UPDATERATE
I won’t spend too much time on updaterate since I
pretty much explained it above with ticrate.
Updaterate is determined on the client’s machine by sv_maxupdaterate,
sv_minupdaterate, ticrate and cl_updaterate.
Updaterate is the amount of updates you want the server to send you per
second. The server will send whatever you
want as long as there isn’t a rule telling it not to for example. If I set cl_updaterate 100 then the server
will send me 100 updates a second unless ticrate is less then 100 or
sv_maxupdaterate is set lower than 100 by server administrators(note if you
don’t have sv_maxupdaterate in your server config then default is 60). Other than those settings only choke and
loss will play a factor in how many updates you get from a server. This is explained later on.
CL_CMDRATE AND FPS
Let
me explain, probably the two most overlooked things that cause poor hit
registration. Besides seeing the actual
true position of the player you are aiming at.
What do you think needs to register correctly to actually hit that
person? What needs to register, is your shot, you know when you actually press
the mouse button to shoot. The amount of
updates you send the server is very important.
Since it tells the server that you shot your gun and where you shot at. These settings below control what you send
the server.
|
Client
side settings |
Server
side settings |
|
Cl_cmdrate |
Sv_mincmdrate |
|
Ticrate |
Sv_maxcmdrate |
|
FPS |
|
Earlier I said to set cl_cmdrate to 100 since you
will never be able to send more updates then the highest ticrate a server can
be which is 100. There is one thing that
will lower the amount of updates you send to the server no matter how high the
ticrate nor how high your cl_cmdrate.
That is your FPS. You can’t send
more updates to the server then what frames you actually render on your
end. So if you are in a 100 ticrate
server and you have cl_cmdrate 100, but your fps is only staying around 50 then
you only send 50 updates a second or whatever you fps during that second of
play. Seeing how fps is the end factor
on what updates you send the server on your shots fired and where you were aimed. I decided on another table to explain this.
|
|
Good hit
registration |
Bad hit
registration |
|
100 ticrate server |
100fps steady or higher |
Fluctuating fps under
100fps |
|
66 ticrate server |
66fps steady or higher |
Fluctuating fps under 66fps |
|
33 ticrate server |
33fps steady or higher |
Fluctuating fps under 33fps |
Good hit registration and Bad hit registration may
not be seen by some people, but having fluctuating fps under the ticrate of the
server can cause it even if you don’t see it.
If anything else the person with higher steady fps than the ticrate will
have an advantage over the low fps player.
So all those people that say you can play HL with low fps true you can
cause lag compensation will compensate for the updates you don’t receive and
make it feel like really smooth play.
But you’re going to have more times where you miss then a person pegging
at a higher fps.
RATE – The common cause of choke and
loss.
Rate
the biggest problem with server administrators and players. This setting is probably the main thing every
single netcode guide has got wrong. Why
is this? Most of the netcode guides came from old CS 1.6 players. Who already knew what settings worked in old
CS but didn’t realize they would ever need to set these settings higher. Even
Rate is merely a cap saying
don’t send more than 30000 bytes/second (I used 30000 as an example). Tell me this if you were downloading mp3’s
would you want to say don’t send me more than 30000 bytes/second which =
234kbits per second. I guess you would
if you had dsl because it is about that fast.
We spend so much money on fast download speeds yet in half life because
someone said put this setting in. This is the optimal setting you should use
and we believe it. I say don’t believe
them or me follow what they say and see if it works. Tests settings they said don’t use and see
what happens. Here is a breakdown of
common internet speeds that I converted into bytes.
|
Internet
speeds |
Converted
to bytes/what your rate could be set at |
|
Dsl 256kbits download |
32768 |
|
1mb |
131072 |
|
2mb |
262144 |
|
3mb |
393216 |
|
6mb |
786432 |
Obviously you don’t want to set your rate at 786432 lol. But I put that on there to show you how much your rate could be and you would still be able to handle the traffic. Because how many times have you heard 25000 is lan setting or 30000 is lan setting. That is funny I guess my 6mbit download speed is as fast a lan, lol, not. A lan setting could be as low as 10mbits for old lans and 1 GB for newer lans. So a rate setting of 1310720 would be a lan setting.
CHOKE AND LOSS
Choke and Loss can happen if this setting isn’t set correctly. Loss happens when your internet can’t handle the amount of bytes being sent that second or problems with hops between you and the server. I am not going to explain hops. But to control you loss and keep it to a minimum make sure your rate setting isn’t set higher than your download speed. It’s hard for me to test this since I have a 6mb connection.
Choke
happens when a rule set by you or the server administrator tells the server to
stop sending updates. So the server then
holds on too them tell it can send them.
I know who would say stop sending updates. You don’t actually say that to the
server. What happens is we set our rate
settings to low sometimes or the server forces us to a low rate setting. Here is an example I already used: You are
suppose to get 100 updates per second from the server each update is around 400
bytes. That is 40000 bytes per second
but you have your rate set to 30000 that means after you receive 75 updates you
won’t receive 25 updates that second. So
your choke will be 25. So to avoid this
in the example I just wrote you would have had to set your rate to 40000 and
you wouldn’t have choked at all.
Well that is easy enough so I set my rate setting
higher and my choke will be gone. Yes it
is that easy, but it isn’t so easy to make server administrators all across HL2
understand that there sv_maxrate setting is a big problem. In that same scenario you could set your rate
to 40000 and get rid of choke but if the server set sv_maxrate 30000(which I
bet 60-80% do) then you will still choke cause the server will force you to a
rate of 30000. So the only way to get
rate to work correctly we need the server administrator to change there
settings as well so we don’t choke.
Choke is like the one thing we can control and together it is possible
to rid most of these servers of choke.
Below are some rates for clients and some recommendations for server
administrators.
|
Internet
speed |
Rate
setting |
|
256kbit dsl |
32768 |
|
1mbit download speed or
higher |
100000 or higher if you choke |
|
Recommended
server settings |
|
sv_maxrate 100000 |
|
sv_minrate 20000 |
I would be very surprised if
anyone ever choked at rate 100000 that is why I picked that setting. If servers set that maxrate then we could get
rid of our own choke and we couldn’t blame the servers anymore.
NETGRAPH
Now that you got somewhat of an understanding of that
stuff. Here is a way to monitor
everything I have explained above with a tool so much of us don’t use. It is called net graph. It will tell you what your fps, ping, loss,
choke, how many updates you are actually receiving and sending, and how big
each update is. You can enable this
graph by pulling down console and typing net_graph 3. there is other types of net_graph but this
one has the important information we are looking for. You can also position it along the right,
center, or left on the bottom of the screen.
Just type net_graphpos 1(right), 2(center), 3(left). I use 1 it seems more out of my way.

1 = fps – what a that particular second your fps is.
2 = ping – not really true ping but close
3 = how big the packet size of the update you
just received and sent. In being what you
received, out being what you sent.
4 = How fast the information is going. Not real important.
5 = The top number is how many updates per second you are actually receiving (cl_updaterate or ticrate). The
bottom number is how many updates you are actually sending (cl_cmdrate, ticrate, or fps).
6 = number of packets that you sent that got lost or dropped.
7 = number of updates you didn’t receive from the server.
So now you can use this tool to
figure out what is happening on your end and see where you need to make
adjustments. With this picture you can
see no loss and no choke that is great.
Looking at section 5 tells us that we are playing in a 100 tic server
since we are receiving 102.4/s. But the
problem is that we are only sending 78.6/s.
We should be sending around 100 updates to the server as well. Well the problem is that we are not getting
100fps look at area 1 we are only getting 79fps which is right about what our
updates we are sending is. So according
to this graph we would get pretty decent hit registry but to achieve the best
hit registry we would need fps to go up and stay at 100fps. So we are sending and receiving the most
updates the server will allow.
Let’s take this same graph and
imagine we are in a 66 tic server. With
fps at 79 which is above 66 both the numbers in area 5 would read around 66
steady all the time unless fps dropped under 66 or we started to
choke/loss. I hope you get the idea on
how we can use this and understand how to tell what tic the server you are in
is. Plus understand how fps dropping can
cause poor hit registry
EXTRA
INFORMTION FOR TESTING THIS
Here are some key things you
should know before going out and testing these you’re self. One server’s most of the time force settings
lower than what you might want to set them at.
To see what your setting is for any of the client commands simply pull
down console and type the command with nothing after it and hit enter. If your setting is under the forced setting
then you will see what your setting is set at.
If your setting is higher than what the server is forcing you will see
something in red saying your setting is this but the server temporarily is
setting it to something. You will see
this a lot with rate setting so when you set rate 100000 go into the server and
type rate and hit enter you will see almost 80% of all servers will force it to
30000.
Second you will see this in a
lot of 66tic servers and above. The
administrator doesn’t put a sv_maxupdaterate in the server.cfg thinking that it
will open it up and can be however high you want it. It in fact defaults to 60. So in a 66 tic server or above if you see in
area 5 the top number stuck at 60 this is something that is the problem the
server administrator did. By not putting
sv_maxupdaterate 66 or 100 in the server.cfg. Well maybe valves fault for not making
default higher.
CONCLUSION
So
with all the information I gave on how to adjust your settings, what the
settings mean and how they all work together.
I hope you come to the same conclusion as I did on what settings to
have. Below is what I set my settings at
and what servers administrators should set them. So that we can all have really good hit
registration as well as little to no choke.
|
Clients
settings |
Server
Settings |
|
rate
70000-100000 |
sv_maxrate
100000 |
|
cl_updaterate
100 |
sv_maxupdaterate
100 |
|
|
sv_minupdaterate
30-100 |
|
cl_cmdrate
100 |
sv_maxcmdrate
100 |
|
|
sv_mincmdrate
30-100 |
If
the client and the server are setup like this the only thing that will affect
persons hit registration will be there FPS and Loss. This is something the server administrator
can’t help with. FPS is basically
revolves around you having a good video card and good cpu. Loss is usually caused by slow download
speeds if you have a dsl 256kbit line try finding an ISP that offers 1mbit or
higher. You could also lower your rate
setting to fix loss in the end you might end up choking. If you have a slow download speed and you
lower your rate down tell the loss is gone.
You could then lower cl_updaterate until your choke is gone. This is only if you have slow ISP and can’t
do what I explained in this article.